MySQL 二进制日志

作为 MySQL服务器层日志,MySQL二进制日志按照事务提交的顺序,记录了所有事件,用户可以通过它完成 point_in_time 的恢复工作,并且 MySQL的复制也需要它。

默认情况下,二进制日志是关闭的,如果要开启,则要在 MySQL的配置文件中加入:

log-bin=dir/filename  //  该配置项开启二进制日志功能,并且指定日志文件存放的路径及文件名。修改之后要重启 MySQL服务器。

可以使用 SHOW VARIABLES LIKE ‘log_bin’; 来查看是否开启了二进制日志。

二进制日志的格式

MySQL 可以以不同的格式来记录主库上成功执行了的事件,不同的格式的二进制日志又会影响 MySQL 的复制。

1.STATEMENT格式

这种格式是 MySQL中最早支持的 二进制日志格式,这种格式的二进制日志记录的是执行过的 SQL语句。备库在重放这种格式的二进制日志时,实际上就是把 SQL语句重新执行一遍(Replication)。

这种格式的二进制日志结构更加紧凑,而且日志文件也小得多。但是基于这种日志的复制会遇到很多问题,比如遇到一些非确定事件(比如使用了 uuid()、rand() 等函数,以及触发器等),不能保证主备一致性。注意,触发器、函数、存储过程都会在从库相应地执行一遍,因此从库也要有它们的定义。

2.ROW格式

这种格式的二进制日志记录的是对行所做的实际修改,是实际的数据。备库上不再是通过执行 SQL 语句,而是以一种观察不到的方式来重放事件。同时,基于 ROW格式的复制,对数据的 INSERT、UPDATE、DELETE 所需要的锁也更少,因此,并发性比基于 STATEMENT格式的复制要好。

并且没有非确定性事件的不一致问题,这是因为,触发器、函数、存储过程都只在主库上进行,然后把更改情况记录到二进制日志。

但是,ROW格式的二进制日志缺点也很明显,相比于 STATEMENT格式的二进制日志,它记录的数据量会更多,比如一条 UPDATE 语句,STATEMENT格式的二进制日志只会记录一条 SQL,而 ROW格式的二进制日志会记录下所有受影响行的修改情况。因此,使用二进制日志进行数据备份和恢复时,会需要更多的时间。

3.MIXED格式

MIX格式实际上是上面两种格式的混合版,这种格式下,MySQL在大多数情况下采用 STATEMENT格式记录事件,当发现语句无法被正确地复制时,就切换到 ROW格式。

可以通过 SHOW VARIABLES LIKE ‘binlog_format’; 和 SET SESSION BINLOG_FORMAT = xxx 来查看和设置二进制格式。(注意 BINLOG_FORMAT 是会话级别变量,因此修改只在当前会话有效)

扫描二维码关注公众号,回复: 1764170 查看本文章

通常情况下,应该将日志格式设置为 ROW,这可以为数据库的恢复和复制带来更高的可靠性。不过值得注意的是,ROW格式的二进制日志通常更大,因此占用更大的磁盘空间,而且复制时,传送二进制日志时的网络开销也将更大。

相关配置

1.max_binlog_size
指定单个二进制日志文件大小的最大值,如果超过该值,则生成新的日志文件,后缀名+1,并记录到 日志名.index 文件。

2.binlog_cache_size
未提交事务的二进制日志内容会写入到操作系统的缓冲区中,事务提交后再将其的二进制日志内容刷到二进制日志文件中。该值就为这个缓冲区的大小。

3.sync_binlog
默认为0,每次只写入操作系统的缓冲,并不进行 fsync,由文件系统来决定什么时候 fsync 到磁盘。为 N(非0) 代表每写多少次缓冲就同步到磁盘。
如果为1,表示以同步的方式写入磁盘,即每次直接将二进制日志写入磁盘,不再经过操作系统缓冲,如果要进行复制工作,建议将该值设置为1,来得到高可用性,虽然这样会对数据库的 IO操作带来一定的影响。

4.binlog_do_db
表示将记录哪些库的二进制日志

5.binglog_ignore_db
表示将忽略哪些库的二进制日志

6.log_slave_update
对于从库而言,为 on 则表示将从主库获取并重放了的二进制日志也写入到自己的二进制日志中去。当从库需要作为主库时,该参数应为 on。

7.binlog_format
二进制日志格式

8.binlog_row_image
当日志格式为 ROW 时,设置 binlog_row_image 来控制日志的行为。可设置的值为 full | minimal | nolob 。full 代表记录所有列的更改情况, minimal 代表只记录修改过的列,nolob 代表记录除了 BLOB和 TEXT之外的所有列,默认为 full。

查看二进制文件

二进制文件因为文件格式是二进制,因此不能用查看文本的方式来查看。可以通过 MySQL提供的 mysqlbinlog 程序可以查看二进制日志。

执行指令:
mysqlbinlog 日志文件路径

如:
C:\Myenv\mysql\bin>mysqlbinlog ../Data/mysql.000001

对于 STATEMENT 格式的二进制文件,使用该命令后,看到的是执行的 SQL 以及一些其他的信息。

而对于 ROW 格式的二进制文件,需要在mysqlbinlog命令上加上选项 -vv,将会看到对记录的实际更改,有时只改了一行的一个字段,却会记录该行所有字段的更改情况,可以看出 ROW 格式的二进制日志为什么很大了。

还有一种方法更为直观地显示二进制日志里面记录的事件:
SHOW BINLOG EVENTS IN ‘mysql-bin.000001’;

猜你喜欢

转载自blog.csdn.net/stfphp/article/details/53386578