闪回删除

PolarDB PostgreSQL版中没有undo日志,开发或运维人员如果误操作(例如DROP TABLE)可能会导致数据丢失。PolarDB PostgreSQL版支持闪回删除功能,用于快速恢复已经删除的表,以及查看和清理回收站等,方便您找回数据。

前提条件

支持的PolarDB PostgreSQL版的版本如下:

  • PostgreSQL 11(内核小版本1.1.30及以上)

  • PostgreSQL 14(内核小版本14.9.15.0及以上)

说明

您可通过如下语句查看PolarDB PostgreSQL版的内核小版本的版本号:

  • PostgreSQL 11

    show polar_version;
  • PostgreSQL 14

    select version();

注意事项

  • 建议在删除重要表时打开闪回删除功能,日常业务操作请谨慎使用。

  • 闪回删除是将已删除的表转存到回收站模式空间下,并非真正意义上的删除表,所以表所占用的空间并没有被释放。因此,数据长期积累可能会导致磁盘空间占用较大,建议定期清理回收站。

  • 闪回删除功能开启状态下,表被删除后,在执行表的相关依赖项删除操作时可能会失败(因为表并未被真正删除,表依旧依赖这些依赖项)。

  • 由于删除的表转存在recyclebin(回收站)模式空间下,因此避免创建名称为recyclebin的模式,因为recyclebin模式下的表会被purge recyclebin语法清理掉。

  • 打开闪回删除功能后,不支持以下删除操作:

    • 分区表和临时表不支持闪回删除,会被真正删除,无法恢复。

    • 不支持sql_drop事件触发器。

参数说明

参数名称

数据类型

参数说明

polar_enable_flashback_drop

BOOL

打开或者关闭闪回删除功能。取值:

  • ON:打开。

  • OFF:关闭(默认)。

语法

闪回删除功能支持以下SQL语法:

  • 删除策略

    drop table table_name;         #放入回收站。
    drop table table_name purge;   #完全删除,无法恢复。
  • 恢复删除的表

    flashback table table_name to before drop;                        #恢复删除的表(重名的表则恢复最新的表)。
    flashback table table_name to before drop rename to table_name_1; #恢复删除的表并重命名。
  • 彻底删除回收站中的表

    purge table table_name;       
    说明

    重名的表则删除最旧的表。

  • 清空回收站

    purge recyclebin;   
    说明

    清空回收站需要polar_super_user权限。

  • 查看回收站信息

    show recyclebin;      

示例

  • 准备测试数据:

    创建表test1和表test2,并插入数据。

    CREATE TABLE test1(id int primary key, name text);
    
    CREATE TABLE test2(id int primary key, name text);
    
    INSERT INTO test1 select t,repeat('test1',1024) from generate_series(1, 10000) as t;
    
    INSERT INTO test2 select t,repeat('test2',1024) from generate_series(1, 10000) as t;
    \dt

    显示结果如下:

             List of relations
     Schema | Name  | Type  |  Owner
    --------+-------+-------+----------
     public | test1 | table | postgres
     public | test2 | table | postgres
    (2 rows)
  • 删除表并查看回收站。

    • 删除表test1和表test2

      DROP TABLE test1;
      
      DROP TABLE test2;
      
      \dt

      显示结果如下:

      Did not find any relations.
    • 查看回收站。

      show recyclebin;

      显示结果如下:

       table_catalog |         table_name          | table_type
      ---------------+-----------------------------+------------
       postgres      | public$test1$69461331094004 | BASE TABLE
       postgres      | public$test2$69461332967609 | BASE TABLE
      (2 rows)
  • 闪回删除的表:

    • 恢复删除的表。

      FLASHBACK TABLE test1 TO BEFORE DROP;
      
      FLASHBACK TABLE test2 TO BEFORE DROP RENAME TO test3;
      
      \dt

      显示结果如下:

         List of relations
       Schema | Name  | Type  |  Owner
      --------+-------+-------+----------
       public | test1 | table | postgres
       public | test3 | table | postgres
      (2 rows)
      说明

      其中表test2被重命名为test3

    • 查看恢复后的数据。

      查看表test1的数据。

      SELECT count(*) FROM test1;

      显示结果如下:

       count
      -------
       10000
      (1 row)

      查看表test3的数据。

      SELECT count(*) FROM test3;

      显示结果如下:

       count
      -------
       10000
      (1 row)