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

注意事项

  • 建议在删除重要表时打开闪回删除功能,日常业务操作请谨慎使用。
  • 闪回删除是将已删除的表转存到回收站模式空间下,并非真正意义上的删除表,所以表所占用的空间并没有被释放。因此,数据长期积累可能会导致磁盘空间占用较大,建议定期清理回收站。
  • 闪回删除功能开启状态下,表被删除后,在执行表的相关依赖项删除操作时可能会失败(因为表并未被真正删除,表依旧依赖这些依赖项)。
  • 由于删除的表转存在recyclebin(回收站)模式空间下,因此避免创建名称为recyclebin的模式,因为recyclebin模式下的表会被purge recyclebin语法清理掉。
  • 打开闪回删除功能后,不支持以下删除操作:
    • 分区表和临时表不支持闪回删除,会被真正删除,无法恢复。
    • 不支持sql_drop事件触发器。

参数说明

参数名称数据类型参数说明
polar_enable_flashback_dropBOOL打开或者关闭闪回删除功能。取值:
  • 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)