MySQL binlog

binlog的作用

用于记录对MySQL数据库执行的变更操作,但不包括select、show等对数据没有影响的操作。部分update语句可能最终对数据并未产生影响,但也可能会记录到binlog中。

binlog的作用:

  1. 数据恢复 recovery
  2. 数据复制 replication
  3. 审计 audit

binlog查询

binlog存储在datadir目录,可以通过以下命令来查询

mysql> show master status;
mysql> show binlog events in 'mysqld.000001';

datadir目录下的类似mysqld.000001的文件就是binlog文件,mysqld.index是binlog的索引文件,用于保存历史产生的binlog文件的序号。

另,可以使用MySQL提供的mysqlbinlog工具来查看详细的binlog内容。

与binlog相关的参数

参数含义值
log-binbinlog开关默认OFF表示关闭,可以设置binlog的文件名
max_binlog_size单个binlog文件的最大值
binlog_cache_size保存还未提交的binlog的缓存大小,该缓存是基于会话的默认32K
sync_binlogbinlog写缓冲flush到磁盘的频率
binlog-do-db需要记录binlog的库
binlog-ignore-db不需要记录binlog的库
log-slave-update如果当前是slave节点,是否需要将master复制过来的binlog写到自己的binlog中默认OFF
binlog_formatbinlog格式STATEMENT/ROW/MIXED

binlog_cache_size

当在一个事务中binlog缓存使用超过该值时,缓存就会写入临时文件,通过show global status binlog_cache_use和show global status binlog_cache_disk_use可以分别查看使用缓存写binlog的次数和使用临时文件写binlog的次数,如果后者值过大,可考虑调大binlog_cache_size。

binlog_format

三种格式的binlog

statement格式:基于SQL语句来记录
问题:随机函数rand、uuid等会导致主从服务器产生不一样的数据;如果使用READ COMMITTED隔离级别,可能会导致丢失更新

row格式:记录行数据的变更,如果使用该模式,可以将InnoDB的事务隔离级别设置为READ COMMITTED以提高并发
问题:binlog文件比较大

mixed格式:默认采用statement格式记录,但特殊情况使用row格式,这些情况可能有:

  1. 使用了uuid/user/current_user/row_count等不确定的函数
  2. 使用了insert delay语句
  3. 使用了用户定义函数(UDF)
  4. 使用了临时表

sync_binlog

这一项是操作系统级别的优化,任何文件写到磁盘都需要IO操作,但IO会极大影响性能,因此文件会先到写缓冲,再定时flush到磁盘。此项设置为0表示MySQL不干涉写磁盘的时机,由操作系统控制,性能最好但有可能断电时丢失写缓冲中的数据;此项设置为1表示每次都要写磁盘,一致性最好但性能最差;此项>1表示每记录多少次binlog就flush一次。

主从复制

实现步骤

  1. master节点把数据更改记录到binlog
  2. master把binlog异步实时发送给slave节点,slave节点接收binlog并保存到中继日志(relay log)中
  3. slave节点读取并重做中继日志,数据恢复到slave上

slave的IO线程负责接收binlog,SQL线程负责重做relay log,两者是分开的。由于主从复制是异步实时,可能存在延迟,通过show slave status查看Master_Log_File和Read_Master_Log_Pos两个字段,可以看到当前已同步到master的binlog哪个文件的什么位置,与show master status进行对比即可知道主从同步延迟。

Last Updated 2024/11/24 20:50:53