本文介紹了PolarDB PostgreSQL版的閃回表功能。
前提條件
支援的PolarDB PostgreSQL版的版本如下:
PostgreSQL 11(核心小版本1.1.22及以上)
您可通過如下語句查看PolarDB PostgreSQL版的核心小版本的版本號碼:
show polar_version;
簡介
閃回表
閃回表 (Flashback Table) 功能通過定期保留資料頁面快照到閃回日誌中,保留事務資訊到快速恢複區中,支援使用者將某個時刻的表資料恢複到一張新的表中。
文法
FLASHBACK TABLE
[ schema. ]table
TO TIMESTAMP expr;
文法參數說明:
參數名稱 | 參數說明 |
[ schema. ]table | 需要執行閃回操作的表名稱。 |
expr | 需要閃回資料的時間。 |
樣本
準備測試資料。
建立表
test
,並插入資料。CREATE TABLE test(id int); INSERT INTO test select * FROM generate_series(1, 10000);
查詢
test
表中總共有多少行資料。SELECT count(1) FROM test;
顯示結果如下:
count ------- 10000 (1 row)
對
id
進行求和。SELECT sum(id) FROM test;
顯示結果如下:
sum ---------- 50005000 (1 row)
等待10秒並刪除
test
表中的資料。SELECT pg_sleep(10); DELETE FROM test;
查詢刪除後的
test
表。SELECT * FROM test;
顯示結果如下:
id ---- (0 rows)
閃回表
test
10秒之前的資料。FLASHBACK TABLE test TO TIMESTAMP now() - interval'10s';
顯示結果如下:
NOTICE: Flashback the relation test to new relation polar_flashback_65566, please check the data FLASHBACK TABLE
查詢閃回後的表資料。
查詢閃回後的表資料總行數。
SELECT count(1) FROM polar_flashback_65566;
顯示結果如下:
count ------- 10000 (1 row)
對閃回後的
id
求和。SELECT sum(id) FROM polar_flashback_65566;
顯示結果如下:
sum ---------- 50005000 (1 row)
使用指南
閃回表功能依賴閃回日誌和快速恢複區功能,需要設定polar_enable_flashback_log
和polar_enable_fast_recovery_area
參數並重啟。其他的參數也需要按照需求來修改,建議一次性修改完成並在業務低峰期重啟。開啟閃回表功能將會增大記憶體、磁碟的佔用量,並帶來一定的效能損失,請謹慎評估後再使用。
記憶體佔用
開啟閃回日誌功能需要增加的共用記憶體大小為以下三項之和:
polar_flashback_log_buffers
* 8 kBpolar_flashback_logindex_mem_size
MBpolar_flashback_logindex_queue_buffers
MB
開啟快速恢複區需要增加大約32 KB的共用記憶體大小,請評估當前叢集狀態後再調整參數。
磁碟佔用
為了保證能夠閃回到一定時間之前,需要保留該段時間的閃回日誌和WAL日誌,以及兩者的LogIndex檔案,這會增加磁碟空間的佔用。理論上polar_fast_recovery_area_rotation
設定得越大,磁碟佔用越多。例如,polar_fast_recovery_area_rotation
設定為300
,則將會儲存5個小時的歷史資料。
開啟閃回日誌之後,會定期去建立閃回點(Flashback Point)。閃回點是檢查點的一種,當觸發檢查點後會檢查polar_flashback_point_segments
和polar_flashback_point_timeout
參數來判斷當前檢查點是否為閃回點。所以建議設定以下參數值:
設定
polar_flashback_point_segments
為max_wal_size
的倍數。設定
polar_flashback_point_timeout
為checkpoint_timeout
的倍數。
例如,5個小時共產生20 GB的WAL日誌,閃回日誌與WAL日誌的比例大約是1:20,那麼大約會產生1 GB的閃回日誌。閃回日誌和WAL日誌的比例大小和以下兩個因素有關:
業務模型中,寫業務越多,閃回日誌越多。
polar_flashback_point_segments
、polar_flashback_point_timeout
參數設定越大,閃回日誌越少。
效能影響
閃回日誌功能增加了兩個後台進程來消費閃回日誌,這勢必會增大CPU的開銷。可以通過調整polar_flashback_log_bgwrite_delay
和polar_flashback_log_insert_list_delay
參數,使得兩個後台進程工作間隔周期更長,從而減少CPU消耗。但是這可能會造成一定效能的下降,建議使用預設值即可。
由於閃回日誌功能需要在該頁面刷髒之前,先刷對應的閃回日誌,來保證不丟失閃回日誌,所以可能會造成一定的效能下降。目前測試在大多數情境下效能下降不超過5%。
在表閃回的過程中,目標表涉及到的頁面在共用記憶體池中換入換出,可能會造成其他資料庫訪問操作的效能抖動。
使用限制
目前閃回表功能會恢複目標表的資料到一個新表中,表名為polar_flashback_目標表 OID
。在執行 FLASHBACK TABLE
文法後會有如下 NOTICE
提示:
flashback table test to timestamp now() - interval '1h'; NOTICE: Flashback the relation test to new relation polar_flashback_54986, please check the data FLASHBACK TABLE
其中的
polar_flashback_54986
為閃回恢複出的暫存資料表,只恢複表資料到目標時刻。閃回表目前只支援普通表的閃回,不支援以下資料庫物件的閃回:
索引
toast表
物化視圖
分區表
分區子表
系統資料表
外表
含有toast子表的表
在目標時間到目前時間內對錶執行過以下DDL操作,則無法執行閃回表操作:
DROP TABLE
ALTER TABLE SET WITH OIDS
ALTER TABLE SET WITHOUT OIDS
TRUNCATE TABLE
修改過列類型,修改前後的類型不可以直接隱式轉化且不是無需增加其他值進行安全強制轉化的
USING
子句。修改表為
UNLOGGED
或者LOGGED
。增加列為
IDENTITY
列。增加列的類型有約束限制。
增加列的預設值運算式含有易變的函數。
說明其中,
DROP TABLE
的閃回可以通過PolarDB PostgreSQL版的閃回刪除功能來恢複。
使用建議
當出現人為誤操作資料的情況時,建議先使用審計日誌快速定位到誤操作發生的時間,然後將目標表閃回到該時間之前。在表閃回過程中,會持有目標表的獨佔鎖定,因此僅可以對目標表進行查詢操作。另外,在表閃回的過程中,目標表涉及到的頁面在共用記憶體池中換入換出,可能會造成其他資料庫訪問操作的效能抖動。因此,建議在業務低峰期執行閃回操作。
閃回的速度和表的大小相關。當表比較大時,為節約時間,可以增大polar_workers_per_flashback_table
參數值,增加並行閃回的worker個數。
在表閃回結束後,可以根據NOTICE
的提示,查詢對應閃回表的資料,和原表的資料進行比對。閃回表上不會有任何索引,使用者可以根據查詢需要自行建立索引。在資料比對完成之後,可以將缺失的資料重新迴流到原表。
參數說明
參數名稱 | 參數說明 |
polar_enable_flashback_log | 是否開啟閃回日誌功能。取值如下:
說明
|
polar_enable_fast_recovery_area | 是否開啟快速恢複區功能。取值如下:
說明
|
polar_flashback_log_keep_segments | 閃回日誌保留的檔案個數。取值範圍:3~2147483647。預設值:8。 說明
|
polar_fast_recovery_area_rotation | 快速恢複區保留事務資訊的時間長度。單位:分鐘。 取值範圍:1~14400。預設值:180。 說明
|
polar_flashback_point_segments | 兩個閃回點之間的最少WAL日誌個數。每個WAL日誌大小為1 GB。 取值範圍:1~2147483647。預設值:16。 說明
|
polar_flashback_point_timeout | 兩個閃回點之間的最小時間間隔。單位:秒。 取值範圍:1~86400。預設值:300。 說明
|
polar_flashback_log_buffers | 閃回日誌共用記憶體大小。單位:KB。 取值範圍:4~262144。預設值:2048。 說明 修改設定檔後重啟生效。 |
polar_flashback_logindex_mem_size | 閃回日誌索引共用記憶體大小。單位:MB。 取值範圍:3~1073741823。預設值:64。 說明 修改設定檔後重啟生效。 |
polar_flashback_logindex_bloom_blocks | 閃回日誌索引的布隆過濾器頁面個數。 取值範圍:8~1073741823。預設值:512。 說明 修改設定檔後重啟生效。 |
polar_flashback_log_insert_locks | 閃回日誌插入鎖的個數。 取值範圍:1~2147483647。預設值:8。 說明 修改設定檔後重啟生效。 |
polar_workers_per_flashback_table | 閃回表並存執行的數量。 取值範圍:0~1024。預設值:5。 說明
|
polar_flashback_log_bgwrite_delay | 閃回日誌bgwriter進程的工作間隔周期。單位:毫秒。 取值範圍:1~10000。預設值:100。 說明
|
polar_flashback_log_flush_max_size | 閃回日誌bgwriter進程每次刷盤閃回日誌的大小。單位:KB。 取值範圍:0~2097152。預設值:5120。 說明
|
polar_flashback_log_insert_list_delay | 閃回日誌bginserter進程的工作間隔周期。單位:毫秒。 取值範圍:1~10000。預設值:10。 說明
|
polar_flashback_log_size_limit | 閃回日誌佔用空間大小限制,取值範圍:0~2147483647。預設值:20480。閃回日誌佔用空間大小超過該設定值就會觸發閃回日誌回收,0表示不限制閃回日誌大小。 |