今天我们来介绍InnoDB存储引擎的第二个特性 - 两次写(doublewrite),如果说插入缓冲是为了提高写性能的话,那么两次写是为了提高可靠性,牺牲了一点点写性能。
部分写失效
想象这么一个场景,当数据库正在从内存向磁盘写一个数据页时,数据库宕机,从而导致这个页只写了部分数据,这就是部分写失效,它会导致数据丢失。这时是无法通过重做日志恢复的,因为重做日志记录的是对页的物理修改,如果页本身已经损坏,重做日志也无能为力。
两次写机制
从上面分析我们知道,在部分写失效的情况下,我们在应用重做日志之前,需要原始页的一个副本,两次写就是为了解决这个问题,下面是它的原理图:
两次写需要额外添加两个部分:
1)内存中的两次写缓冲(doublewrite buffer),大小为2MB
2)磁盘上共享表空间中连续的128页,大小也为2MB
其原理是这样的:
1)当刷新缓冲池脏页时,并不直接写到数据文件中,而是先拷贝至内存中的两次写缓冲区。
2)接着从两次写缓冲区分两次写入磁盘共享表空间中,每次写入1MB
3)待第2步完成后,再将两次写缓冲区写入数据文件
这样就可以解决上文提到的部分写失效的问题,因为在磁盘共享表空间中已有数据页副本拷贝,如果数据库在页写入数据文件的过程中宕机,在实例恢复时,可以从共享表空间中找到该页副本,将其拷贝覆盖原有的数据页,再应用重做日志即可。
其中第2步是额外的性能开销,但由于磁盘共享表空间是连续的,因此开销不是很大。可以通过参数skip_innodb_doublewrite禁用两次写功能,默认是开启的,强烈建议开启该功能。
相关推荐
### MySQL Innodb 索引原理详解 #### 1. 各种树形结构 在深入探讨MySQL Innodb索引之前,我们先了解几种基本的树形数据结构,包括二叉搜索树、B树、B+树以及B*树。 ##### 1.1 搜索二叉树(Binary Search Tree) ...
我们知道,由于文件系统对一次大数据页(例如InnoDB的16KB)大多数情况下不是原子操作,这意味着如果服务器宕机了,可能只做了部分写入。16K的数据,写入4K时,发生了系统断电/oscrash,只有一部分写是成功的,这种...
这种锁机制使得读写操作之间以及写写操作之间呈串行化状态,即一次会话获取写锁后,其他所有线程的操作都将等待该锁被释放。 **2、验证案例** **共享读锁验证**: - **会话一**: - 加读锁:`LOCK TABLE dc_user...
InnoDB存储引擎的关键特性包括插入缓冲、两次写(double write)、自适应哈希索引(adaptive hash index)。这些特性为InnoDB存储引擎带来了更好的性能和更高的可靠性。 插入缓冲 插入缓冲是InnoDB存储引擎关键特性...
* 二次写(Double Write):InnoDB引擎使用二次写来确保数据的一致性。 * 自适应哈希索引(Adaptive Hash Index):InnoDB引擎使用自适应哈希索引来提高查询性能。 * 预读(Read Ahead):InnoDB引擎使用预读来提高...
### MySQL核心Innodb存储引擎浅析—事务系统 #### 存储引擎介绍 在MySQL中,存储引擎是处理表的存储方式的核心组件之一。不同的存储引擎提供了不同的特性,如事务支持、锁定粒度等。其中,MyISAM和InnoDB是最常用...
这可以防止脏读,但可能会导致不可重复读,即在同一个事务中两次执行相同的查询可能会得到不同的结果。 3. **REPEATABLE READ**:默认的隔离级别,可以防止脏读和不可重复读。在这个级别下,一个事务多次执行相同的...
MySQL的高可用性经历了多次技术演进。从早期的版本3.23开始,MySQL提供了基于异步复制的主从复制(Master/Slave)模式。这种模式虽然简单易用,但存在数据丢失风险,尤其是在主服务器发生故障时。为了改善数据的安全...
#### InnoDB特性详解 - **支持事务**: - 原子性:所有操作要么全部成功,要么全部失败; - 一致性:确保事务执行前后数据的一致性; - 隔离性:并发事务不会相互干扰; - 持久性:一旦事务提交,更改将永久...
在MySQL的InnoDB存储引擎中,事务支持ACID特性,采用的是行级锁。这意味着在同一时刻,对于某个特定的数据行,多个事务可能需要对该行进行不同的锁定,以确保数据的一致性和完整性。 ##### 两语句加锁情况 1. **...
InnoDB存储引擎采用一种双写缓冲策略,即事务日志(redo log)和数据文件(ibd文件)分别存储数据的两次副本。这种设计是为了保证事务的ACID特性,即使在系统崩溃的情况下,也能通过事务日志恢复数据的一致性。 在...
3. **可重复读(REPEATABLE READ)**:确保在同一事务内多次读取相同数据时得到一致的结果,但可能会发生幻读,即事务中两次执行相同的查询,可能会看到新插入的数据。 4. **串行化(SERIALIZABLE)**:最高级别的隔离...
MySQL是世界上最受欢迎的关系型数据库管理系统(RDBMS)之一,尤其在Web应用程序中广泛应用。5.6.35是MySQL的一个稳定版本,提供了许多增强的功能和优化,旨在提高性能、可扩展性和安全性。 标题"MySQL-5.6.35-...
MySQL是世界上最受欢迎的关系型数据库管理系统(RDBMS)之一,由Oracle公司开发和维护。5.5.36是MySQL的一个稳定版本,适用于多种操作系统,包括Windows。在本压缩包中,我们有两个文件:`mysql-5.5.36-win32.msi`和...
MySQL是世界上最受欢迎的开源数据库系统之一,尤其在Web应用程序中被广泛应用。这个压缩包文件“mysql-5.0.91-winx64”显然包含了MySQL数据库系统的一个针对Windows x64平台的版本5.0.91。下面将详细讨论MySQL ...
10. `--quick`:在导出大数据量时,避免一次性加载整个结果集,减少内存占用。 在备份InnoDB表时,由于其事务处理和行级锁定特性,通常建议使用`--single-transaction`选项来获取一致性快照,同时配合binlog备份以...
MySQL也有类似的InnoDB Replication,但跨数据库平台需借助第三方工具。 4. **使用中间件**:例如阿里云DataHub、Debezium等,它们可以捕获MySQL的变更事件,通过消息传递机制推送到Oracle。 描述中提到的"同时...
MySQL作为一款广泛使用的开源关系型数据库管理系统,其架构主要分为客户端和服务端两大部分。客户端包括了各种连接工具和应用程序,服务端则包含了核心服务(如SQL接口、查询解析器等)和存储引擎。 - **存储引擎**...