概念
Binary log(二进制日志),简称Binlog。 Binlog是记录所以数据表结构变更以及表数据修改的二进制日志,不会记录select和show这类操作。Binlog是以事件形式记录,还包括语句所执行的消耗时间。Binlog是MySql Server自己的日志,但是Redo Log是基于InnoDB引擎所特有的日志。
开启Binlog日志的最重要使用场景:
-
主从复制
在主库开启Binlog功能,这样主库就可以把Binlog传递给从库,从库拿到Binlog后实现数据恢复达到主从数据一致性。
-
数据恢复
通过mysqlbinlog工具来恢复数据。
记录模式
Binlog文件名默认为“主机名__binlog-序列号”,例如:oak_binlog-000001,也可以在配置文件中指定名称。
文件记录模式有三种:
-
ROW(row-based replication, RBR):日志中会记录每一行数据被修改的情况,然后在slave端对相同的数据进行修改。
- **优点:**能清楚记录每一行数据修改的细节,能完全实现主从数据的同步和数据恢复。
- **缺点:**批量操作会产生大量日志,尤其是alter table会让日志暴涨。
-
STATMENT(statment-based replication, SBR):每一条被修改数据的SQL都会记录到master的Binlog中,salve在复制的时候SQL进程会解析成和原来master端执行过语句复制。
-
**优点:**日志量少,减少磁盘IO,提升存储和恢复速度。
-
**缺点:**在某些情况会导致主从数据不一致,比如last_insert_id(),now()等函数。
-
-
MIXED(mixed-based replication, MBR):以上两种模式混合使用。一般会使用STATMENT模式保存binlog,对于STATMENT模式无法复制的操作使用ROW模式保存binlog,MySql会根据执行的SQL语句选择写入模式。
文件结构
MySql的binlog文件中记录的是对数据库的各种修改操作,用来表示修改操作的数据结构是Log event。不同的数据修改操作对应不同的Log event。比较常用的log event有:Query event、Row event、Xid event等。
Binlog文件的内容就是各种Log event的集合。
Binlog文件中Log event结构如下图所示:
类型 | 字节数 | 描述 |
---|---|---|
timestamp | 4字节 | 事件开始的执行时间 |
Event Type | 1字节 | 指明该事件的类型 |
server_id | 1字节 | 服务器的server ID |
Event size | 4字节 | 该事件的长度 |
Next_log pos | 4字节 | 固定4字节下一个event的开始位置 |
Flag | 2字节 | 固定2字节 event flags |
Fixed part | 每种Event Type对应结构体固定的结构部分 | |
variable | 每种Event Type对应结构体可变的结构部分 |
Binlog写入机制
-
根据记录模式和操作触发event事件生成log event(事件触发执行机制)
-
将事务执行过程中产生log event 写入缓冲区,每个事务线程都有一个缓冲区
Log event 保存在一个binlog_cache_mngr数据结构中,在该结构中有两个缓冲区,一个是stmt_cache,用于存放不支持事务的消息;另一个是trx_cache,用于存放支持事务的消息。
-
事务在提交阶段会将产生的log event写入到外部binlog文件中。
不同事务以串行方式将log event写入binlog文件中,所以一个事务包含的log event信息在binlog文件中是连续的,中间不会插入其他事务的log event。
binlog是引擎插件上层的功能,事务提交第一个就会调用binlog功能接口,然后再调用其他存储引擎的功能接口。因此先写binlog,然后再执行InnoDB的redo log/undo和脏页刷新操作。
Binlog文件操作指令
待补充
Redo Log和Binlog区别
- Redo Log是属于InnoDB引擎功能,Binlog是属于MySql Server自带功能,并且是以二进制文件记录。
- Redo Log属于物理日志,记录该数据页更新状态内容,Binlog是逻辑日志,记录更新过程。
- Redo Log日志是循环写,日志空间大小是固定,Binlog是追加写,写完一个写下一个,不会覆盖使用。
- Redo Log作为服务器异常宕机后事务数据自动恢复使用,Binlog可以作为主从复制和数据恢复使用。Binlog没有自动crash-safe能力。