文章目录
1、二进制日志概述
1.1、内容
- 二进制日志包含了所有更新了数据或已经潜在更新了数据的语句及执行时间。语句以“事件”(event)的形式保存,它描述了数据的更改信息。
- 二进制日志不包含没有修改任何数据的语句。如果想要记录所有的语句(例如,为了识别有问题的查询),应该使用通用日志。
1.2、作用
- 用于恢复数据:二进制日志的主要目的是恢复数据,因为二进制日志包含备份后进行的所有更新。
- 用于复制数据:二进制日志还用于在主复制服务器上记录所有将要发送给从服务器的语句。
1.3、文件位置
- 文件名:如果未给出二进制日志的文件名,那么默认名为主机名-bin。
- 目录:如果给出了文件名,但没有包含路径,那么文件将被写入数据目录。
- 建议最好指定一个文件名,语句如下:log-bin =/path/to/logmysql-bin
- 二进制日志会以在二进制日志名的后面添加一个数字扩展名的方式不断创建新文件,创建新文件有两个时机:时机一、服务器启动或刷新日志时;时机二、当前的日志大小达到了max_binlog_size参数设置的值,那么mysqld会自动创建新的二进制日志。
1.4、日志索引文件
mysqld还将创建一个二进制日志索引文件,其中包含了所有使用二进制日志文件的文件名。默认情况下该索引文件与二进制日志文件的文件名相同,扩展名为“.index”。当mysqld正在运行时,不可手动编辑该文件,这样做可能会使mysqld发生异常。
2、二进制日志相关命令
- 列出所有二进制日志:
SHOW BINARY LOGS
- 删除所有二进制日志:
RESET MASTER
- 临时禁止语句写入二进制日志:具有SUPER权限的客户端可以通过SET sql_log_bin=0语句禁止将自己的语句记入二进制记录中。这在某些情况下很有用,比如进行数据库的主主切换时,再或者进行数据库的版本升级时。
- 删除部分二进制日志:可以用PURGE BINARY LOGS命令只删除部分二进制文件。如下的例子将删除历史二进制日志,一直到mysql -bin.000005这个文件为止。
PURGE BINARY LOGS TO 'mysql-bin.000005';
- 用mysqlbinlog工具查看二进制日志:
shell> mysqlbinlog log-file
- 用二进制日志更新数据库:可以用mysqlbinlog工具检查二进制日志文件。如果想要重新处理日志上的语句,那么这个工具将会很有用。例如,可以用二进制日志更新MySQL数据库,方法如下:
shell> mysqlbinlog log-file | mysql -h host -P port
3、二进制日志的格式
3.1、语句级(binlog_format=statement)
基于语句级的日志记录里包含了原始执行的SQL语句(这会让DBA的维护更方便),还有其他信息,如执行语句的线程ID,语句执行时的时间戳,执行所耗时长等。
3.2、行级(binlog_format=row)
- 行级日志记录了行的更改信息而不是原始的SQL语句,通过mysqlbinlog会看到行级二进制日志都是一些经过base-64编码的信息。
- 一般而言,行级日志更健壮,而语句级的日志如果应用了MySQL的一些额外特性,比如存储过程、触发器,则可能会导致复制异常。所以,如果使用的是语句级的复制,那么请务必保持数据库应用的简单性,只用到基本的核心特性即可。
- mysqlbinlog加参数-verbose(或-v),将会生成带注释的语句,如果连续两次使用这个参数(如-v–v),则会生成字段的类型、长度、是否为NULL等属性信息。
3.3、混合级(binlog_format=mixed)
- 混合级日志在一般情况下将使用语句级记录日志,但在一些特殊情况下会临时更改为行级记录的形式,以便得到更健壮的复制特性。
- 建议将记录命令的形式设置为混合模式。
4、二进制日志的解析
如下是使用mysqlbinlog对二进制日志的解析示例:
#at 141
:事件的起始点。#1003099:28:36 server id 123 end_log_pos 245
:语句执行的时间,对于复制,这个时间会传输到从库。server id是产生这个事件的MySQL实例的server id参数值。end_log_pos指下一个事件的开始点,其实也就是这个事件的终点+1。Query thread_id=3350 exec_time=11 error_code=0
:thread_id指执行这个SQL的线程id。exec_time在主从库中有不同的含义,在主库中,等于执行这个事件所花费的时间;在从库中,等于这个事件结束执行的时间点减去在主库上开始执行的时间点,这个差异可以表征主从之间的滞后程度。error_code为错误状态,等于0时表示状态正常。