这是第十四次ㄚ琪自我练习的结果,也即将是最后一次的练习,因为明日就要上阵测试认证了,挥别炎热的考季就看这次了,这一次的测试50题,答对45题得90分,错5题扣5分,总计得分85分,跟上次一样,通过认证没问题,要成为资料库应用的高手,指日可下。好了,闲话太多了,回到主题吧,这一回错的题目好像比较不一样了,粗心的成份看起来不多,让我们好好研究研究吧。
[adsense][/adsense]
这是MySQL 5实力养成暨评量里的3-93.‘假设资料表格book(id,name,author,price),请问下列各项SQL叙述,哪些是合法的?’
答案:
(A) select * from book where price between 300 and 500 order by price;
(C) insert into book values(“B004″,”MySQL5″,”CSF”,350);
(D) delete from book where name = “%mysql%”;
(A)、(C)没问题,(D)则是头一遭,因为以前会删除like “%mysql%”这样的用法,没有用过= “%mysql%”这样子,当然这个指令经过测试是没错的,但是我猜应该很少使用吧。
这是MySQL 5实力养成暨评量里的9-21.‘请参阅附图作答
当使用InnoDB资料表且MySQL伺服器处理一个COMMIT叙述时,MySQL会先写入整笔交易到binary log,然后才会提交资料到InnoDB资料表,若正好在此两个动作中间发生当机事件,会造成binary log仍会写入该笔纪录,但InnoDB会作回复(Roll back)动作,造成了binary log与实际资料不同不的现象,若要解决此现象,可在执行参数中加入下列哪一个参数,便可避免此问题?’
答案:(A) –innodb-safe-binlog
好了,这一个选项也是很诡异的,特别是查考手册之后发现5.0.3版之后这个就反对使用了,在MySQL 5.0 Reference Manual :: 5 MySQL Server Administration :: 5.1 The MySQL Server :: 5.1.3 Server Command Optionsu有讲述这个选项:
| Deprecated | 5.0.3 | ||
| Removed | 5.0.3 | ||
| Command-Line Format | --innodb-safe-binlog |
||
| Option-File Format | innodb-safe-binlog |
||
| Permitted Values | |||
| Type | boolean |
||
If this option is given, then after a crash recovery by InnoDB, mysqld truncates the binary log after the last not-rolled-back transaction in the log. The option also causes InnoDB to print an error if the binary log is smaller or shorter than it should be. See Section 5.2.3, “The Binary Log”. This option was removed in MySQL 5.0.3, having been made obsolete by the introduction of XA transaction support.
简体中文的MySQL 5.1参考手册 :: 5. 数据库管理::5.11. MySQL日志文件::5.11.3. 二进制日志也有提到。
我们把这一节转成繁体给各位好好学习一下:
二进制日志以一种更有效的格式,并且是交易安全的方式包含更新日志中可用的所有讯息。
二进制日志包含了所有更新了资料者已经潜在更新了资料(例如,没有匹配任何行的一个DELETE)的所有叙述。叙述以“事件”的形式保存,它描述资料更改。
注释:二进制日志已经代替了老的更新日志,更新日志在MySQL 5.1中不再使用。
二进制日志还包含关于每个更新资料库的叙述的执行时间讯息。它不包含没有修改任何资料的叙述。如果您想要记录所有叙述(例如,为了识别有问题的查询),您应使用一般查询日志。参见5.11.2节,“通用查询日志”。
二进制日志的主要目的是在恢复使能够最大可能地更新资料库,因为二进制日志包含备份后进行的所有更新。
二进制日志还用于在主复制伺服器上记录所有将发送给从伺服器的叙述。参见第6章:MySQL中的复制。
运行伺服器时若启用二进制日志则性能大约慢1%。但是,二进制日志的好处,即用于恢复并允许设置复制超过了这个小小的性能损失。
当用–log-bin[=file_name]选项启动时,mysqld写入包含所有更新资料的SQL命令的日志档案。如果未给出file_name值, 预设名为-bin后面所跟的主机名。如果给出了档案名,但没有包含路径,则档案被写入资料目录。建议指定一个档案名,原因参见A.8.1节,“MySQL中的打开事宜”。
如果您在日志名中提供了延伸名(例如,–log-bin=file_name.extension),则延伸名被悄悄除掉并忽略。
mysqld在每个二进制日志名后面新增一个数字延伸名。每次您启动伺服器或刷新日志时该数字则增加。如果当前的日志大小达到max_binlog_size,还会自动建立新的二进制日志。如果您正使用大的交易,二进制日志还会超过max_binlog_size:交易全写入一个二进制日志中,绝对不要写入不同的二进制日志中。
为了能够知道还使用了哪个不同的二进制日志档案,mysqld还建立一个二进制日志索引档案,包含所有使用的二进制日志档案的档案名。预设情况下与二进制日志档案的档案名相同,延伸名为’.index’。您可以用–log-bin-index[=file_name]选项更改二进制日志索引档案的档案名。当mysqld在运行时,不应手动编辑该档案;如果这样做将会使mysqld变得混乱。
可以用RESET MASTER语句删除所有二进制日志档案,或用PURGE MASTER LOGS只删除部分二进制档案。参见13.5.5.5节,“RESET语法”和13.6.1节,“用于控制主伺服器的SQL语句”。
二进制日志格式有一些已知限制,会影响从备份恢复。参见6.7节,“复制特性和已知问题”。
保存程式和触发器的二进制日志的描述参见20.4节,“储存子程式和触发程式的二进制日志功能”。
可以使用下面的mysqld选项来影响记录到二进制日志知的内容。又见选项后面的讨论。
· –binlog-do-db=db_name
告诉主伺服器,如果当前的资料库(即USE选定的资料库)是db_name,应将更新记录到二进制日志中。其它所有没有明显指定的资料库 被忽略。如果使用该选项,您应确保只对当前的资料库进行更新。
对于CREATE DATABASE、ALTER DATABASE和DROP DATABASE语句,有一个例外,即通过操作的资料库来决定是否应记录叙述,而不是用当前的资料库。
一个不能按照期望执行的例子:如果用binlog-do-db=sales启动伺服器,并且执行USE prices; UPDATE sales.january SET amount=amount+1000;,该叙述不写入二进制日志。
· –binlog-ignore-db=db_name
告诉主伺服器,如果当前的资料库(即USE选定的资料库)是db_name,不应将更新保存到二进制日志中。如果您使用该选项,您应确保只对当前的资料库进行更新。
一个不能按照您期望的执行的例子:如果伺服器用binlog-ignore-db=sales启动,并且执行USE prices; UPDATE sales.january SET amount=amount+1000;,该语句不写入二进制日志。
类似于–binlog-do-db,对于CREATE DATABASE、ALTER DATABASE和DROP DATABASE叙述,有一个例外,即通过操作的资料库来决定是否应记录叙述,而不是用当前的资料库。
要想记录或忽视多个资料库,使用多个选项,为每个资料库指定相应的选项。
伺服器根据下面的规则对选项进行评估,以便将更新记录到二进制日志中或忽视。请注意对于CREATE/ALTER/DROP DATABASE叙述有一个例外。在这些情况下,根据以下规则,所建立、修改或删除的资料库将代替当前的资料库。
1. 是否有binlog-do-db或binlog-ignore-db规则?
· 没有:将叙述写入二进制日志并退出。
· 有:执行下一步。
2. 有一些规则(binlog-do-db或binlog-ignore-db或二者都有)。当前有一个资料库(USE是否选择了资料库?)?
· 没有:不要写入叙述,并退出。
· 有:执行下一步。
3. 有当前的资料库。是否有binlog-do-db规则?
· 有:当前的资料库是否匹配binlog-do-db规则?
o 有:写入叙述并退出。
o 没有:不要写入叙述,退出。
· No:执行下一步。
4. 有一些binlog-ignore-db规则。当前的资料库是否匹配binlog-ignore-db规则?
· 有:不要写入叙述,并退出。
· 没有:写入查询并退出。
例如,只用binlog-do-db=sales运行的伺服器不将当前资料库不为sales的叙述写入二进制日志(换句话说,binlog-do-db有时可以资料表示“忽视其它资料库”)。
如果您正进行复制,应确保没有从伺服器在使用旧的二进制日志档案,方可删除它们。一种方法是每天一次执行mysqladmin flush-logs并删除三天前的所有日志。可以手动删除,或最好使用PURGE MASTER LOGS(参见13.6.1节,“用于控制主伺服器的SQL语句”),该叙述还会安全地更新二进制日志索引档案(可以采用日期参数)。
具有SUPER权限的客户端可以通过SET SQL_LOG_BIN=0叙述禁止将自己的叙述记入二进制记录。参见13.5.3节,“SET语法”。
您可以用mysqlbinlog实用工具检查二进制日志档案。如果您想要重新处理日志止的叙述,这很有用。例如,可以从二进制日志更新MySQL伺服器,方法如下:
shell> mysqlbinlog log-file | mysql -h server_name
关于mysqlbinlog实用工具的详细讯息以及如何使用它,参见8.6节,“mysqlbinlog:用于处理二进制日志档案的实用工具”。
如果您正使用交易,必须使用MySQL二进制日志进行备份,而不能使用旧的更新日志。
查询结束后、锁定被释放前或提交完成后则立即记入二进制日志。这样可以确保按执行顺序记入日志。
对非交易资料表的更新执行完毕后立即保存到二进制日志中。对于交易资料表,例如BDB或InnoDB资料表,所有更改资料表的更新(UPDATE、DELETE或INSERT) 被缓存起来,直到伺服器接收到COMMIT叙述。在该点,执行完COMMIT之前,mysqld将整个交易写入二进制日志。当处理交易的线程启动时,它为缓冲查询分配binlog_cache_size大小的内存。如果语句大于该值,线程则打开临时档案来保存交易。线程结束后临时档案被删除。
Binlog_cache_use状态变数显示了使用该缓冲区(也可能是临时档案)保存语句的交易的数量。Binlog_cache_disk_use状态变数显示了这些交易中实际上有多少必须使用临时档案。这两个变数可以用于将binlog_cache_size调节到足够大的值,以避免使用临时档案。
max_binlog_cache_size(预设4GB)可以用来限制用来缓存多叙述交易的缓冲区总大小。如果某个交易大于该值,将会失败并 回复。
如果您正使用更新日志或二进制日志,当使用CREATE … SELECT or INSERT … SELECT时,并行插入被转换为普通插入。这样通过在备份时使用日志可以确保重新建立资料表的备份。
请注意MySQL 5.1值的二进制日志格式与以前版本的MySQL不同,因为复制改进了。参见6.5节,“不同MySQL版本之间的复制相容性”。
预设情况下,并不是每次写入时都将二进制日志与硬盘同步。因此如果作业系统或机器(不仅仅是MySQL伺服器)当机,有可能二进制日志中最后的叙述丢失了。要想防止这种情况,您可以使用sync_binlog全局变数(1是最安全的值,但也是最慢的),使二进制日志在每N次二进制日志写入后与硬盘同步。参见5.3.3节,“伺服器系统变数”。即使sync_binlog设置为1,出现当机时,也有可能资料表内容和二进制日志内容之间存在不一致性。例如,如果使用InnoDB资料表,MySQL伺服器处理COMMIT叙述,它将整笔交易写入二进制日志并将交易提交到InnoDB中。如果在两次操作之间出现当机事件,重启时,交易被InnoDB回复,但仍然存在二进制日志中。可以用–innodb-safe-binlog选项解决该问题,可以增加InnoDB资料表内容和二进制日志之间的一致性。(注释:在MySQL 5.1中不需要–innodb-safe-binlog;由于引入了XA事务支援,该选项作废了)。
该选项可以提供更大程度的安全,还应对MySQL伺服器进行配置,使每个交易的二进制日志(sync_binlog =1)和(预设情况为真)InnoDB日志与硬盘同步。该选项的效果是当机后重启时,在回复交易后,MySQL伺服器从二进制日志剪切回复的InnoDB交易。这样可以确保二进制日志反馈InnoDB资料表的确切资料等,并使从伺服器保持与主伺服器保持同步(不接收 回复的叙述)。
请注意即使MySQL伺服器更新其它储存引擎而不是InnoDB,也可以使用–innodb-safe-binlog。在InnoDB当机恢复时,只从二进制日志中删除影响InnoDB资料表的叙述/交易。如果当机恢复时MySQL伺服器发现二进制日志变短了(即至少缺少一个成功提交的InnoDB交易),如果sync_binlog =1并且硬盘/档案系统的确能根据需要进行同步(有些不需要)则不会发生,则输出错误消息 (“二进制日志<名>比期望的要小”)。在这种情况下,二进制日志不准确,复制应从主伺服器的资料快照开始。
写入二进制日志档案和二进制日志索引档案的方法与写入MyISAM资料表相同。参见A.4.3节,“MySQL处理磁盘满的方式”。
这是MySQL 5实力养成暨评量里的5-01.‘在运算式中,COALESCE函式可传回资料中第一个非NULL的值,试问执行SELECT COALESCE(NULL,1,2,3);结果为何?’
答案:(B) 1
请参阅MySQL ISNULL,这一题如果仔细看的法应该是有解的。
这是MySQL 5实力养成暨评量里的3-97.‘SQL语法中,UPDATE指令通常会搭配哪一个关键字使用?’
答案:(C) WHERE
在鬼月错这样的题目,真可说是鬼迷了心窍了,无语~
这是MySQL 5实力养成暨评量里的4-26.‘新增整数数值型态的栏位时,若指定栏位位数,例如:INT(5),此种型态,当新增数值的资料数超过五位时,但仍在INT的范围内,此时有何作用?’
答案:(D) 没有影响,仍写入原值
再列一次连结MySQL 数值型态可以帮助大家了解这种题型的解题。





