首页 > 数据库 >mysql中的doube buffer write小结

mysql中的doube buffer write小结

时间:2022-12-07 10:37:08浏览次数:60  
标签:doube doublewrite buffer write Innodb 操作 失效 日志 数据


mysql这玩意,其实还真不少东西值得学习的,这不遇到了一个之前忽视的新概念:
double buffer write,经过查看,小结如下,
原文参考
​​​http://www.mysqlperformanceblog.com/2006/08/04/innodb-double-write/ ​​​

翻译如下;
为什么要用doublewrite?
目的是为了保证出现部分写失效(partial page write)--即数据页写到一半时就出现故障--时的数据安全性。Innodb并不在日志中记录整个数据页,而是使用一种称之为“生理”日志的技术,即日志项中只包含页号、对数据进行的操作(如更新一行记录)和日志序列号等信息。这一日志结构的优点是能够减少写入到日志的数据量,但这也要求要保持页内部的一致性。页的版本号是没关系的,数据页可以是当前版本(这时Innodb(故障恢复时)会跳过对页的更新操作)若是早期版本(这时Innodb将执行更新操作)。但如果页内部数据不一致,恢复将不能进行。

部分写失效
什么是部分写失效,为什么会出现这一现象呢?部分写失效指的是提交给操作系统的写数据页操作只完成了一部分。例如一个16K的Innodb数据页中只有4K被更新了,其余部分数据还是旧的。大部分的部分写失效都在断电时产生,在操作系统崩溃时也可能出现,这是由于操作系统可能将一个写16K数据的操作分割成多个写操作(这可能由文件碎片导致),而在执行这多个写操作的过程中发出的故障。当使用软件RAID技术时,数据页可能恰好跨越分片(stripe)的边界,这时也需要执行多个IO操作,因此也可能导致部分写失效。当使用硬件RAID又没有使用带电池的缓存时,断电时出现部分写失效也是可能的。当发送到磁盘本身只有一个写操作时,理论上硬件可以保证写操作即使在断电时也可以完成,因为驱动器内部应该积累有足够的电量来完成这一操作。但实话说我并不知道事实是不是这样,这很难检测,而且这也不是部分写失效的唯一原因。我所知道的只是部分写失效可能会出现,当Innodb实现 doublewrite功能前,我遇到过很多由于这一原因而导致数据被破坏。

doublewrite如何工作?
你可以将doublewrite看作是在Innodb表空间内部分配的一个短期的日志文件,这一日志文件包含100个数据页。Innodb在写出缓冲区中的数据页时采用的是一次写多个页的方式,这样多个页就可以先顺序写入到doublewrite缓冲区并调用fsync()保证这些数据被写出到磁盘,然后数据页才被定出到它们实际的存储位置并再次调用fsync()。故障恢复时Innodb检查doublewrite缓冲区与数据页原存储位置的内容,若数据页在doublewrite缓冲区中处于不一致状态将被简单的丢弃,若在原存储位置中不一致则从doublewrite缓冲区中还原。

doublewrite缓冲区对MySQL有何影响?
虽然doublewrite要求每个数据页都要被写二次,其性能开销远远小于二倍。写出到doublewrite缓冲区时是顺序写,因此开销很小。 doublewrite同时还可以降低Innodb执行的fsync()操作,即不需要写每个页时都调用一下fsync(),而可以提交多个写操作最后再调用一次fsync()操作,这使得操作系统可以优化写操作的执行顺序及并行使用多个存储设备。但在不使用doublewrite技术时也可以用这些优化,事实上这些优化是与doublewrite同时实现的。因此总体来说,我预计使用doublewrite技术带来的性能开销不会超过5%到10%。

能否禁用doublewrite?
如果你不关心数据一致性(比如使用了RAID0)或文件系统可以保证不会出现部分写失效,你可以通过将innodb_doublewrite参数设置为0还禁用doublewrite。但通常这可能带来更大的麻烦。


查看是否打开了double write
show variables like "%double%";
查看使用情况
show status like "%innodb_dblwr%";
其中
innodb_dblwr_pages_written 为从buffer pool中flush
了多少个页到double write buffer中,
Innodb_dblwr_writes 为多少次真正写到文件中去

标签:doube,doublewrite,buffer,write,Innodb,操作,失效,日志,数据
From: https://blog.51cto.com/u_14230175/5917884

相关文章

  • js 字符串与ArrayBuffer互转
    1.情景展示在js当中,如何将字符串转成ArrayBuffer?如何将ArrayBuffer转成字符串?2.字符串转ArrayBuffer/***将类型化数组转字符串Int8Array:8位有符号整数,长度1个字......
  • shenyu2.5.0解决Exceeded limit on max bytes to buffer:262144
    一、环境shenyu:2.5.0proxy:divide二、异常描述普通请求没有问题,但当json超过1M时会报错org.apache.shenyu.web.handler.GlobalErrorHandler-handleerror:[26ba5fb1-2]......
  • 一种有界队列(Bounded Buffer)的实现
    一、概述在有CPU和GPU参与的一种运算中,比如深度学习推理,CPU需要预处理数据,然后交给GPU处理,最后CPU对GPU的运算结果进行后处理。在整个过程中都是FIFO,即数据......
  • CopyOnWrite简单使用
    在集合遍历的时候,向集合中添加元素这里的错误叫做fail-fast机制,当多个线程对同一集合的内容进行操作时,就可能会产生fail-fast事件    当modCount的数量和expecte......
  • StringBuffer类和StringBuilder类
    1.StringBuffer类基本介绍java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删。很多方法与String相同,但StringBuffer是可变长度的。StringBuffer是一......
  • java并发数据结构之CopyOnWriteArrayList
    CopyOnWriteArrayList是一个线程安全的List实现,其在对对象进行读操作时,由于对象没有发生改变,因此不需要加锁,反之在对象进行增删等修改操作时,它会先复制一个对象副本,然后对......
  • Java基础-String、StringBuffer、StringBuilder类
    String类String的特性:String类代表字符串。Java程序中的所有字符串字面值(如"abc")都作为此类的实例实现。String是一个final类,代表不可变的字符序列。......
  • node js中的buffer
    Node中Buffer的深度解析Node中Buffer的深度解析在Node中,应用需要处理网络协议、操作数据库、处理图片、接收上传文件等,在网络流和文件的操作中,还要处理大量二进制数据,Jav......
  • java FileReader FileWriter修改文件内容
    javaFileReader FileWriter修改文件内容 publicstaticvoideditContent(FilefileParamOld,FilefileParamNew)throwsIOException{FileReaderfr=n......
  • OpenCV imread()函数和imwrite()函数路径不能包含中文问题(VS+Qt5)
    1.Qt窗体中无法显示中文在VS中创建qt项目后,在窗体上或者提示信息上,是不支持显示中文的,可以在cpp文件前写一段代码1#ifdefWIN322#pragmaexecution_character_set(......