绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
不同数据库间的闪回方案对比
2020-05-19 17:33:03

这几天在研究数据库的闪回方案,在选择文章图片时,想到了《你的名字》,感觉这部电影和闪回很相似啊,一个是通过交换灵魂得到灾难信息从而避祸,一个是回退错误得到正确状态。两者都是通过“时空穿越”来拯救灾难。
闪回概念是Oracle先提出来的,我们看一下Oracle对于闪回的解释:
尽管采取了预防措施,但还是会发生人为错误。 Oracle数据库闪回技术是一组独特且丰富的数据恢复解决方案,可通过有选择地有效地进行回滚操作来逆转人为错误。 在闪回之前,损坏数据库可能需要几分钟,而恢复数据库需要花费数小时。 使用闪回,纠正错误所花费的时间不会比产生错误所花费的时间长。 而且,从此恢复正确的状态所需的时间不取决于数据库大小,这是Oracle数据库独有的功能。
其本质是为了回退错误操作产生的,避免人为的“灾难”,并且要能够快速回退。
那么我们看一下Oracle能够实现的闪回方案:

  • 闪回数据库:使用Oracle优化的闪回日志,而不是通过备份和正向恢复,将整个数据库还原到特定的时间点。命令是为了加快原本很慢的时间点数据库恢复(point in time database recovery)过程。闪回可以取得完整的数据库恢复和使用归档日志的前滚,主要目的是加快从“意外状态“中恢复。闪回数据库基于闪回日志flashback log,闪回日志包含已修改数据块的”前影像“,可用于将数据库恢复到该时间点之前的状态。闪回数据库允许复原整个数据库到具体的时间点,从而撤销该时间点以来的所有数据库的变化 用户误删除表中数据、删除表、truncate表、索引、触发器,表空间等。Dba误操作等。简而言之,所有操作都可以闪回。
  • 闪回表:轻松地将表恢复到特定的时间点,当逻辑损坏仅限于一个或一组表而不是整个数据库时,此功能很有用。复原一个表到某个时间点,或者某个SCN而不用回复数据文件。闪回表依赖UNDO数据,当表结构改变的时候,不能进行闪回。
  • 闪回删除:恢复意外删除的表。它从回收站(所有删除对象的逻辑容器)恢复删除的表及其所有索引,约束和触发器。用户恢复被误删除的表。允许你从当前数据库中恢复一个被drop的对象。在执行drop操作时,现在oracle不是真正删除他,而是将对象自动放入回收站,对于一个对象的删除,其实就是一个简单的重命令操作,并且所在的表空间不变。表上面的约束也在放在回收站里面,在闪回后,索引的名称还是系统默认的,需要手工还原。表上的物化视图日志不会随着表的删除而放入回收站。
  • 闪回事务:撤消单个事务及其所有从属事务的影响。通过单个PL / SQL操作或使用企业管理器向导。
  • 闪回事务查询:查看特定事务所做的所有更改,当错误事务更改了多行或多表中的数据时很有用。实际上是查询的数据字典flashback_transaction_query。可以根据flashback_transaction_query 的undo_sql列值返回数据以前版本。
  • 闪回查询:查询过去某个时间点的任何数据。此强大功能可用于查看和逻辑上重建可能已无意删除或更改的损坏数据。基本的闪回功能,直接利用回滚段中的旧数据构造某一个时刻的一致性数据版本。只适合单个表数据恢复。对事务中相关多表数据恢复不适合,无法确保相关数据的参照完整性。
  • 闪回版本查询:在指定的时间间隔而不是单个时间点检索行的不同版本。
  • 全面召回:有效管理和查询长期历史数据。 Total Recall会自动跟踪对数据库中存储的数据所做的每一个更改,并维护历史数据的安全,高效和易于访问的存档。闪回数据归档(Flashback Data Archive)。通过这一功能Oracle数据库可以将UNDO数据进行归档,从而提供全面的历史数据查询,也因此Oracle引入一个新的概念Oracle Total Recall也即Oracle全面回忆功能

从上而知,Oracle具有强大的闪回能力,整个闪回能力主要是基于三个重要的技术手段:UNDO日志回收站以及REDO日志
REDO日志也就是重做日志文件(redo log file),Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文件。这两类重做日志文件都用于恢复;其主要目的是,万一实例失败或介质失败,它们能够恢复数据。
UNDO表空间,从概念上讲,undo正好与redo相对。你对数据执行修改时,数据库会生成undo信息,这样万一你执行的事务或语句由于某种原因失败了,或者如果你用一条ROLLBACK语句请求回滚,就可以利用这些undo信息将数据放回到修改前的样子。redo用于在失败时重放事务(即恢复事务),undo则用于取消一条语句或一组语句的作用。UNDO主要用来做事务恢复或回滚操作的。例如,当我们执行操作时,意外发生错误,导致事务终止,这时候有可能会用到undo表空间进行回退,再比如我们的闪回操作,手动回退错误操作。
另外,UNDO与REDO一起配合保证数据的一致性。

https://www.cnblogs.com/hellojesson/p/4553853.html

