Binlog作用
二进制日志,用于主从复制、数据恢复。
Binlog记录过程和刷盘机制
- 大致记录过程是先写Binlog Buffer,然后通过刷盘时机,控制刷入OS Buffer,控制fsync()进行写入Binlog File日记磁盘的过程。
- sync_binlog参数来控制刷盘时机,取值是0、1和N三种值。
- 0: 表示由系统自行判断何时调用sync()写入磁盘;
- 1: 表示每次事务commit都要调用fsync()写入磁盘;
- N: 表示每N个事务,才会调用fsync()写入磁盘。
在 MySQL 中,事务未提交时不会记录到 binlog(二进制日志)。这是因为 binlog 是用于记录事务性操作的日志,只有当事务提交后,它的更改才会被永久记录到 binlog 中,以确保数据的一致性和可靠性。
如果不显示开启事务,也就是不执行begin,数据修改是否会记录到Binlog中?
- 默认情况下,MySQL 会开启 自动提交模式(autocommit=1)。
- 自动模式下: 每一条 INSERT、UPDATE 或 DELETE 语句都是一个独立的事务。 MySQL 会在语句执行完成后立即提交事务,并将变更记录到 binlog 中(如果 binlog 开启)。 即使没有显式使用 BEGIN 开启事务,修改的数据仍然会记录到 binlog 中。
- 非自动提交模式: 需要显式使用 BEGIN 开启事务,否则修改的数据不会被提交,也不会记录到 binlog 中。
如果使用的是 MySQL 的非事务性存储引擎(如 MyISAM),其操作不支持事务回滚,无论是否显式使用事务,写操作都会立即记录到 binlog 中。因此:
- InnoDB:只有在事务提交时写入 binlog。
- MyISAM:所有写操作都会立即写入 binlog,没有事务的概念。
binlog数据格式
statement(记录的是sql), row(默认该模式,基于行复制,记录的是改动的行), mixed(混合)