本篇文章主要是将学习 redo log
中自己值得记录的学习点。
MTR 设计的目的
解释一下什么是 MTR
:
MySQL中把对底层页面的一次原子访问的过程称之为一个
Mini-Transaction
,这里的原子操作,指的是要么全部成功,要么全部失败,不存在中间状态。
举个例子:
insert into schedule(tid, sid, uid, address) value (2, 12, 56xd, '上海')
如果说 tid = 2
应该插入 page 8
但此时page 8
已经满了,从而页分裂:新生成一个页,然后插入数据,最后把 tid = 2
插入。首先这个过程必须是原子的;其次其实在整个过程里面,不管是索引本身结果;还是页本身的信息(header,checksum。。。)都发生了变化,这些都是要记录下来的,不然要回滚这个事务靠什么?
所有 redo log
一定是连串的,但是同时要保证原子完成,最直观的想法就是 redo log group
,这个就是 Mini-Transaction
产生的原因。
redo log 写入
过程如下:
MTR
运行中产生的若干 redo log 成不可分割组,暂存在内存MTR
结束时,将组内产生的 redo log 复制到log buffer
【并发插入,可能有锁竞争】- 时机成熟,写入磁盘【找到一片连续的空间,写入即可,此为顺序写入】
说几个其中涉及的参数:
LSN
:全局变量,记录已经写入的redo
日志量,总和值【包括log block header
】buf_free
:标记下一个redo
应该写入到log buffer
的地方buf_next_to_write
:全局变量,标记log buffer
已经有多少日志被刷盘
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END