美文网首页
MySQL 的 double write 到底是要解决什么问题?

MySQL 的 double write 到底是要解决什么问题?

作者: linjinhe | 来源:发表于2019-08-21 00:18 被阅读0次

    0

    在数据库中,数据是被分成一块一块的。
    在操作系统中,数据也是被分成一块一块的。
    一般情况下,数据库的块要比操作系统的快大,且数据库块的大小是操作系统块的大小的整数倍。
    所以,数据库的块没法保证原子地持久化。

    1

    Double write 要解决的是 inplace update 的 partial write 的问题。什么叫 partial write?数据库 flush 脏页的时候,系统可能宕机,这个时候,数据库的一个脏页可能只刷了一部分。
    而 InnoDB 的 redo log 没有记录整个 page 的内容。因为如果每次修改都记录整个 page,那日志就太大了。
    也就是说, old_page + redo_log => new_page。如果 old_page 的内容被写坏了,数据就没法恢复了。
    Double write 的做法就是先将 old_page + redo_log 得到的 new_page 先持久化到磁盘上的“另一个地方”。然后再进行 inplace update,如果中途发生宕机,可以从“另一个地方”恢复这个 page 的数据。

    2

    Double write 的问题是 inplace update 特有的——本质原因是 fs 没法保证数据库块的原子刷盘。
    另外,像 LSM-Tree 这种 append-only 的数据结构就没有这个问题——因为是 append-only 的,数据刷盘不会影响到原来的数据。

    相关文章

      网友评论

          本文标题:MySQL 的 double write 到底是要解决什么问题?

          本文链接:https://www.haomeiwen.com/subject/zddvsctx.html