MySQL-知识概览
三大核心日志
MySQL 任意一条写SQL(不包括读SQL)的执行都会记录三个核心日志:undo-log、redo-log、bin-log。
Undo Log(撤销日志)
- 作用:记录SQL操作的撤销日志,用于事务回滚和MVCC
- 存储机制:
- 使用共享Buffer Pool中的undo_log_buffer缓冲区
- 事务写数据前,先将旧数据拷贝到Undo Log。行数据的隐藏字段roll_ptr回滚指针指向Undo Log中的旧数据。
- 特性:
- 属于"数据页",受Redo Log保护,即写入 Undo Log 也会记录 Redo Log。
- InnoDB引擎特有
Redo Log(重做日志)
- 作用:记录数据页的物理变化,用于崩溃恢复
- 存储机制:记录的是“数据页的物理变化”,例如记录"表空间X、页面Y、偏移Z处的值从A改为B"
- 刷盘控制:
- 参数
innodb_flush_log_at_trx_commit控制刷盘时机 - 默认值1:每次提交事务时刷盘
- 参数
- 特性:InnoDB引擎特有
Bin Log(二进制日志)
- 作用:记录SQL操作日志,用于主从复制和数据恢复
- 存储机制:
- 使用位于线程的工作内存中的缓冲区bin_log_buffer。
- 追加存储模式,支持保留所有 bin-log。
- 格式类型:
- STATEMENT:记录SQL语句(默认)
- ROW:记录行数据变化
- MIXED:混合模式
- 刷盘控制:
- 参数
sync_binlog控制刷盘时机 - 默认值1:每次提交事务时刷盘
- 参数
- 特性:MySQL Server级别,所有引擎可用
崩溃恢复机制
两阶段提交与崩溃恢复
如果redo-log只写一次,那不管redo-log和 bin-log 谁先写,都有可能造成主从同步数据时的不一致问题出现。