`

mysql中的doube buffer write小结

阅读更多
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  为多少次真正写到文件中去
2
1
分享到:
评论

相关推荐

    MySQL三大特性之double write

    1.double write官方介绍 InnoDB uses a novel file flush technique called doublewrite.... Only after the write and the flush to the doublewrite buffer have completed, does InnoDB write the page

    史上最详细的一线大厂Mysql面试题详解.pdf

    2. 二次写(Double Write):InnoDB 引擎会将数据写入两次,以确保数据安全。 3. 自适应哈希索引(Adaptive Hash Index):InnoDB 引擎会根据实际情况自动创建哈希索引以提高性能。 4. 预读(Read Ahead):InnoDB ...

    mysql-5.7.29-linux.zip

    例如,InnoDB的双倍读取缓冲区(double write buffer)大小可以提高写入性能,而JSON数据类型则允许存储非结构化数据,适应NoSQL的趋势。 在Linux环境下安装MySQL 5.7.29,你需要首先解压缩文件“mysql-5.7.29-...

    mysql-installer-community-5.7.17.0.msi

    它引入了自适应哈希索引(Adaptive Hash Index)和双读缓冲区(Double Write Buffer),提高了数据一致性和可靠性。 2. **查询性能提升**:MySQL 5.7引入了Query Optimizer改进,如Cascading Ref优化器和更智能的...

    mysql 断电不能启动

    - **半写入数据页恢复**:“Restoring possible half-written data pages from the doublewrite buffer...”,MySQL正尝试从双写缓冲区中恢复可能存在问题的数据页。 - **日志恢复进度**:“Doing recovery: ...

    MySQL技术InnoDB存储引擎_姜承尧_第2版

    另外,InnoDB的缓冲池(Buffer Pool)管理、自适应哈希索引(Adaptive Hash Index)、双写缓冲(Double Write Buffer)和redo log等机制也会有详尽的解释,这些都是理解InnoDB性能的关键。 此外,书中会讨论InnoDB...

    MySQL数据库安全体系详解.pptx

    它将每个事务的日志先写入共享内存的Double Write Buffer,然后再写入Redo Log,从而在系统崩溃时可以恢复数据。 4. **innodb_flush_log_at_trx_commit**参数:这个参数控制InnoDB在事务提交时如何处理Redo Log。...

    MySQL5.7 帮助文档

    - **双写缓冲(Double Write Buffer)优化**:增强了数据安全性,降低了因硬件故障导致的数据丢失风险。 3. **JSON支持**: MySQL5.7开始支持内置的JSON数据类型,允许直接存储和查询JSON格式的数据,无需进行...

    网易技术部MySQL中文资料

    ### 网易技术部MySQL中文... - 可能是指`innodb_doublewrite`参数,解释了该参数如何影响双写缓冲区的使用。 以上知识点涵盖了从数据库开发到优化的各个环节,对于想要深入了解MySQL的开发者来说是非常宝贵的资源。

    大厂Mysql面试题在这里

    1、MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联...插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead) (3)、2者selectcount(*)哪个更快,为什么 myisam更快,因为

    Mysql innodb 存储引擎全揭秘

    同时使用一种 -- next-key locking 的锁策略来避免幻读现象的产生,还提供了插入缓冲(insert buffer) 二次写(double write) 自适应哈希索引,预读(read ahead)等高性能和高可用的功能。对于表中的数据innodb...

    InnoDB源码解析

    文档中提到的一些术语和概念包括Buffer Pool、LRU、Doublewrite Buffer、Undo Log、Data Dictionary等。还有一些未涉及的概念如Binary Log,它是用于复制和备份的,与InnoDB的事务日志是两个不同的概念。 8. 关于...

    mysql架构与存储引擎(MySQL逻辑架构、InnoDB引擎、MyISAM引擎、存储引擎选择).docx

    - **磁盘结构**:包括表空间(Tablespaces)、数据字典(Data Dictionary)、双写缓冲区(Doublewrite Buffer)、重做日志(Redo Log)和撤销日志(Undo Logs)等部分。 - **特点描述**: - **支持事务**:确保一组SQL操作...

    mysql面试题

    2. **二次写(Double Write)**:用于提高崩溃恢复能力,在写入数据之前先写入到缓冲池中的二次写缓冲区,再批量写入到磁盘。 3. **自适应哈希索引(Adaptive Hash Index, AHI)**:自动创建基于热点数据的哈希索引...

    一线大厂Mysql面试题详解.pdf

    * 二次写(Double Write):InnoDB引擎使用二次写来确保数据的一致性。 * 自适应哈希索引(Adaptive Hash Index):InnoDB引擎使用自适应哈希索引来提高查询性能。 * 预读(Read Ahead):InnoDB引擎使用预读来提高...

    167道 MySQL高级面试题(带解析).pdf

    - 两次写(Doublewrite):确保在发生部分写失败的情况下,数据页可以被正确地写入磁盘,提高了数据的可靠性。 - 自适应哈希索引(Adaptive Hash Index):InnoDB可以监视表索引的使用情况,并在适当的条件下自动...

    MySQL管理基础.pptx#资源达人分享计划#

    2. Double Write Buffer:确保数据页写入的完整性,减少因写入失败造成的恢复工作,同时减少fsync调用,提高性能。 3. Adaptive Hash Index:根据查询模式动态创建哈希索引,提升查询效率。但在高并发查询时,可能...

Global site tag (gtag.js) - Google Analytics