
# 闪回恢复
#### 简介
闪回恢复是数据恢复的其中一环，可以有选择性地撤销一个已提交事务的影响，将数据从误操作中进行恢复。利用数据库回收站功能恢复删除的表、利用MVCC机制恢复到指定时间点或者CSN点。闪回恢复使用场景如下：
- 基于MVCC多版本机制的数据恢复：适用于对表的误操作DML造成的影响进行恢复。
- 基于数据库回收站恢复：适用于对表的DROP、TRUNCATE误操作的恢复。
![](https://support.huaweicloud.com/centralized-devg-v8-gaussdb/public_sys-resources/notice_3.0-zh-cn.png)
- Astore引擎只支持闪回恢复DROP/TRUNCATE功能。
- 备机不支持闪回恢复操作。
- 用户可以根据需要开启闪回恢复功能，开启后会带来一定的性能劣化。
 
#### 闪回查询
- **简介**
  闪回查询可以查询过去某个时间点表的某个snapshot数据，这一特性可用于查看和逻辑重建意外删除或更改的受损数据。闪回查询基于MVCC多版本机制，通过检索查询旧版本，获取指定旧版本数据。
  
- **前提条件**
  需要设置GUC参数undo_retention_time，该参数的值表示旧版本undo的保留时间。
  
- **示例**
  ```
  --前置操作建表和插入数据。
  gaussdb=# CREATE TABLE tb_t1 (c1 int, c2 int) WITH(storage_type = ustore);
  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);
  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);
  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;
  ```
  
 
