日志的存放形式一直挺让人头大的,尤其是刚接触 MySQL 事务机制的时候。canoe这个资源讲得蛮清楚,适合想快速上手的小伙伴,里面对redo log和undo log的写入流程,解释得一步步来,没什么废话,逻辑也挺清楚。
Redo log 的写入顺序是重点。改数据页之前,先记一笔 undo 的 redo,再写 undo log,是数据页的改动和它的 redo。把这些日志落到磁盘——先写 buffer,再刷盘。你会问,这么绕干嘛?为了崩溃恢复能靠 redo 回滚或前滚,必须得这么干。
还有一点比较有意思,MySQL 5.6 之后的 undo log终于不局限在ibdata
文件里了,通过innodb_undo_tablespaces
参数可以单独拿出去,管理更灵活,空间利用也更高效。
至于int(1)
和int(20)
,多人以为它们存储上有差,其实就是个显示宽度,根本不影响计算,别被误导了。
想更深入了解事务回滚和崩溃恢复机制,可以顺手看看下面这些资料,都是实战角度出发,还挺实用的。