redo log 重做日志(引擎层)
即WAL技术,将更新记录写入redo log,同时更新内存,并在适当时候将记录落盘。
redo log大小是固定的,从头开始写,写到末尾就回到开头循环写,逻辑环形。
write pos:写入位置,随写入操作后移,逻辑环形。
checkpoint:落盘位置,随落盘后移,逻辑环形。
redo log保证了,即使MySQL异常重启,之前提交的记录都不会丢失,这个能力称为crash-safe
redo log
binlog 归档日志(Server层)
主从复制:建立一个数据库环境,与源数据库完全一致。
作用:
- 1)热备
- 2)读写分离
原理:
- 1)Master将变更记录写入binlog。
- 2)Slave向Master发送Dump协议,拷贝binlog events到中继日志relay log。
- 3)Slave读取并回放relay log中的时间,将变更的数据同步到自己的数据库
binlog类型:
- 1)Statement-based:基于语句,可能造成数据不一致。
- 2)Row-based:基于行,记录每次操作后被操作行的变化。
- 3)Mixed:此类型,默认为Statement-based,若可能存在数据不一致,自动切换至
Row-based。
两种日志的不同
1)redo log为InnoDB引擎特有;binlog是MySQL的Server层实现的,所有引擎通用。
2)redo log是物理日志;binlog是逻辑日志
3)redo log循环写(逻辑环形),存在覆盖;
binlog追加写,新增文件,不覆盖。
执行流程
update语句执行流程
2PC 两阶段提交
1)开启事务
2)写入redo log (预提交)
3)写入binlog后,提交事务(正式提交)
任意阶段失败,事务回滚
小结
1)redo log用于保证crash-safe能力,innodb_flush_log_at_trx_commit这个参数设置成1,每次事务的redo log都持久化至磁盘。
2)binlog,主从复制,sync_binlog这个参数设置成1,每次事务的binlog都持久化到磁盘。