我们从上面的流程图来理解一下oracle是如何保证读一致性的:
当我们执行一个事务的时候,oracle会分配一个SCN编号,这个编号是递增的。下一个事务的编号一定比当前事务的编号大。上图中执行个事务分配的编号为10023,在这个事务执行的过程中,另一事务对SCN 编号为10008和10021的数据块进行了修改。用来替换的数据块SCN编号为10024 ,而被替换掉的数据块会被保存到undo 上面。当个事务执行到被修改过的数据块时,发现10024比10023大,这个时候就会到undo segment上找比自己SCN号小的数据块进行读,于是发找到了SCN号为10008和10021两个块。这样就有效的保证了读一致性。
那么我对于Oracle的闪回技术的理解是,它的闪回技术路线大体为:

如果有不当之处,望专家指正

整个闪回技术的核心是undo表空间。正式由于将历史数据放到了undo表空间,Oracle可以快速的获得历史版本数据,从而完成闪回查询;同时,我们可以利用undo表空间得到各个事务完成提交时的数据,即闪回版本查询;因此表的各个版本能够查到,那么我们就可以对表闪回,即闪回表;undo信息结合redo日志,可以得到历史操作,比如update,被更新数据存储到undo表空间,更新后的数据存储在redo数据(这点不是很确定,我看到很多文章在说闪回事务查询需要开启日志追加能力,但不清楚原理),即闪回事务查询;自动执行指定的undo sql,就完成了闪回事务;那么对元数据进行闪回操作,即可造成被删除的印象,从而对元数据闪回就得到了闪回删除,而这部分元数据的空间,作为“回收站”;对undo表空间jin性归档,从而能够对整个数据库进行闪回,即闪回数据库,从而能够更快的完成数据库的恢复;而有了完整的undo信息,那么整个数据库的历史版本就有了,从而有了全面召回的能力。
以上是对Oracle的闪回分析,那么按照Oracle的闪回逻辑看一下其他数据库。

SQL Server

SQL Server是利用数据库快照进行数据库闪回操作

database snapshot,一个数据库(源数据库)的事务一致的只读静态视图。 源数据库 (source database),对于数据库快照,指的是在其上创建快照的数据库。 数据库快照与源数据库相关。 数据库快照必须与数据库在同一服务器实例上。 此外,如果数据库因某种原因而不可用,则它的所有数据库快照也将不可用。
稀疏文件 (sparse file),NTFS 文件系统提供的文件,需要的磁盘空间要比其他文件格式少很多。 稀疏文件用于存储复制到数据库快照的页面。 创建稀疏文件时,稀疏文件占用的磁盘空间非常少。 随着数据写入数据库快照,NTFS 会将磁盘空间逐渐分配给相应的稀疏文件。

MySQL

MySQL利用binlog进行闪回事务查询,得到undo sql,从而进行闪回事务查询

REDO日志,从概念上讲,redo日志即WAL日志,用于数据恢复,保证事务的持久性。

UNDO日志,undo日志是配合redo日志来使用的,因为某些原因导致事务失败或回滚了,可以借助该undo进行回滚。undo日志同时能够保证数据一致性。例如,当数据库发生DML操作时,其他事务正在读取。

BINLOG,记录了所有的DDL和DML语句(除了数据查询语句select),以事件形式记录,还包含语句所执行的消耗的时间等。可以用于逻辑复制等操作。阿里利用binlog进行闪回事务查询。利用binlog日志进行反向推理,得到undo sql。

T-TDSQL

T-TDSQL是腾讯出品的基于MySQL的全时态数据库。能够使数据库恢复到任意时间点的状态,即闪回查询、闪回版本查询、闪回表、闪回数据库、全面召回

时态数据库,时态数据主要指随时间推移不断发生变化的数据。时态数据库保留了所有数据的时间变化状态。

回滚段,腾讯将MySQL的undo数据进行格式处理,并且进行转储、归档。当数据库需要时进行全时态数据查询。

HTAC,回滚段按照K-V形式存储,并进行异步转储到AP集群,几乎不影响数据库整体性能。在进行全时态数据分析时,数据库会对K-V数据进行分析。从而保证了事务性与分析性的兼顾。

GuassDB

基于PostgreSQL开发的GuassDB,目前能够看到的资料过少,仅能通过文章看到支持闪回版本查询,和闪回删除操作。

PostgreSQL

闪回删除,建立Trash模式,当数据库进行drop或者TRUNCATE时,将对象放入到Trash模式中。

优点:可以完成对象闪回。
缺点:目前对于依赖项识别不清,功能过于简单,难以完成复杂操作的闪回,比如存在依赖项。

闪回版本查询,利用pg_dirtyread插件其使用track_commit_timestamp,vacuum_defer_cleanup_age两个参数,开启事务对应时间信息记录以及延迟清理数据,以此为基础进行闪回操作。通过读取物理物件,进行数据分析,得到历史版本数据。

优点:能够完成表级数据闪回。
缺点:由于数据变多,严重影响数据库性能。

进一步的PostgreSQL闪回方案,可以参考德哥的博客:yq.aliyun.com/articles/

下一步会根据以上信息,结合PostgreSQL的存储进行设计闪回方案。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

华山论剑
创建时间:2019-02-22 18:53:00
没了烟火气,人生就是一段孤独的旅程·····于是,在ITPUB,我们以武论英雄!
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • 栈栈
    栈主
  • ?
    嘉宾

小栈成员

查看更多
  • u_9a3ed7a37f8e4a
  • daisyplay
  • boss_ch
  • Jack2k
戳我,来吐槽~