binlog入门解读
- 2019 年 11 月 21 日
- 笔记
我们在使用和维护mysql时,一定经常听到binlog这个概念。binlog在主从复制,数据恢复等场景都有着重要作用。本篇文章主要介绍binlog的概念,功能及常用操作,旨在帮助大家对binlog有更深的了解。
基本概念
binlog是一个二进制格式的文件,记录所有对数据库表结构产生变更的操作(insert,update,delete,create,alter…)。binlog文件存放在/var/log/mysql/
目录下,包括两类文件,索引文件mysql-bin.index和日志文件mysql-bin.00000x。索引文件记录所有的binlog日志文件,日志文件则记录sql语句。
binlog主要用途
数据恢复:可用于回档或故障迁移恢复。比如腾讯云数据库mysql的回档功能基于冷备数据+binlog实现,可以将云数据库或表回档到指定时间。
主从复制:mysql通过主从复制保持所有主从节点的数据一致性,这个过程依赖于binlog的传输回放等。具体流程在下面有详细介绍。
数据审计:通过binlog记录的sql语句,可用来审计追踪用户操作
记录模式
binlog共有3种记录模式:statement,row,mixed.
statement:基于 SQL 语句的复制。
优点:binlog日志量占用小,节约了IO,提高性能。
缺点:记录的只是执行语句,为了这些语句能在slave上正确运行,还需要记录每条语句在执行的时候的一些相关信息,以保证所有语句能在slave得到和在master端执行时候相同 的结果。例如UUID,NOW等函数在复制过程可能导致数据不一致甚至出错。
row:基于行的复制,记录每行实际数据的变更。
优点:复制过程准确,不会出现某些特定情况下的存储过程,或function,以及trigger的调用和触发无法被正确复制的问题。
缺点:binlog 的磁盘占用会比其他两种模式大很多,在一些大表中清除大量数据时在 binlog 中会生成很多条语句,可能导致从库延迟变大。
mixed:在该模式下,MySQL会根据执行的每一条具体的sql语句来灵活选择记录格式。一般的语句修改使用statment格式来提高性能,在遇到一些statement无法完成主从复制的操作时,则采用row格式保存binlog。
优点:综合其他两种模式的特点,准确性强,文件大小适中。
缺点:可能导致主从不一致。
mysql主从复制
为保证高可用(High Availability),目前mysql多采用主从(master-slave)架构,一个主节点加若干从节点。主从架构不仅可以进行读写分离,还可以在主节点宕机时快速拉起一个从节点充当主节点,恢复高可用。mysql通过主从复制保证数据在所有节点中的一致性。
主从复制原理
mysql主从复制涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在从节点。
首先,当从节点连接主节点时,主节点会为每一个从节点创建一个log dump 线程,用于发送binlog. 每个从节点会创建一个I/O线程用来请求接收主节点上的binlog。成功接收到的更新会被I/O线程保存在本地的relay log中。从节点上的SQL线程负责读取relay log中的内容,解析成具体的操作在本地执行,完成整个复制过程。过程的原理图如下图所示。
主从复制模式
mysql主从复制有3种模式
1. 异步复制
异步复制如下图所示,这种模式下主节点将所有更新写入binlog文件之后就返回客户端结果,而不会主动push binlog到从节点。一旦主节点宕机,从节点会因为没有同步到最新binlog导致数据丢失。相对地,该模式处理效率更高,响应速度快。mysql 主从复制默认是异步模式。
2. 半同步复制
半同步复制如下图所示,这种模式下主节点在本地写入binlog后,会主动推送binlog到从节点。在接收到其中一台从节点的返回信息后,再返回给客户端,否则需要等待直到超时时间然后切换成异步模式再提交。相比异步复制,提高了数据安全性,也降低了主从延迟。但性能上会有一定的降低,响应时间会变长。
半同步模式不是mysql内置的,从mysql 5.5开始集成,需要主从节点安装插件开启半同步模式。
3. 全同步复制
全同步复制是指主节点和全部从节点都执行了commit并确认才会向客户端返回成功。在牺牲了效率的前提下,保证了数据的强一致性。
binlog相关操作
1. 查看是否开启binlog,默认都是开启的,除非手动关闭了
show variables like 'log_bin';
2. 查看当前使用的binlog_format
show variables like 'binlog_format';
3. 修改binlog_format(腾讯云数据库不支持修改这个参数,默认为row)
set globle binlog_format='MIXED';
4.查看当前主库正在写入的binlog文件位置
show master statusG;
5. 查看指定binlog文件的内容
show binlog events in 'mysql-bin.00000x';
6. 获取binlog文件列表
show binary logs;
7. 查看binlog文件的大小限制,腾讯云mysql实例中,binlog文件默认大小是256MB。一旦超过就会自动新建一个binlog。
show variables like '%max_binlog%';
8. 手动刷新binlog文件,生成新的binlog文件。注意,服务器在重启时,也会调用flush logs操作。所以重启服务器也会自动生成新的binlog文件。
flush logs;
9. 删除所有binlog,从001文件开始重新记录(谨慎操作!)
reset master;