更新时间:2025-09-19 GMT+08:00
分享

闪回恢复

简介

闪回恢复是数据恢复的其中一环,可以有选择性地撤销一个已提交事务的影响,将数据从误操作中进行恢复。利用数据库回收站功能恢复删除的表、利用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);
    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;

相关文档