瀚高数据库闪回技术介绍
闪回技术在数据库功能中算是一个使用频率不高、但在关键时刻非常有用的技术。闪回需求的出现,往往是数据库进行错误操作之后,想要快速进行错误弥补的时候。但这种情况下,数据库的数据往往已经进行删除或更新操作,并且这些更新事务已经提交。
这个时候,如果操作者不想依赖于数据备份的技术,想通过某些更快捷的方式进行错误数据恢复,那么闪回技术就是一个非常好的选择,这是一种能够用于快速恢复逻辑错误的技术,可以通过SQL语句对行级和事务级的数据进行恢复,通过闪回可以迅速的实现数据恢复,能够在短时间内恢复错误操作造成的数据错误问题,达到快速且最小损失的恢复目的。
瀚高数据库闪回应用场景
1、数据库逻辑层面出现错误操作的场景,前提是历史数据没有被vacuum进程清理掉、数据表/库没有被drop。
2、不想采用介质恢复方式,并且恢复过程需要更高的易用性、更强的可用性以及更短的还原时间。
瀚高数据库闪回技术原理
在瀚高数据库中,能够实现闪回其实是借助于自身的多版本并发控制(缩写为MVCC,Multi-VersionConcurrencyControl)机制,通过使用延迟垃圾回收、脏读、行头事务号、事务提交日志,最终实现DML操作的闪回。
MVCC为了避免读写事务之间的互相阻塞,并且能够在并发访问中对数据保持一致性,针对一个数据不同的操作,会同时保留多个版本,因此写数据时,旧版本的数据并不删除,旧数据被“标记为删除”后依然保留在数据文件中。
而为了避免旧版本数据过多,数据库会通过运行vacuum进程来回收之前的存储空间,也就是说,在vacuum清理之前,这些“被删除”的数据,以一种“不可见”的废旧元组状态依然还存在于page页中。
因此,正是因为有了这些“不可见”的废旧元组,在控制vacuum进程的前提下,操作者就能够通过借助多版本并发控制机制特性,闪回查询过去某个时间点或者某个事物可见的数据。
目前为止,瀚高研发与实现的闪回查询功能,能够实现数据库查询过去某个时间点表中数据信息及根据事务号查询表中数据信息的功能。
瀚高研发与实现的闪回版本查询,可以查看一行记录在一段时间内的变化情况,即查询一行记录的多个提交的版本信息。
闪回查询配置参数
想要在瀚高数据库中成功实现闪回查询,将会需要提前配置以下参数:
参数配置说明:
参数1:track_commit_timestamp
它能够记录transaction的提交时间,默认值是off,如果想要使用闪回查询,需要将它开启跟踪记录事务提交的时间戳。
当设置track_commit_timestamp=on时,意味着开启事务提交时间跟踪,可以从xid得到事务结束的时间。
参数2:hg_fbq_rentention
它规定了闪回查询数据的保存时间,在时间范围设定好后,规定时间范围内的数据不允许进行autovacuum操作。
而实际情况是如果随意关闭autovacuum,旧版本数据没有及时清理,那么将会导致数据库空间膨胀,性能下降,更严重的情况会导致宕机。在实际测试中,在开启闪回功能时,确实存在造成表容量变大的情况,特别是在更新比较频繁的时候,对检索性能造成一定的损耗,经多次测试建议最大值不超过432000。
因此,虽然在设定hg_fbq_rentention的时间范围内,允许操作者手工vacuum清理,但是操作者仍然需要设定一个较为合理的范围值。
但实际情况下,即使不能autovacuum也不会出现数据库空间无限制膨胀的情况,当事物号XID快用完时,数据库会强制启动vacuum对事务ID进行回收,此时以上参数不进行控制。Vacuum之后闪回数据会丢失,此时进行闪回查询时返回结果为空。
参数3:hg_fbq_guarantee
它规定了闪回查询时的vacuum具体操作模式,该参数在hg_fbq_retention参数设置后生效。
开启闪回查询后,若该参数为off,则允许手工vacuum操作hg_fbq_retention参数设置时间之内的数据,但autovacuum操作不允许清除hg_fbq_retention参数设置时间之内的数据。
开启闪回查询后,若该参数为on,则所有的vacuum操作都不允许清理hg_fbq_rentention配置时间范围内的数据。
操作示例
以下操作示例参考《瀚高安全版数据库系统V4.5-管理手册》。操作示例如下:
闪回查询
指定时间点闪回查询
功能描述:在SELECT中使用FLASHBACK子句指定过去时间点查询。
示例:
指定事务号闪回查询
功能描述:在SELECT中使用FLASHBACK子句指定事务号查询。
示例:
闪回版本查询
指定时间点闪回版本查询
功能描述:在SELECT中使用FLASHBACKBETWEEN子句指定时间点查询。
示例:
指定事务号闪回版本查询
功能描述:在SELECT中使用FLASHBACKBETWEEN子句指定事务号查询。
示例1:
示例2:
在同一个事务中对一行更新多次,只显示最后一次提交的版本。
恢复操作
闪回查询可以支持数据恢复,将数据恢复到过去某个时刻的状态。
示例1:
在更新时,未指定where条件,导致全表更新,闪回查询过去时间点的数据放到临时表,从临时表恢复原数据或者重命名表。
示例2:
使用UPDATE... (SELECT ... FLASHBACK ...)恢复数据。
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
添加我为好友,拉您入交流群!
请使用微信扫一扫!