本文向您介绍如何在mysql中分析双写。内容非常详细,感兴趣的朋友可以参考一下,希望对你有所帮助。
在介绍双写之前,有必要了解一下偏页写问题:
InnoDB的页面大小一般为16KB,其数据校验也是针对这16KB计算的,数据写入磁盘的操作是基于Page的。但是,计算机硬件和操作系统,在极端情况下(比如断电),往往无法保证这种操作的原子性。当16K数据写入4K时,系统断电/os崩溃,只有一部分写入成功。在这种情况下,是部分页面写入问题。
很多DBA会认为系统恢复后,mysql可以根据redolog进行恢复,而MySQL在恢复过程中会检查页面的校验和,校验和是pgae的最后一个事务号。当发生部分页面写入问题时,页面损坏,页面中的事务号无法恢复。一 double write是什么?
双写是InnoDB在表空间上的128页(2个区域)是2MB;
其原理是:
为了解决部分页面写的问题,mysql在将脏数据刷新到数据文件时,首先使用memcopy将脏数据复制到内存中的双写缓冲区,然后用双写缓冲区将其分成两次,每次向共享表空间写入1MB。然后立即调用fsync函数,并将其同步到磁盘,以避免缓冲带来的问题。在这个过程中,双写是顺序写,成本不大。双重写入完成后,双重写入缓冲区被写入每个表空间文件,这是离散写入。
在极端情况下(断电),InnoDB再次启动后,发现一个Page数据已经损坏,这时可以从doublewrite缓冲区恢复数据。
双写有什么缺点?
位于共享表空间中的双写缓冲区实际上是一个文件。写DWB会导致系统中更多的fsync操作,硬盘的fsync性能会降低mysql的整体性能,但不会降低到原来的50%。这主要是因为:
1)双写是连接的存储空间,所以硬盘是按顺序写数据,而不是随机写,这样性能更高。
2)当数据从双写缓冲区写入实段时,系统会自动合并刷新连接空间的方式,一次可以刷新多个页面;三 double write在恢复的时候是如何工作的?
如果对doublewrite缓冲区本身进行了部分页面写入,则原始页面仍将位于磁盘的实际位置。-
-如果写入双写缓冲区本身失败,则数据不会写入磁盘。此时InnoDB会从磁盘加载原始数据,然后通过InnoDB的事务日志计算出正确的数据,再重新写入doublewrite缓冲区。
当InnoDB恢复时,它将使用原始页面,而不是双写缓冲区中损坏的副本。但是,如果双写缓冲区成功,而对页面真实位置的写入失败,InnoDB将在恢复期间使用双写缓冲区中的副本。
-如果双写缓冲成功写入,但磁盘写入失败,InnoDB不需要通过事务日志计算,而是直接用缓冲区的数据再次写入。
InnoDB知道页面何时损坏,因为每个页面的末尾都有校验和;校验和是最后要写入的内容,所以如果页面的内容与校验和不匹配,页面就会损坏。因此,在恢复时,InnoDB只读取双写缓冲区中的每一页,并验证校验和。如果页面的校验和不正确,它将从原始位置读取页面。
-恢复时,InnoDB直接比较页面的校验和。如果是错误的,则从硬盘加载原始数据,然后事务日志开始推导正确的数据。所以InnoDB的恢复通常需要很长时间。四 我们是否一定需要 double write ?
在某些情况下,双写缓冲区确实不是必需的——例如,您可能希望在从机上禁用它。此外,一些文件系统(如ZFS)自己也做同样的事情,所以InnoDB这样做是多余的。可以通过将InnoDB_doublewrite设置为0来禁用双重写入缓冲区。五 如何使用 double write
InnoDB_doublewrite=1表示启动双重写入
显示类似" InnoDB_dblwr% "的状态可以查询双重写入的使用情况;
相关参数与状态
双写的使用情况:
显示类似" %InnoDB_dblwr% "的状态;
InnoDB _ dblwr _ pages _ written从英国石油公司冲洗到DBWB的个数
InnoDB_dblwr_writes写文件的次数
每次写操作合并页,面,张,版的个数=InnoDB _ dblwr _ pages _ writed/InnoDB _ dblwr _ writes
关于如何浅析关系型数据库中的双重写入就分享到这里了,希望
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/95850.html