MySQL的double write和Oracle对比学习

之前有网友希望我对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还是技高一筹,不过从体系结构上要复杂的多。而且还涉及到更多的细节需要优化。

时间: 2024-10-23 08:54:22

MySQL的double write和Oracle对比学习的相关文章

MySQL和Oracle对比学习之数据字典元数据

MySQL和Oracle虽然在架构上有很大的不同,但是如果从某些方面比较起来,它们有些方面也是相通的. 毕竟学习的主线是MySQL,所以会从MySQL的角度来对比Oracle的一些功能.大体总结了以下的内容,欢迎大家拍砖,查看当前的数据库名mysql> SELECT DATABASE(); +------------+ | DATABASE() | +------------+ | test         | +------------+ 1 row in set (0.00 sec) +++

MySQL和Oracle对比学习之事务

MySQL中的存储引擎很是丰富,常用的有InnoDB,MyISAM等,也查看了不少的资料,基本也有所了解,从一些参考书中看MySQL中的sql部分也是一扫而过,感觉和Oracle中的sql部分没有大的区别. 因为InnoDB和MyISAM存储引擎的一个主要区别就是对于事务的支持,所以自己也复制了oracle中的想法. 简单做了两个测试,只是想练手试一下,结果测试让我很意外. 我创建了两个表myisam_test和innodb_test,做一个insert操作,然后rollback,按照预期的想法

Vertica的这些事<六>—— SQL Server、Oracle、MySQL和Vertica数据库常用函数对比

SQL Server.Oracle.MySQL和Vertica数据库常用函数对比 Vertica数据库是HP公司新收购的用于BI方面的数据库. 绝对值 S:select abs(-1) value O:select abs(-1) value from dual M:select abs(-1) value from dual V:select abs(-1) 向上取整 S:select ceiling(-1.001) value O:select ceil(-1.001) value from

MongoDB系列教程(五):mongo语法和mysql语法对比学习_MongoDB

我们总是在对比中看到自己的优点和缺点,对于mongodb来说也是一样,对比学习让我们尽快的掌握关于mongodb的基础知识. mongodb与mysql命令对比     关系型数据库一般是由数据库(database).表(table).记录(record)三个层次概念组成.而非关系型数据库mongodb是由数据库(database).集合(collection).文档对象(document)三个层次组成.mongodb对于关系型数据库里的表,没有行和列的关系概念,这体现了模式的自由特点. 语法命

oracle数据库学习入门篇

oracle创建表空间及用户 oracle的学习对于像我这样的新手,还是要一步一步来,先把基本概念搞清楚. 我觉得oracle学习可以分为几个部分: 系统基本使用 系统调优 sql语句编写 sql调优 PL/SQL程序开发 以下讨论都是在单主机模式下进行.欢迎讨论指正. 问题1:什么是实例? 一个oracle软件安装完之后,它有一个默认的实例(instance),同时用户还可以在oracle中增加实例. 实例是一个内存结构(SGA+后台进程),每个实例有一组自己的进程组,用来管理运行实例.实例中

MySQL中如何实现类似Oracle的序列

Oracle一般使用序列(Sequence)来处理主键字段,而MySQL则提供了自增长(increment)来实现类似的目的: 但在实际使用过程中发现,MySQL的自增长有诸多的弊端:不能控制步长.开始索引.是否循环等:若需要迁移数据库,则对于主键这块,也是个头大的问题. 本文记录了一个模拟Oracle序列的方案,重点是想法,代码其次. Oracle序列的使用,无非是使用.nextval和.currval伪列,基本想法是:1.MySQL中新建表,用于存储序列名称和值:2.创建函数,用于获取序列表

突破瓶颈,对比学习:Eclipse开发环境与VS开发环境的调试对比

曾经看了不少Java和Android的相关知识,不过光看不练易失忆,所以,还是写点文字,除了加强下记忆,也证明我曾经学过~~~ 突破瓶颈,对比学习: 学习一门语言,开发环境很重,对于VS的方形线条开发环境有先入为主的先天因素. 因此多年以来(从学校开java课),对Eclipse那椭圆形的线条,似乎有点抗拒或格格不入的情怀.   抗拒情怀其实是一种瓶颈,如果不突破,很容易被局限,不管是跨语言的水平扩展突破,还是语言内的突破,都是同理. 只要是开发者,总会遇到到瓶颈,而这瓶颈久久不能突破,就是抗拒

Oracle的学习路径与方法讨论

总结了一下大家的意见,也加了一些个人的看法,Oracle的学习路径,可供参考:      初级阶段:可以从OCP教材开始,还有文档中的Administrator's Guide.Concepts.Performance Tuning Guide.Backup and Recovery Advanced User's Guide.Backup and Recovery Basics.特别是Administrator's Guide.Concepts.Performance Tuning Guide

数据库(mysql oracle)学习小结

数据库概念 oracle数据库 一组:数据文件.控制文件.日志文件 oracle实例,它与数据库的关系 oracle实例:实例就是数据库启动后分配的内存和建立的后台进程. 数据库关闭后,物理上的文件还存在,但实例(分配的内存和建立的进程)就没有了 数据库:物理操作系统文件或磁盘(disk)的集合. 关系:  实例就是一组操作系统进程(或者是一个多线程的进程)以及一些内存.这些进程可以操作数据库:而数据库只是一个文件集合(包括数据文件.临时文件.重做日志文件和控制文件).     在任何时刻,一个