Flashback query
PolarDB的闪回查询(Flashback Query)功能,提供高效地,在当前实例,对历史某个时间点数据查询的能力。通过innodb_backquery_enable参数打开Flashback Query功能,并通过innodb_backquery_window设置需要回查的时间范围。之后,对数据库的查询操作都可以通过AS OF TIMESTAMP关键字来指定需要查看数据的历史时间点。通过闪回查询我们我们可以方便的查询之前几秒,几个小时甚至几天的数据。
闪回查询使用
PolarDB的闪回查询当前已在5.6、5.7及8.0发布上线。具体信息见文档https://www.alibabacloud.com/help/zh/polardb-for-mysql/latest/flashback-query
参数及操作
参数介绍
innodb_backquery_enable : ON为打开闪回查询,OFF为关闭 innodb_backquery_window : 闪回查询时间窗口,1~30243600单位秒,默认一天
操作
打开关闭闪回查询 set global innodb_backquery_enable=ON; set global innodb_backquery_enable=OFF; 闪回查询语句 select * from table_name AS OF TIMESTAMP ‘2022-06-26 13:25:00’;
举例参考

闪回查询实现原理
PolarDB的闪回查询(Flashback Query)功能,实现是基于Innodb的多版本并发控制机制,即结合ReadView和Undo来查询当前事务可见的历史版本,Undo来构建历史版本,ReadView决定应该选择的具体版本。 由于PolarDB的闪回查询功能支持以及秒级粒度(即查询的数据时间差在1秒内)的数天甚至更久的回查,所以这里面要解决两个问题:1.如何做到秒级粒度的查询;2.如何支持数天甚至更久的历史数据回查。 针对秒级粒度回查这个问题,PolarDB内部会每隔1秒钟将当前的ReadView及对应的时间戳保存到一个系统表里面,在进行闪回查询时,我们根据语法解析出要查询的时间点,并从系统表中查到该时间点对应的ReadView,将该ReadView替换为trx的ReadView,并将trx旧的ReadView暂时保存,当该句闪回查询结束时,再将旧的ReadView替换回去。闪回查询从语法角度看是语句级别的,可以在一个事务内指定不同的时间进行闪回查询。 针对要支持数天甚至更久的历史数据回查,这就需要Undo保留足够久的数据,即数据不能更早的purge掉,我们在这里用闪回查询存ReadView的系统表中最老的ReadView来做Undo的purge view,这样Undo保留的时间就有闪回查询系统表最老的Readview来做限制,进而可以支持数天甚至更久的闪回查询。 整体上来说就是:开启闪回查询功能后,每隔1秒钟,会记录一个当前的ReadView及时间戳到闪回查询系统表,系统表中ReadView保留的时间有参数innodb_backquery_window来进行控制,超过的会自动清理掉,每隔一秒钟会用该系统表中最老的ReadView更新purge view。在backquery查询进来时,解析出对应时间戳后,从该系统表查到对应的ReadView,替换trx的ReadView,使用Innodb的MVCC机制查询历史数据,查询语句结束时将ReadView再替换回来。具体流程可参考下图:

后续演进
PolarDB当前已经有一套健全的备份恢复机制,来满足用户各种场景的需求,后面会沿着两个方向继续完善这套机制:1.现有方案继续完善,提供更快更准确的备份恢复能力;2.完善FlashBack体系,使得拥有更强大的在线回溯能力。




