全部產品
Search
文件中心

PolarDB:閃回刪除

更新時間:Jul 06, 2024

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)