Mysql日志篇(binlog)

87 阅读2分钟

Binlog作用

二进制日志,用于主从复制、数据恢复。

Binlog记录过程和刷盘机制

  1. 大致记录过程是先写Binlog Buffer,然后通过刷盘时机,控制刷入OS Buffer,控制fsync()进行写入Binlog File日记磁盘的过程。
  2. sync_binlog参数来控制刷盘时机,取值是0、1和N三种值。
    • 0: 表示由系统自行判断何时调用sync()写入磁盘;
    • 1: 表示每次事务commit都要调用fsync()写入磁盘;
    • N: 表示每N个事务,才会调用fsync()写入磁盘。

在 MySQL 中,事务未提交时不会记录到 binlog(二进制日志)。这是因为 binlog 是用于记录事务性操作的日志,只有当事务提交后,它的更改才会被永久记录到 binlog 中,以确保数据的一致性和可靠性。

如果不显示开启事务,也就是不执行begin,数据修改是否会记录到Binlog中?

  1. 默认情况下,MySQL 会开启 自动提交模式(autocommit=1)。
  2. 自动模式下: 每一条 INSERT、UPDATE 或 DELETE 语句都是一个独立的事务。 MySQL 会在语句执行完成后立即提交事务,并将变更记录到 binlog 中(如果 binlog 开启)。 即使没有显式使用 BEGIN 开启事务,修改的数据仍然会记录到 binlog 中。
  3. 非自动提交模式: 需要显式使用 BEGIN 开启事务,否则修改的数据不会被提交,也不会记录到 binlog 中。

如果使用的是 MySQL 的非事务性存储引擎(如 MyISAM),其操作不支持事务回滚,无论是否显式使用事务,写操作都会立即记录到 binlog 中。因此:

  • InnoDB:只有在事务提交时写入 binlog。
  • MyISAM:所有写操作都会立即写入 binlog,没有事务的概念。

binlog数据格式

statement(记录的是sql), row(默认该模式,基于行复制,记录的是改动的行), mixed(混合)