MySQL的double write和Oracle对比学习

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 之前有网友希望我对mysql的double write和oracle能够做一个对比,其实这种对比方式挺好,能够触类旁通,举一反三。不过限于本人水平有限,欢迎拍砖。 关于MySQL的double write是对partilal write的一个补充。
之前有网友希望我对mysql的double write和oracle能够做一个对比,其实这种对比方式挺好,能够触类旁通,举一反三。不过限于本人水平有限,欢迎拍砖。
关于MySQL的double write是对partilal write的一个补充。比如将数据写入磁盘的时候,发生了断电情况,那么一部分内容写入一部分就丢失了,这个时候使用redo log来恢复就不可行了,因为从日志文件层面数据的变更已经是不完整的了。


double write的大体是这样的。部分内容参考了链接 http://www.cnblogs.com/benshan/archive/2013/01/14/2859336.html
double write分为两部分,一部分是doublewrite buffer,大小为2M,另外一部分就是物理磁盘上的共享表空间中连续的128个页,即两个区,大小同样为2M。当缓冲池的胀业刷新时,并不直接写硬 盘,而是通过memcpy函数将脏页先拷贝到内存中的doublewrite buffer,之后通过doublewrite buffer再分两次写,每次写入1M到共享表空间的物理磁盘上,然后马上调用fsync函数,同步磁盘。

这个问题可以简单的归结为innodb恢复的原理,从这个层面来说和oracle还是存在着很大的不同。
首先double write是限于Innodb 存储引擎的,而且是作为一个可选的方案,通过参数InnoDB_doublewrite的值来控制,如果为0表示不启用,可以通过show status like  "%InnoDB_dblwr%"来查看。
既然作为可选方案,肯定是有一定的原因,就是出于性能的考虑,位于共享表空间的double write buffer其实也是文件,写double write buffer本身也会有fsync操作,只是double write写入的过程是一个顺序写的过程,所以对性能降低不会太低。

oracle的恢复机制相比double wriite更加灵活和全面。
首先oracle中采用了undo+redo机制来作为数据恢复的基石,数据的恢复是通过前后台结合来实现的,在缓存级别,存在dbwr,能够把修改后的数据块刷入数据文件,这是一个异步的过程,不会因为发生数据变更就马上写入数据文件,同时存在log buffer,能够通过log buffer生成redo日志,最后通过lgwr把这部分变更刷到redo 日志,在这个过程中lgwr负责了保持数据完整性的任务,保证了数据在任何情况下都不会丢失。
上面的操作,写入数据文件的过程不是实时的,可以存在一定的延时,所以重点就放在了redo日志上面,在备份恢复方面还是最重要的。
如果在dbwr把数据变更的数据块写入数据文件的时候,如果发生断电的情况,当实例重新启动的时候,oracle会根据redo 日志构造出变更前的数据块信息,从而完成了前滚,把丢失的数据块找回来。这样数据库就恢复为了奔溃前的状态,如果某些事务没有提交或者回滚,又会继续做一个回滚操作。这个过程会通过smon来结合Undo来实现。
从整个过程来说,oracle支持的面很广,就如Oracle所承诺的那样,做了commit的数据就能够恢复。从IO消耗的角度来看,物理IO的消耗就在于刷新数据到数据文件,数据变更写入redo,没有额外的物理IO。

结合MySQL来看,double write buffer扮演的角色有点类似 log buffer的作用。因为oracle已经开辟了log buffer的缓存空间,所以缓存级的IO还是很快的,double write buffer就会存在部分的物理IO操作。
不过从技术的架构和角度来看,不能完全说出某一种好还是不好,从目前的分析来看,oracle相比double write还是技高一筹,不过从体系结构上要复杂的多。而且还涉及到更多的细节需要优化。
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
3月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
576 5
|
4月前
|
关系型数据库 MySQL 数据管理
Mysql基础学习day03-作业
本内容包含数据库建表语句及多表查询示例,涵盖内连接、外连接、子查询及聚合统计,适用于员工与部门数据管理场景。
97 1
|
4月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01
本课程为MySQL基础学习第一天内容,涵盖MySQL概述、安装、SQL简介及其分类(DDL、DML、DQL、DCL)、数据库操作(查询、创建、使用、删除)及表操作(创建、约束、数据类型)。适合初学者入门学习数据库基本概念和操作方法。
213 6
|
4月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02-作业
本教程介绍了数据库表的创建与管理操作,包括创建员工表、插入测试数据、删除记录、更新数据以及多种查询操作,涵盖了SQL语句的基本使用方法,适合初学者学习数据库操作基础。
117 0
|
4月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day03
本课程为MySQL基础学习第三天内容,主要讲解多表关系与多表查询。内容涵盖物理外键与逻辑外键的区别、一对多、一对一及多对多关系的实现方式,以及内连接、外连接、子查询等多表查询方法,并通过具体案例演示SQL语句的编写与应用。
136 0
|
4月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day01-作业
本教程包含三个数据库表的创建练习:学生表(student)要求具备主键、自增长、非空、默认值及唯一约束;课程表(course)定义主键、非空唯一字段及数值精度限制;员工表(employee)包含自增主键、非空字段、默认值、唯一电话号及日期时间类型字段。每个表的结构设计均附有详细SQL代码示例。
104 0
|
4月前
|
SQL 关系型数据库 MySQL
Mysql基础学习day02
本课程为MySQL基础学习第二天内容,涵盖数据定义语言(DDL)的表查询、修改与删除操作,以及数据操作语言(DML)的增删改查功能。通过具体SQL语句与实例演示,帮助学习者掌握MySQL表结构操作及数据管理技巧。
178 0
|
9月前
|
Oracle 关系型数据库 MySQL
Oracle linux 8 二进制安装 MySQL 8.4企业版
Oracle linux 8 二进制安装 MySQL 8.4企业版
383 1
|
10月前
|
Oracle 关系型数据库 MySQL
使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试
这篇文章是作者尚雷关于使用崖山YMP迁移Oracle/MySQL至YashanDB 23.2的验证测试分享。介绍了YMP的产品信息,包括架构、版本支持等,还详细阐述了外置库部署、YMP部署、访问YMP、数据源管理、任务管理(创建任务、迁移配置、离线迁移、校验初始化、一致性校验)及MySQL迁移的全过程。
|
Oracle 关系型数据库 网络安全
oracle学习1-oracle安装
oracle学习1-oracle安装
252 0
oracle学习1-oracle安装

推荐镜像

更多