作为 MySQL 服务器层日志,MySQL binlog 按照事务提交的顺序,记录了所有事件,用户可以通过它完成 point_in_time 的恢复工作,并且 MySQL 的复制也需要它。
默认情况下,binlog 是关闭的,如果要开启,则要在 MySQL 的配置文件中加入:
log-bin=dir/filename // 该配置项开启 binlog 功能,并且指定日志文件存放的路径及文件名。修改之后要重启 MySQL 服务器。
可以使用 SHOW VARIABLES LIKE ‘log_bin’; 来查看是否开启了 binlog 。
MySQL 可以以不同的格式来记录主库上成功执行了的事件,不同的格式的 binlog 又会影响 MySQL 的复制。
##1. STATEMENT 格式
这种格式是 MySQL 中最早支持的 binlog 格式,这种格式的 binlog 记录的是执行过的 SQL 语句。备库在重放这种格式的 binlog 时,实际上就是把 SQL 语句重新执行一遍(Replication)。
这种格式的 binlog 结构更加紧凑,而且日志文件也小得多。但是基于这种日志的复制会遇到很多问题,比如遇到一些非确定事件(比如使用了 uuid()、rand() 等函数,以及触发器等),不能保证主备一致性。注意,触发器、函数、存储过程都会在从库相应地执行一遍,因此从库也要有它们的定义。
##2. ROW 格式
这种格式的 binlog 记录的是对行所做的实际修改,是实际的数据。备库上不再是通过执行 SQL 语句,而是以一种观察不到的方式来重放事件。同时,基于 ROW格式的复制,对数据的 INSERT 、UPDATE 、DELETE 所需要的锁也更少,因此,并发性比基于 STATEMENT 格式的复制要好。
并且没有非确定性事件的不一致问题,这是因为,触发器、函数、存储过程都只在主库上进行,然后把更改情况记录到 binlog。
但是,ROW 格式的 binlog 缺点也很明显,相比于 STATEMENT 格式的 binlog ,它记录的数据量会更多,比如一条 UPDATE 语句,STATEMENT 格式的 binlog 只会记录一条 SQL ,而 ROW 格式的 binlog 会记录下所有受影响行的修改情况。因此,使用 binlog 进行数据备份和恢复时,会需要更多的时间。
##3. MIXED 格式
MIX 格式实际上是上面两种格式的混合版,这种格式下,MySQL 在大多数情况下采用 STATEMENT 格式记录事件,当发现语句无法被正确地复制时,就切换到 ROW 格式。
可以通过 SHOW VARIABLES LIKE ‘binlog_format’; 和 SET SESSION BINLOG_FORMAT = xxx 来查看和设置二进制格式。(注意 BINLOG_FORMAT 是会话级别变量,因此修改只在当前会话有效)
通常情况下,应该将日志格式设置为 ROW ,这可以为数据库的恢复和复制带来更高的可靠性。不过值得注意的是,ROW 格式的 binlog 通常更大,因此占用更大的磁盘空间,而且复制时,传送 binlog 时的网络开销也将更大。
max_binlog_size
指定单个 binlog 文件大小的最大值,如果超过该值,则生成新的日志文件,后缀名+1,并记录到 日志名 .index 文件。
binlog_cache_size
未提交事务的 binlog 内容会写入到操作系统的缓冲区中,事务提交后再将其的 binlog 内容刷到 binlog 文件中。该值就为这个缓冲区的大小。
sync_binlog
默认为0,每次只写入操作系统的缓冲,并不进行 fsync ,由文件系统来决定什么时候 fsync 到磁盘。为 N(非0) 代表每写多少次缓冲就同步到磁盘。
如果为1,表示以同步的方式写入磁盘,即每次直接将 binlog 写入磁盘,不再经过操作系统缓冲,如果要进行复制工作,建议将该值设置为1,来得到高可用性,虽然这样会对数据库的 IO 操作带来一定的影响。
binlog_do_db
表示将记录哪些库的 binlog
binglog_ignore_db
表示将忽略哪些库的 binlog
log_slave_update
对于从库而言,为 on 则表示将从主库获取并重放了的 binlog 也写入到自己的 binlog 中去。当从库需要作为主库时,该参数应为 on 。
binlog_format
binlog 格式
binlog_row_image
当日志格式为 ROW 时,设置 binlog_row_image 来控制日志的行为。可设置的值为 full | minimal | nolob 。full 代表记录所有列的更改情况, minimal 代表只记录修改过的列,nolob 代表记录除了 BLOB和 TEXT之外的所有列,默认为 full 。
#查看二进制文件
二进制文件因为文件格式是二进制,因此不能用查看文本的方式来查看。可以通过 MySQL 提供的 mysqlbinlog 程序可以查看 binlog 。
执行指令:
mysqlbinlog 日志文件路径
如:
C:\Myenv\mysql\bin>mysqlbinlog …/Data/mysql.000001
对于 STATEMENT 格式的二进制文件,使用该命令后,看到的是执行的 SQL 以及一些其他的信息。
而对于 ROW 格式的二进制文件,需要在 mysqlbinlog 命令上加上选项 -vv ,将会看到对记录的实际更改,有时只改了一行的一个字段,却会记录该行所有字段的更改情况,可以看出 ROW 格式的 binlog 为什么很大了。
还有一种方法更为直观地显示 binlog 里面记录的事件:
SHOW BINLOG EVENTS IN ‘mysql-bin.000001’;