MySQL binlog
binlog的作用
用于记录对MySQL数据库执行的变更操作,但不包括select、show等对数据没有影响的操作。部分update语句可能最终对数据并未产生影响,但也可能会记录到binlog中。
binlog的作用:
- 数据恢复 recovery
- 数据复制 replication
- 审计 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-bin | binlog开关 | 默认OFF表示关闭,可以设置binlog的文件名 |
| max_binlog_size | 单个binlog文件的最大值 | |
| binlog_cache_size | 保存还未提交的binlog的缓存大小,该缓存是基于会话的 | 默认32K |
| sync_binlog | binlog写缓冲flush到磁盘的频率 | |
| binlog-do-db | 需要记录binlog的库 | |
| binlog-ignore-db | 不需要记录binlog的库 | |
| log-slave-update | 如果当前是slave节点,是否需要将master复制过来的binlog写到自己的binlog中 | 默认OFF |
| binlog_format | binlog格式 | 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格式,这些情况可能有:
- 使用了uuid/user/current_user/row_count等不确定的函数
- 使用了insert delay语句
- 使用了用户定义函数(UDF)
- 使用了临时表
sync_binlog
这一项是操作系统级别的优化,任何文件写到磁盘都需要IO操作,但IO会极大影响性能,因此文件会先到写缓冲,再定时flush到磁盘。此项设置为0表示MySQL不干涉写磁盘的时机,由操作系统控制,性能最好但有可能断电时丢失写缓冲中的数据;此项设置为1表示每次都要写磁盘,一致性最好但性能最差;此项>1表示每记录多少次binlog就flush一次。
主从复制
实现步骤
- master节点把数据更改记录到binlog
- master把binlog异步实时发送给slave节点,slave节点接收binlog并保存到中继日志(relay log)中
- slave节点读取并重做中继日志,数据恢复到slave上
slave的IO线程负责接收binlog,SQL线程负责重做relay log,两者是分开的。由于主从复制是异步实时,可能存在延迟,通过show slave status查看Master_Log_File和Read_Master_Log_Pos两个字段,可以看到当前已同步到master的binlog哪个文件的什么位置,与show master status进行对比即可知道主从同步延迟。