
binlog 的 header 和 events
/* 4 bytes which all binlogs should begin with */
#define BINLOG_MAGIC "\xfe\x62\x69\x6e"
所有的 binlog event 都会以这 4 个字节开头,这 4 个字节用于校验该文件是否是 binlog 文
件。这个事件结束之后,才会是一个个的 binlog event。
我们打开 binlog 试一下,可以开到开头。我们改掉一个 bin 中的一个字符,在用 mysqlbinlog
打开一下这个文件试一下,哈哈,报错了,File is not a binlog file
3. binlog 是在什么时候产生的呢
a.首先我们必须在配置文件里打开 binlog 选项,mysql 才会产生 binlog
b. binlog 有三种 format:row、statements、 mix
Row: 记录所有数据变化,比如一条 delete 语句,binlog 记录的 row event 解析出
来可能是 where @1=? and @2 = ?
statements delete from t1 where id < 10;
mix:兼具 row 和 statements 的优点,也就是说也有可能有他们两个的缺点哦。比如
对表的操作可能会退化成语句格式,说是 DDL 走 statement,DML 走 row,但是实际测下来,
部分 DML 还是走了 statement
后续我们所介绍的 trx 的构成不明说的话,都是以 row 格式哈。
c. 说道 binlog 的产生时间,就不得不提一个参数,sync_binlog = 1,如果说道 sync_binlog
等于就得介绍 innodb_flush_log_at_trx_commit.
sync_binlog 是针对,binlog 落盘的,当 sync_binlog = 1 时,一个事务 mysql 或对 binlog
做一次落盘,innodb_flush_log_at_trx_commit 是针对 innodb 存储引擎的,它对应的是 redo
log undo log 的落盘。
我们知道 binlog 是在 mysql 的 server 层,redo log 是存储引擎,因此也需要保证 binlog
和 redo log 的数据一致性。mysql 使用了内部 xa 来保证数据的一致。这个往细里讲的话,
也差不多要一节课。
源文件在 binlog.cc 的 ordered_commit 函数。今天不是咱们的重点,我就简单讲一下流
程
评论