InnoDB 中 redo log 和 undo log 以及数据页的修改顺序到底是怎样的? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Marathonk
V2EX    问与答

InnoDB 中 redo log 和 undo log 以及数据页的修改顺序到底是怎样的?

  •  
  •   Marathonk 2021-12-22 22:34:04 +08:00 1362 次点击
    这是一个创建于 1396 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个事务提交后,为了保证事务的原子性与持久性,会在 undo log 和 redo log 记录相应的日志,以在需要回滚或重做时使用。但是目前关于 redo log 和 undo log 以及数据页的写入顺序并没有找到解释的清楚的资料。

    林晓斌写的是“引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面”,这个同时能保证是原子的吗,是不是从 数据更新到内存 到 写 undo log 和 redo log 完成这段时间里,数据页是不会作为脏页刷入磁盘的(或者说 是不会写到 buffer pool 的 flush 链表中的)?
    3 条回复    2021-12-24 19:36:54 +08:00
    Marathonk
        1
    Marathonk  
    OP
       2021-12-23 11:40:07 +08:00
    MySQL 中的 Undo Log 严格的讲不是 Log ,而是数据,因此他的管理和落盘都跟数据是一样的:
    Undo 的磁盘结构并不是顺序的,而是像数据一样按 Page 管理 Undo 写入时,也像数据一样产生对应的 Redo Log
    Undo 的 Page 也像数据一样缓存在 Buffer Pool 中,跟数据 Page 一起做 LRU 换入换出,以及刷脏。
    Undo Page 的刷脏也像数据一样要等到对应的 Redo Log 落盘之后

    之所以这样实现,首要的原因是 MySQL 中的 Undo Log 不只是承担 Crash Recovery 时保证 Atomic 的作用,更需要承担 MVCC 对历史版本的管理的作用,设计目标是高事务并发,方便的管理和维护。因此当做数据更合适。

    但既然还叫 Log ,就还是需要有 Undo Log 的责任,那就是保证 Crash Recovery 时,如果看到数据的修改,一定要能看到其对应 Undo 的修改,这样才有机会通过事务的回滚保证 Crash Atomic 。标准的 Undo Log 这一步是靠 WAL 实现的,也就是要求 Undo 写入先于数据落盘。而 InnoDB 中 Undo Log 作为一种特殊的数据,这一步是通过 redo 的 min-transaction 保证的,简单的说就是数据的修改和对应的 Undo 修改,他们所对应的 redo log 被放到同一个 min-transaction 中,同一个 min-transaction 中的所有 redo log 在 Crash Recovery 时以一个整体进行重放,要么全部重放,要么全部丢弃。
    liuxingchina
        2
    liuxingchina  
       2021-12-24 15:50:13 +08:00   1
    1.磁盘加载数据到 buffer pool
    2.写入 undo log 记录旧数据用于回滚
    3.写入 redo log buffer
    4.redo log 刷盘
    5.写入 bin log
    6.写入 commitId 到 redo log
    7.事务提交
    Marathonk
        3
    Marathonk  
    OP
       2021-12-24 19:36:54 +08:00
    @liuxingchina 其实我之前的主要疑问也在这里,如果 1 完成 2 还没做,同时 buffer pool 中的数据被持久化到磁盘了,这时数据库崩溃了,那岂不是写入了脏数据进来?
    后来查阅了很多资料,其实 Innodb 内部实现还是很复杂的,简单的逻辑是会保证 undo log 和数据页的修改都写入 redo log 并且落盘后,前者才会落盘,这也是保证原子性的基础。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2581 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 03:56 PVG 11:56 LAX 20:56 JFK 23:56
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86