全部產品
Search
文件中心

PolarDB:閃回刪除

更新時間:Jul 06, 2024

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)