本文介紹了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表示不限制閃回日志大小。 |