简介
二进制日志是MySQL服务器用来记录数据修改事件的,比如INSERT、UPDATE、DELETE等会导致数据发生变化的语句,SELECT语句不会被记录在内。MySQL必须先执行完一条语句才能知道它是否修改了数据,因此写入二进制日志文件的时间是语句执行完成的时间。写入顺序是按语句执行完成的先后顺序,事务中的语句会先被缓存起来,成功提交后才会被写入,回滚则不会被写入。非事务的存储引擎,所有的修改会立刻写入到二进制日志中。
二进制日志顾名思义不是文本而是一种更有效率的二进制格式,它比文本占用更少的空间,但是可读性就很差了,必须使用mysqlbinlog工具才能转换为可读的文本。二进制日志主要用于数据库备份和故障时恢复数据,配置MySQL主从复制必须启用二进制日志。
二进制日志索引文件中会列出所有二进制日志文件,此文件是文本的因此可以直接查看,文件的最后一行就是当前正在使用的二进制日志文件。
启用和关闭
show variables like 'log_bin' 可以查看当前数据库是否已经启用了二进制日志,ON表示启用,OFF表示未启用。show variables like 'log_bin_basename' 返回二进制日志基本文件名,show variables like 'log_bin_index' 返回二进制日志索引文件名。
在MySQL配置文件中,[mysqld]下配置 log_bin 即可开启二进制日志,此时默认使用HOSTNAME-bin作为二进制日志的基本文件名,基本文件名加上一组顺序编号000001、000002...就是二进制日志文件名了,例如localhost-bin.000001。每次启动服务器、执行刷新日志命令(flush logs)以及二进制日志文件到达最大长度的时候,服务器会按顺序号生成下一个二进制日志文件,参数max_binlog_size决定了二进制日志最大长度。log_bin=xx指定了二进制日志基本文件名为xx。默认二进制日志索引文件名是二进制日志基本文件名加上.index,参数 log_bin_index可以指定二进制日志索引文件名,如果指定值没有扩展名,默认会加.index。
关闭二进制日志只要删除相应配置即可。flush logs会关闭当前二进制日志文件并重新创建一个。
格式
二进制日志的格式有STATEMENT、ROW、MIXED,参数binlog_format 决定了使用何种格式。
STATEMENT表示基于语句的格式,就是记录执行的语句,优点是减少了日志量,但是还必须记录执行语句时相关上下文信息,这很容易导致主从复制时语句执行出错。
ROW表示基于行的格式,优点是不用再记录执行语句时的上下文,缺点是增加了记录量,每一条被修改过的行都要被记录,本来只要记录执行时的update语句,现在要记录所有被修改的行的update语句。
MIXED是以上两种混合使用,由MySQL决定何时使用哪一种。
查看
使用mysqlbinlog工具,这个工具一般在MySQL安装目录的bin目录下。执行如下语句
mysqlbinlog -vv --base64-output=decode-rows localhost-bin.000001,也可以重定向到外部文件中 mysqlbinlog -vv --base64-output=decode-rows localhost-bin.000001 >000001.txt。