介绍
binlog是二进制日志文件,记录了所有的 DDL 和 DML 语句,以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。
DDL,数据库定义语言,主要的命令有create、alter、drop等,如:建表
DML,数据操纵语言,update,insert,delete,增删改数据
应用场景
mysql主从复制,详见 链接
实时数据备份:数据库崩溃、数据丢失,可以恢复数据
缺点
开启binlog日志大概会有1%的性能损耗
日志文件分类
binlog日志包括两类文件:
索引文件,文件名后缀为
.index
,用于记录所有的 日志文件日志文件,文件名后缀为
.00000*
,记录数据库所有的DDL和DML语句事件
记录模式
有3种记录模式:
- ROW:记录的是每一行被修改的数据
- STATEMENT:记录的是执行的SQL语句
- MIXED:statement和row模式的混合
记录模式 | 优点 | 缺点 |
---|---|---|
ROW | 能清楚记录每一个行数据的修改细节 | 批量操作,会产生大量的日志,尤其是 alter table 会让日志文件大小暴涨 |
STATEMENT | 日志量小,减少磁盘IO,提升存储和恢复速度 | 在某些情况下会导致主从数据不一致,比如Sql语句中有 last_insert_id() 、 now() 等函数。 |
MIXED | 准确性强,文件大小适中 | 混合模式,默认使用 STATEMENT 模式,当有 last_insert_id() 、 now() 等函数时,使用 ROW 模式 |
模式选择
互联网公司,使用MySQL的功能相对少(存储过程、触发器、函数)选择默认的语句模式,Statement Level(默认)
公司如果用到使用MySQL的特殊功能(存储过程、触发器、函数)则选择Mixed模式
公司如果用到使用MySQL的特殊功能(存储过程、触发器、函数)又希望数据最大化一致,此时最好选择Row level模式
行模式和语句模式的区别
Statement模式:
100万条记录,只需1条delete * from test;
就可以删除100万条记录row模式:
100万条记录,记录100万条删除命令
binlog文件结构
用来记录修改操作的数据结构是Log event。不同的修改操作对应的不同的log event。
比较常用的log event有:
- Query event、
- Row event、
- Xid event
binlog文件的内容就是各种Log event的集合。
Binlog文件中Log event结构如下图所示:
event字段名 | 描述 |
---|---|
timestamp | 4字节 事件开始执行时间 |
event_type | 1字节 指定该事件的类型 |
event size | 4字节 该事件的长度 |
server_id | 1字节 服务器的serverId |
next log pos | 4字节 下一个事件开始的位置 |
flag | 2字节 event flags |
binlog 写入机制
- 根据设置的记录模式和操作生成相应的log event
- 事务执行过程中产生log event会先写入缓冲区,每个事务线程都有一个缓冲区,Log Event保存在一个binlog_cache_mngr数据结构中,在该结构中有两个缓冲区,一个是stmt_cache,用于存放不支持事务的信息;另一个是trx_cache用于存放支持事务的信息。
- 事务在提交阶段会将产生的 log event 写入到外部 binlog 文件中。不同事务以串行方式将log event写入binlog文件中,所以一个事务包含的log event信息在binlog文件中是连续的,中间不会插入其他事务的log event。
参考:
https://www.cnblogs.com/Presley-lpc/p/9619571.html
https://zhuanlan.zhihu.com/p/227864607