MySQL binlog

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

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

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

可以使用 SHOW VARIABLES LIKE ‘log_bin’; 来查看是否开启了 binlog 。

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 时的网络开销也将更大。

相关配置

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

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

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

  4. binlog_do_db
    表示将记录哪些库的 binlog

  5. binglog_ignore_db
    表示将忽略哪些库的 binlog

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

  7. binlog_format
    binlog 格式

  8. 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’;

你可能感兴趣的:(MySQL)