闪回恢复
简介
闪回恢复是数据恢复的其中一环,可以有选择性地撤销一个已提交事务的影响,将数据从误操作中进行恢复。利用数据库回收站功能恢复删除的表、利用MVCC机制恢复到指定时间点或者CSN点。闪回恢复使用场景如下:
- 基于MVCC多版本机制的数据恢复:适用于对表的误操作DML造成的影响进行恢复。
- 基于数据库回收站恢复:适用于对表的DROP、TRUNCATE误操作的恢复。

- Astore引擎只支持闪回恢复DROP/TRUNCATE功能。
- 备机不支持闪回恢复操作。
- 用户可以根据需要开启闪回恢复功能,开启后会带来一定的性能劣化。
闪回查询
- 简介
闪回查询可以查询过去某个时间点表的某个snapshot数据,这一特性可用于查看和逻辑重建意外删除或更改的受损数据。闪回查询基于MVCC多版本机制,通过检索查询旧版本,获取指定旧版本数据。
- 前提条件
需要设置GUC参数undo_retention_time,该参数的值表示旧版本undo的保留时间。
- 示例
--前置操作建表和插入数据。 gaussdb=# CREATE TABLE tb_t1 (c1 int, c2 int) WITH(storage_type = ustore) DISTRIBUTE BY REPLICATION; gaussdb=# INSERT INTO tb_t1 values (1,1),(2,2); --查询当前时间和CSN。 gaussdb=# SELECT now(), int8in(xidout(next_csn)) FROM gs_get_next_xid_csn() limit 1; now | int8in -------------------------------+--------- 2025-04-22 15:22:47.574995+08 | 2020912 (1 row) --模拟数据误操作。 gaussdb=# UPDATE tb_t1 SET C1=222,C2=222 WHERE C1 = 2; gaussdb=# SELECT * FROM tb_t1; c1 | c2 -----+----- 1 | 1 222 | 222 (2 rows) --根据时间查询该表修改之前的数据。 gaussdb=# SELECT * FROM tb_t1 TIMECAPSULE TIMESTAMP '2025-04-22 15:22:47.574995'; c1 | c2 ----+---- 1 | 1 2 | 2 (2 rows) --根据CSN查询该表修改之前的数据。 gaussdb=# SELECT * FROM tb_t1 TIMECAPSULE CSN '2020912'; c1 | c2 ----+---- 1 | 1 2 | 2 (2 rows) --删除。 gaussdb=# DROP TABLE tb_t1;
闪回表
- 简介
闪回表可以将表恢复至特定时间点,当逻辑损坏仅限于一个或一组表,而不是整个数据库时,此特性基于MVCC多版本机制可以将表恢复至指定时间点或CSN点,实现表级数据还原。
- 前提条件
需要设置GUC参数undo_retention_time,该参数的值表示旧版本undo的保留时间。
- 示例
--前置操作建表和插入数据。 gaussdb=# CREATE TABLE tb_t2 (c1 int, c2 int) WITH(storage_type = ustore) DISTRIBUTE BY REPLICATION; gaussdb=# INSERT INTO tb_t2 VALUES (1,1),(2,2); --查询当前时间和CSN。 gaussdb=# SELECT now(), int8in(xidout(next_csn)) FROM gs_get_next_xid_csn() limit 1; now | int8in ------------------------------+--------- 2025-04-22 15:32:22.99132+08 | 2021175 (1 row) --模拟数据误操作。 gaussdb=# UPDATE tb_t2 SET c1 = 222, c2 = 222 WHERE C1 = 2; gaussdb=# SELECT * FROM tb_t2; c1 | c2 -----+----- 1 | 1 222 | 222 (2 rows) --将表闪回至误操作之前时间点。 gaussdb=# TIMECAPSULE table tb_t2 TO TIMESTAMP to_timestamp('2025-04-22 15:32:22.99132','YYYY-MM-DD HH24:MI:SS.FF'); gaussdb=# SELECT * FROM tb_t2; c1 | c2 ----+---- 1 | 1 2 | 2 (2 rows) --也可以使用如下SQL,根据CSN闪回该表。 gaussdb=# UPDATE tb_t2 SET c1 = 333, c2 = 333 where c1 = 2; gaussdb=# TIMECAPSULE table tb_t2 TO CSN 2021175; gaussdb=# SELECT * FROM tb_t2; c1 | c2 ----+---- 1 | 1 2 | 2 (2 rows) --删除。 gaussdb=# DROP TABLE tb_t2;
闪回DROP/TRUNCATE
- 简介
- 闪回DROP:可以恢复意外删除的表,从回收站(recycle bin)中恢复被删除的表及其附属结构,如索引、表约束等。闪回DROP是基于回收站机制,通过还原回收站中记录的表的物理文件,实现已DROP表的恢复。
- 闪回TRUNCATE:可以恢复误操作或意外被进行TRUNCATE的表,从回收站中恢复被TRUNCATE的表及索引的物理数据。闪回TRUNCATE基于回收站机制,通过还原回收站中记录的表的物理文件,实现已TRUNCATE表的恢复。
- 前提条件
- 设置GUC参数enable_recyclebin的值为on,启用回收站功能。
- 设置GUC参数recyclebin_retention_time,该参数的值为回收站保留对象的时间,超时的对象回收站会自动清理。
- 示例
--前置操作建表和插入数据。 gaussdb=# CREATE TABLE tb_t3 (c1 int,c2 int) WITH(storage_type = ustore) DISTRIBUTE BY REPLICATION; gaussdb=# INSERT INTO tb_t3 VALUES (1,1), (2,2); --删除该表。 gaussdb=# DROP TABLE tb_t3; --闪回至删除之前。 gaussdb=# TIMECAPSULE TABLE tb_t3 TO BEFORE DROP; gaussdb=# SELECT * FROM tb_t3; c1 | c2 ----+---- 1 | 1 2 | 2 (2 rows) --使用TRUNCATE清空该表。 gaussdb=# TRUNCATE TABLE tb_t3; --闪回至清空之前。 gaussdb=# TIMECAPSULE TABLE tb_t3 TO BEFORE TRUNCATE; gaussdb=# SELECT * FROM tb_t3; c1 | c2 ----+---- 1 | 1 2 | 2 (2 rows) --删除。 DROP TABLE tb_t3;