当前位置:嗨网首页>书籍在线阅读

04-日志的位置和格式

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

当用--log-bin[=file_name]选项启动时,mysqld开始将数据变更情况写入日志文件。如果没有给出 file_name 值,默认名为主机名后面跟“-bin”。如果给出了文件名,但没有包含路径,则文件默认被写入参数DATADIR(数据目录)指定的目录。

MySQL 5.5中,二进制日志的格式分为 3种:STATEMENT、ROW、MIXED,可以在启动时通过参数-- binlog_format进行设置,这 3种格式的区别如下。

1.STATEMENT

MySQL 5.1之前的版本都采用这种方式,顾名思义,日志中记录的都是语句(statement),每一条对数据造成修改的SQL语句都会记录在日志中,通过mysqlbinlog工具,可以清晰地看到每条语句的文本。主从复制的时候,从库(slave)会将日志解析为原文本,并在从库重新执行一次。这种格式的优点是日志记录清晰易读、日志量少,对I/O影响较小。缺点是在某些情况下slave的日志复制会出错。

2.ROW

MySQL 5.1.11之后,出现了这种新的日志格式。它将每一行的变更记录到日志中,而不是记录SQL语句。比如一个简单的更新SQL:update emp set name='abc',如果是STATEMENT格式,日志中会记录一行SQL文本;如果是ROW,由于是对全表进行更新,也就是每一行记录都会发生变更,如果是一个100万行的大表,则日志中会记录100万条记录的变化情况。日志量大大增加。这种格式的优点是会记录每一行数据的变化细节,不会出现某些情况下无法复制的情况。缺点是日志量大,对I/O影响较大。

3.MIXED

这是目前MySQL默认的日志格式,即混合了STATEMENT和ROW两种日志。默认情况下采用STATEMENT,但在一些特殊情况下采用ROW来进行记录,比如采用NDB存储引擎,此时对表的DML语句全部采用ROW;客户端使用了临时表;客户端采用了不确定函数,比如current_user()等,因为这种不确定函数在主从中得到的值可能不同,导致主从数据产生不一致。MIXED格式能尽量利用两种模式的优点,而避开它们的缺点。

注意:可以在global和session级别对binlog_format 进行日志格式的设置,但一定要谨慎操作,确保从库的复制能够正常进行。