MySQL 的二进制日志 binlog 可以说是 MySQL 最重要的日志,它记录了所有的 DDL 和 DML 语句(除了数据查询语句select、show等),以事件形式记录,还包含语句所执行消耗的时间,MySQL的二进制日志是事务安全型的。binlog 的主要目的是主从复制和数据恢复。
Binlog日志的两个重要的使用场景:
- MySQL主从复制:MySQL Replication在Master端开启binlog,master把它的二进制日志传递给slaves来达到master-slave数据一致的目的
根据这张图,把 mysql 的主备复制原理分解为如下流程:
总结来说,MySQL 的主从复制:
异步单线程
。Master
上 1 个IO线程
,负责向Slave传输binary log
(binlog
)Slave
上 2 个线程:IO 线程
和执行SQL的线程
,其中:
IO线程
:将获取的日志信息,追加到relay log上;执行SQL的线程
:检测到relay log中内容有更新,则在Slave上执行sql;特别说明:MySQL 5.6.3 开始支持「
多线程
的主从复制
」,一个数据库
一个线程
,多个数据库
可多个线程
MySQL 主从复制 / 增量同步(个人总结):
- master要开启binlog,并记录所有修改db数据的事件
- slave会启动一个io线程,与master建立客户单连接
- master也启动一个io线程(二进制转储线程)去读取master上的binlog日志,并向slave上的io线程发送"二进制数据"
- slave接收到"二进制数据"并保存在relay log中
- slave另启动sql线程,负责更新relay log中的数据到从库中(执行一遍relay log中的增量数据修改操作)
具体建立从库的方法参考:MySQL增加从库 - Jadear - 博客园
2. 数据恢复:通过使用 mysqlbinlog 工具来使恢复数据
mysql binlog有三种格式:
- statement(默认):基于SQL语句的复制(statement-based replication, SBR)
- row(常用):基于行的复制(row-based replication, RBR)
- mixed(前两者混合使用):混合模式复制(mixed-based replication, MBR)
statement 和 row 格式的 优缺点比较:
- statement
- 优点:生成的日志文件体积小,节约IO,存储的是sql执行语句
- 缺点:搭建MySQL主从时,会出现一些问题。
比如:master查询当前时间select now(),slave同步master的binlog后,同样查询当前时间,这时候就会出现主从二者时间不一致的问题。
- row
- 优点:记录以行为结果的修改记录,确保主从数据的一致。
- 缺点:
- 由于是以每行记录的修改来写日志,故日志体积大(正常日志的3-5倍大小),占用大量 “io/网络” 资源(可能造成主从同步的延迟)。
比如:有一个 delete 语句删掉 10 万行数据,用
- 由于是以每行记录的修改来写日志,故日志体积大(正常日志的3-5倍大小),占用大量 “io/网络” 资源(可能造成主从同步的延迟)。