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 | 開啟或者關閉閃回刪除功能。取值:
|
文法
閃回刪除功能支援以下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)