千家信息网

mysql innodb double write概念是什么

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,小编给大家分享一下mysql innodb double write概念是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!double write原理图如下:通过引入doublew
千家信息网最后更新 2026年10月31日mysql innodb double write概念是什么

小编给大家分享一下mysql innodb double write概念是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

double write原理图如下:

通过引入doublewrite buffer的方案,每次innodb在准备写出一个page时,先把page写到doublewrite buffer中.如果在写doublewrite buffer时,发生了意外,但是数据文件中的原来的page不受影响,这样在下次启动时,可以通过innodb的redolog进行恢复.如果在写doublewrite buffer成功后,mysql会把doublewrite buffer的内容写到数据文件中,如果在这个过程又出现了

意外,没有关系,重启后mysql可以通过从doublewrite buffer找到好的page,再用该好的page去覆盖磁盘上坏的page即可。

所以在正常的情况下,mysql写数据page时,会写两遍到磁盘上,第一遍是写到doublewrite buffer,第二遍是从doublewrite buffer写到真正的数据文件中.

为了解决 partial page write问题 ,当mysql将脏数据flush到data file的时候,先使用memcopy将脏数据复制到内存中的double write buffer,通过double write buffer再分2次,每次写入1MB到共享表空间,然后马上调用fsync函数,同步到磁盘上,避免缓冲带来的问题。

两次写需要额外添加两个部分:

1)内存中的两次写缓冲(doublewrite buffer),大小为2MB

2)磁盘上共享表空间中连续的128页,大小也为2MB。其中120个用于批量写脏页,另外8个用于Single Page Flush。做区分的原因是批量刷脏是后台线程做的,不影响前台线程。而Single page flush是用户线程发起的,需要尽快的刷脏页并替换出一个空闲页出来。

相关参数解释:

(root@localhost)-[11:35:25]-[(none)]>show status like "%InnoDB_dblwr%";

+----------------------------+-----------+

| Variable_name | Value |

+----------------------------+-----------+

| Innodb_dblwr_pages_written | 882384812 |

| Innodb_dblwr_writes | 61236457 |

+----------------------------+-----------+

2 rows in set (0.01 sec)

InnoDB_dblwr_pages_written doublewrite写的页的总数

InnoDB_dblwr_writes doublewrite写的文件的次数

因为脏页刷新到磁盘的写入单元小于单个页的大小,如果在写入过程中数据库突然宕机,可能会使数据页的写入不完成,

造成数据页的损坏。而redo log中记录的是对页的物理操作,如果数据页损坏了,通过redo log也无法进行恢复。

所以为了保证数据页的写入安全,引入了double write。double write的实现分两个部分,一个是缓冲池中2M的内存块

大小,一个是共享表空间中连续的128个页,大小是2M。脏页从flush list刷新时,并不是直接刷新到磁盘而是先调用

函数(memcpy),将脏页拷贝到double write buffer中,然后再分两次,每次1M将double write buffer 刷新到

磁盘double write 区,之后再调用fsync操作,同步到磁盘。

如果是写doublewrite buffer本身失败,那么这些数据不会被写到磁盘,innodb此时会从磁盘载入原始的数据,然后通过innodb的事务日志来计算出正确的数据,重新 写入到doublewrite buffer。

如果应用在业务高峰期,innodb_dblwr_pages_written:innodb_dblwr_writes远小于64:1,则说明,系统写入压力不大。

虽然,double write buffer刷新到磁盘的时候是顺序写,但还是是有性能损耗的。

如果系统本身支持页的安全性保障(部分写失效防范机制),如ZFS,那么就可以禁用掉该特性(skip_innodb_doublewrite)。

看完了这篇文章,相信你对"mysql innodb double write概念是什么"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

数据 磁盘 大小 文件 内存 空间 线程 部分 缓冲 概念 安全 意外 两个 函数 可以通过 时候 篇文章 系统 过程 问题 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司怎么样 互联网科技工作委员会主任 互联网科技有限公司图片 互联网科技股票 嘟嘟瓜互联网科技 互联网与未来科技 互联网科技公司有哪些 中国互联网金融科技基金 哈尔滨新华互联网科技 互联网公司会议桌创意科技软装饰 江苏南京365互联网科技 央行互联网金融科技公司 科技互联网大厂 苏州五指互联网络科技有限 青岛科技大学互联网大赛研究生 知域互联网科技有限公司大骗子 领航科技大厦互联网公司 宇信科技在杭州互联网排第几 互联网科技手机排行榜 互联网科技快速发展优美句子 上海喔噻互联网科技有限公司 上海睿民互联网科技有限公司 科技股互联网 齐家互联网科技 远拓互联网科技 互联网科技公司招聘 速维有品互联网信息科技(苏州)有限公司 广州千川互联网科技有限公司 美国五大互联网科技公司市值多少 六子台科技互联网展会
0