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';
查看是否开启binlog

2. 查看当前使用的binlog_format

show variables like 'binlog_format';
查看当前使用的binlog_format

3. 修改binlog_format(腾讯云数据库不支持修改这个参数,默认为row)

set globle binlog_format='MIXED';
修改binlog_format

4.查看当前主库正在写入的binlog文件位置

show master statusG;
查看当前主库正在写入的binlog文件位置

5. 查看指定binlog文件的内容

show binlog events in 'mysql-bin.00000x';

查看指定binlog文件的内容

6. 获取binlog文件列表

show binary logs;
获取binlog文件列表

7. 查看binlog文件的大小限制,腾讯云mysql实例中,binlog文件默认大小是256MB。一旦超过就会自动新建一个binlog。

show variables like '%max_binlog%';
查看binlog文件的大小限制

8. 手动刷新binlog文件,生成新的binlog文件。注意,服务器在重启时,也会调用flush logs操作。所以重启服务器也会自动生成新的binlog文件。

flush logs;
手动刷新binlog文件

9. 删除所有binlog,从001文件开始重新记录(谨慎操作!)

reset master;
删除所有binlog