暂无图片
MYSQL双写为啥会有两次写?
我来答
分享
H
hgb524
2023-01-11
MYSQL双写为啥会有两次写?

MYSQL双写为啥会有两次写?

我来答
添加附件
收藏
分享
问题补充
1条回答
默认
最新
Z
zwx

InnoDB 的Page Size一般是16KB,其数据校验也是针对这16KB来计算的,将数据写入到磁盘是以Page为单位进行操作的。而计算机硬件和操作系统,写文件是以4KB作为单位的,那么每写一个innodb的page到磁盘上,在os级别上需要写4个块.通过以下命令可以查看文件系统的块大小.

dumpe2fs /dev/vda1 |grep "Block size"
dumpe2fs 1.41.12 (17-May-2010)
Block size:               4096
复制

在极端情况下(比如断电)往往并不能保证这一操作的原子性,16K的数据,写入4K 时,发生了系统断电/os crash ,只有一部分写是成功的,这种情况下就是 partial page write 问题。有人会想到系统恢复后MySQL可以根据redolog 进行恢复,而mysql在恢复的过程中是检查page的checksum,checksum就是pgae的最后事务号,发生partial page write 问题时,page已经损坏,找不到该page中的事务号,就无法恢复。

为了解决 partial page write 问题 ,

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

在这个过程中,doublewrite是顺序写,开销并不大,在完成doublewrite写入后,在将double write buffer写入各表空间文件,这时是离散写入。如果发生了极端情况(断电),InnoDB再次启动后,发现了一个Page数据已经损坏,那么此时就可以从doublewrite buffer中进行数据恢复了。
两次写需要额外添加两个部分:

  • 内存中的两次写缓冲(doublewrite buffer),大小为2MB
暂无图片 评论
暂无图片 有用 7
打赏 0
暂无图片
回答交流
Markdown


请输入正文
提交
相关推荐
mysql的插件在哪里下载?
回答 1
已采纳
一般自带。比如你只要执行install的命令就行
MySQL 用二进制方式安装mysql8.1.0多实例,完成后只能启动一个实例,其他的启动不了,怎么排查?
回答 1
使用相同的my.cnf文件,可以使用mysqldmulti启动多个实例或者如果每个实例对应不同的my.cnf,可以用mysqldsafe指定my.cnf启动
请问 MySQL8.0版本用啥工具解析binlog?
回答 1
一直都是MySQLbinlog和版本无关
MySQL a表拼接字段怎么更新到b表?
回答 2
问题表述模糊不清。updateajoinbona.idb.idsetb.colnameconcat(a.colname,a.colname2)
innodb cluster set可以只读吗?
回答 1
已采纳
可以,参考https://www.modb.pro/db/1696336849929326592
MySQL三层架构怎么使用MHA?
回答 1
已采纳
设置multitierslave参数,从MHAManager0.52版本开始支持多层架构。在默认情况下,它不支持三层或三层以上的级联复制。
MySQL 数据库被覆盖了怎么恢复到被覆盖之前?
回答 1
这个需要看你有没有覆盖之前的数据库的备份,不然得话是不行的。
MySQL按时间点恢复
回答 1
已采纳
可以使用binlog2sql,一个开源的python工具,用于回放sql,可以指定时间点
以下描述中对mysql里mgr描述正确的有哪些?
回答 1
已采纳
A基于分布式Paxos的xcom协议实现组复制,保证数据一致性CMGR组件里包含Capture,Apply,recovery,GCSAPI,API,CommunicationEngineDXCOM是单
如何判断mysql中的一个表是否存在主键的?
回答 3
已采纳
SELECTcolumnnameFROMINFORMATIONSCHEMA.KEYCOLUMNUSAGEWHEREtablename&x27;TABLENAME&x27;ANDCONSTRAINTSC