MySQL 实战四十五讲基础篇总结(二)
重要的日志模块:Redo log
先把赊账的金额记录在粉板上,等不忙了再记录到账本
粉板=“redo log”
账本=“磁盘”
有了 redo log,InnoDB 就可以保证即使数据库发生异常重启,之前提交的记录都不会丢失,这个能力称为 crash-safe
crash-safe
赊账记录记在了粉板上或写在了账本上,之后即使掌柜忘记了,比如突然停业几天,恢复生意后依然可以通过账本和粉板上的数据明确赊账账目
重要的日志模块:Binlog
binlog 会记录所有的逻辑操作
两阶段式提交
为了让数据在逻辑上一致
1.写入 redo log Prepare 阶段 -- > 2.写入 binlog -- > 3.Commit 提交
Redo log 与 Binlog 不同
redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=2 这一行的 c 字段加 1 ”。
redo log 是循环写的,空间固定会用完;binlog 是可以追加写入的。“追加写”是指 binlog 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。
redo log 用于保证 crash-safe 能力。innodb_flush_log_at_trx_commit 这个参数设置成 1 的时候,表示每次事务的 redo log 都直接持久化到磁盘。这个参数我建议你设置成 1,这样可以保证 MySQL 异常重启之后数据不丢失。
sync_binlog 这个参数设置成 1 的时候,表示每次事务的 binlog 都持久化到磁盘。这个参数我也建议你设置成 1,这样可以保证 MySQL 异常重启之后 binlog 不丢失。
1 prepare 阶段 2 写 binlog 3 commit
当在 2 之前崩溃时 重启恢复:后发现没有 commit,回滚。备份恢复:没有 binlog 。 一致
当在 3 之前崩溃 重启恢复:虽没有 commit,但满足 prepare 和 binlog 完整,所以重启后会自动 commit。备份:有 binlog. 一致
版权声明: 本文为 InfoQ 作者【一个有志气的DB】的原创文章。
原文链接:【http://xie.infoq.cn/article/017f72f2bb51666633c69e7c2】。未经作者许可,禁止转载。
评论