GaussDB闪回技术
概念介绍
闪回恢复功能是数据库恢复技术的一环,可以有选择性地撤销一个已提交的事务,将数据从人为不正确的操作中进行恢复。在采用闪回技术之前,只能通过备份恢复、PITR等手段找回已提交的数据库修改,恢复时长需要数分钟甚至数小时。采用闪回技术后,通过闪回drop和闪回truncate恢复已提交的数据库drop/truncate的数据,只需要秒级,而且恢复时间和数据库大小无关。
闪回逻辑图
简单的比喻,闪回类似于虚拟机中的恢复快照、类似于看视频时候的快退操作。
控制闪回的参数主要有两个:
enable_recyclebin
undo_retention_time
使用GaussDB闪回恢复的注意事项:
Astore引擎只支持闪回DROP/TRUNCATE功能。
备机不支持闪回操作。
用户可以根据需要开启闪回功能,开启后会带来一定的性能劣化。
按照产品文档的顺序,本次主要通过 闪回查询、闪回表、闪回drop\truncate 三方面来介绍。
闪回查询
闪回查询可以查询过去某个时间点表的某个snapshot数据,这一特性可用于查看和逻辑重建意外删除或更改的受损数据。闪回查询基于MVCC多版本机制,通过检索查询旧版本,获取指定老版本数据。
整体方案分为三部分:
旧版本保留、快照的维护和旧版本检索。
旧版本保留:新增undo_retention_time配置参数,用来设置旧版本保留的时间,超过该时间的旧版本将被回收清理。
注意:
使用时间点进行闪回时,可能会有3s的误差。想要闪回到精确的操作点,需要使用CSN进行闪回。
使用前参数设置确认
使用示例:
DROP TABLE IF EXISTS "public".flashtest;--创建表flashtest
CREATE TABLE "public".flashtest (col1 INT,col2 TEXT) WITH(storage_type=ustore);--插入数据
INSERT INTO flashtest VALUES(2025,'jiang');--查询当前数据
SELECT * FROM flashtest;
--查询csn
SELECT int8in(xidout(next_csn)) FROM gs_get_next_xid_csn();
--插入数据
INSERT INTO flashtest VALUES(1991,'shifeng');--查询当前数据
SELECT * FROM flashtest;--查询当前时间戳
select now();
--插入数据
INSERT INTO flashtest VALUES(1,'INSERT1'),(2,'INSERT2'),(3,'INSERT3'),(4,'INSERT4'),(5,'INSERT5'),(6,'INSERT6');--查询当前数据
SELECT * FROM flashtest;
--闪回查询某个csn处的表
SELECT * FROM flashtest TIMECAPSULE CSN 1234;
--闪回查询某个时间戳处的表
SELECT * FROM flashtest TIMECAPSULE TIMESTAMP '2025-09-10 15:28:22.184126';
--闪回查询某个时间戳处的表
SELECT * FROM flashtest TIMECAPSULE TIMESTAMP to_timestamp ('2025-09-10 15:28:22.184126', 'YYYY-MM-DD HH24:MI:SS.FF');
--闪回查询某个csn处的表,并对表进行重命名
SELECT * FROM flashtest AS ft TIMECAPSULE CSN 1234;
闪回表
闪回表可以将表恢复至特定时间点,当逻辑损坏仅限于一个或一组表,而不是整个数据库时,此特性可以快速恢复表的数据。闪回表基于MVCC多版本机制,通过删除指定时间点和该时间点之后的增量数据,并找回指定时间点和当前时间点删除的数据,实现表级数据还原。
使用语法
TIMECAPSULE TABLE table_name TO { TIMESTAMP | CSN } expression
使用示例
DROP TABLE IF EXISTS "public".flashtest;--创建表flashtest
CREATE TABLE "public".flashtest (col1 INT,col2 TEXT) WITH(storage_type=ustore);--插入数据
INSERT INTO flashtest VALUES(1,'INSERT1'),(2,'INSERT2');--查询csn
SELECT int8in(xidout(next_csn)) FROM gs_get_next_xid_csn();--查询当前时间戳
SELECT now();SELECT * FROM flashtest;
--插入数据
INSERT INTO flashtest VALUES(3,'INSERT3'),(4,'INSERT4');SELECT * FROM flashtest;
--闪回表至特定csn
TIMECAPSULE TABLE flashtest TO CSN 3351;SELECT * FROM flashtest;SELECT now();
--插入数据
INSERT INTO flashtest VALUES(5,'INSERT5'),(6,'INSERT6');SELECT * FROM flashtest;
--闪回表至此刻之前的特定时间戳
TIMECAPSULE TABLE flashtest TO TIMESTAMP to_timestamp ('2025-09-10 17:00:05.556824', 'YYYY-MM-DD HH24:MI:SS.FF');SELECT * FROM flashtest;SELECT now();
--插入数据
INSERT INTO flashtest VALUES(2025,'jiang'),(1991,'shifeng');SELECT * FROM flashtest;
--闪回表至此刻之后的特定时间戳
TIMECAPSULE TABLE flashtest TO TIMESTAMP '2025-09-10 17:01:40.256371';SELECT * FROM flashtest;
闪回DROP/TRUNCATE
闪回DROP
可以恢复意外删除的表,从回收站(recyclebin)中恢复被删除的表及其附属结构如索引、表约束等。闪回drop是基于回收站机制,通过还原回收站中记录的表的物理文件,实现已drop表的恢复。
闪回TRUNCATE
可以恢复误操作或意外被进行truncate的表,从回收站中恢复被truncate的表及索引的物理数据。闪回truncate基于回收站机制,通过还原回收站中记录的表的物理文件,实现已truncate表的恢复。
主要参数
enable_recyclebin参数用于设置是否启用回收站。
recyclebin_retention_time参数用于设置回收站对象保留时间,超过该时间的回收站对象将被自动清理。
使用示例1:(闪回drop掉的表)
--查看回收站
SELECT * FROM gs_recyclebin;
DROP TABLE IF EXISTS flashtest;--创建表flashtest
CREATE TABLE IF NOT EXISTS flashtest(id int, name text) with (storage_type = ustore);--插入数据
INSERT INTO flashtest VALUES(1, 'A');SELECT * FROM flashtest;
--DROP表flashtest
DROP TABLE IF EXISTS flashtest;--查看回收站,删除的表被放入回收站
SELECT * FROM gs_recyclebin;--查看表flashtest,表不存在
SELECT * FROM flashtest;
--闪回drop表
#直接闪回
TIMECAPSULE TABLE flashtest to before drop;#闪回drop表,表名用回收站中的rcyname
TIMECAPSULE TABLE "BIN$3269233841F9$E26F110==$0" to before drop;#闪回drop表,并重命名表
TIMECAPSULE TABLE flashtest to before drop rename to flashtest_rename;--查看表,表被恢复到drop之前
SELECT * FROM flashtest;
--查看回收站,回收站中的表被删除
SELECT * FROM gs_recyclebin;
使用示例2:(闪回truncate之后的表)
DROP TABLE IF EXISTS flashtest;--创建表flashtest
CREATE TABLE IF NOT EXISTS flashtest(id int, name text) with (storage_type = ustore);--插入数据
INSERT INTO flashtest VALUES(1, 'A');SELECT * FROM flashtest;--truncate表
TRUNCATE TABLE flashtest;--查看回收站,表的数据被放入回收站
SELECT * FROM gs_recyclebin;--查看表,表中的数据为空
SELECT * FROM flashtest;
--闪回truncate表
TIMECAPSULE TABLE flashtest to before truncate;--查看表,表中的数据被恢复
SELECT * FROM flashtest;--查看回收站
SELECT * FROM gs_recyclebin;
--清空回收站
PURGE RECYCLEBIN;--查看回收站,回收站被清空
SELECT * FROM gs_recyclebin;