閃回表功能不僅可以定期保留數據頁面快照到閃回日志中,而且還可以定期保留事務信息到快速恢復區。通過閃回表功能可以將某個時刻的表數據恢復到新表中。如果是人為誤操作導致數據出現問題,可以使用閃回日志快速定位到誤操作發生的時間,然后將目標表閃回到該時間點之前。

使用限制

  • 閃回表目前只支持普通表的閃回,不支持以下數據庫對象的閃回:
    • 索引
    • toast表
    • 物化視圖
    • 分區表
    • 分區子表
    • 系統表
    • 外表
    • 含有toast子表的表
  • 在目標時間到當前時間內對表執行過以下DDL操作,則無法執行閃回表操作:
    • DROP TABLE
    • ALTER TABLE SET WITH OIDS
    • ALTER TABLE SET WITHOUT OIDS
    • TRUNCATE TABLE
    • 修改過列類型,修改前后的類型不可以直接隱式轉化且不是無需增加其他值進行安全強制轉化的USING子句。
    • 修改表為unlogged或者logged。
    • 增加列為identity列。
    • 增加列的類型有約束限制。
    • 增加列的默認值表達式含有易變的函數。

前提條件

使用該功能前,您需要在PolarDB集群的參數配置中將polar_enable_flashback_logpolar_enable_fast_recovery_area參數同時設置為ON,即同時打開閃回日志功能和快速恢復區功能。

參數說明

PolarDB提供了以下參數來更精確的控制閃回表功能:
參數名稱參數說明
polar_enable_flashback_log是否打開閃回日志功能。取值:
  • ON:打開。
  • OFF:關閉(默認)。
說明 閃回表功能依賴閃回日志。使用閃回表功能時,需要打開閃回日志功能。
polar_enable_fast_recovery_area是否打開快速恢復區功能。取值:
  • ON:打開。
  • OFF:關閉(默認)。
說明 閃回表功能依賴快速恢復區。使用閃回表功能時,需要打開快速恢復區功能。
polar_flashback_log_keep_segments閃回日志保留的文件個數。

取值范圍:3~2147483647。默認值:8。

說明 閃回日志文件可重用。每個閃回日志大小為256 MB。
polar_fast_recovery_area_rotation快速恢復區保留事務信息的時長。單位:分鐘。

取值范圍:1~14400。默認值:180。

說明 理論上, polar_fast_recovery_area_rotation 參數值設置的越大,磁盤空間占用越多。
polar_flashback_point_segments兩個閃回點之間的最少WAL日志個數。每個WAL日志大小為1 GB。

取值范圍:1~2147483647。默認值:16。

說明 建議用戶將polar_flashback_point_segments 設置為max_wal_size 的倍數。
polar_flashback_point_timeout兩個閃回點之間的最小時間間隔。單位:秒。

取值范圍:1~86400。默認值:300。

說明 建議用戶將polar_flashback_point_timeout 設置為checkpoint_timeout 的倍數。
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。

說明 單個頁面大小為8 KB。
polar_flashback_log_insert_locks閃回日志插入鎖的個數。

取值范圍:1~2147483647。默認值:8。

polar_workers_per_flashback_table閃回表并行執行的數量。當設置為0時,表示不打開并行執行。

取值范圍:0~1024。默認值:5。

說明 當需要閃回的表數據量比較大時,為了節約時間,可以修改polar_workers_per_flashback_table 參數值,增加并行閃回個數。
polar_flashback_log_bgwrite_delay閃回日志bgwriter進程的工作間隔周期。單位:毫秒。

取值范圍:1~10000。默認值:100。

polar_flashback_log_flush_max_size閃回日志bgwriter進程每次刷盤閃回日志的大小。單位:KB。

取值范圍:0~2097152。默認值:5120。

說明 設置為0時,表示不限制閃回日志大小。
polar_flashback_log_insert_list_delay閃回日志bginserter 進程的工作間隔周期。單位:毫秒。

取值范圍:1~10000。默認值:10。

說明 根據需求修改參數值時,建議您將需要修改的參數一次性修改完成,并在業務低峰期重啟集群。

注意事項

  • 打開閃回日志功能和快速恢復區功能時,會占用共享內存和磁盤空間,并有一定的性能損失。請謹慎評估這些影響。
  • 在閃回表的過程中,目標表涉及到的頁面在共享內存池中換入換出,可能會造成其他數據庫訪問性能的抖動。建議在業務低峰期操作。
  • 閃回表操作結束后,可以根據NOTICE提示,查詢對應的閃回表的數據并和原表進行數據比對。如果存在數據缺失,可以將缺失的數據重新回流到原表。

語法

FLASHBACK TABLE [ schema. ]table TO TIMESTAMP expr;
表 1. 語法參數說明
參數名稱參數說明
[ schema. ]table需要執行閃回操作的表名稱。
expr需要閃回數據的時間。

示例

  1. 準備測試數據。
    創建表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)
  2. 等待10秒并刪除test表中的數據。
    SELECT pg_sleep(10);
    DELETE FROM test;
    查詢刪除后的test表。
    SELECT * FROM test;
    顯示結果如下:
     id
    ----
    (0 rows)
  3. 閃回表test10秒之前的數據。
    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
  4. 查詢閃回后的表數據。
    查詢閃回后的表數據總行數。
    SELECT count(1) FROM polar_flashback_65566;
    顯示結果如下:
     count
    -------
     10000
    (1 row)
    對閃回后的id求和。
    SELECT sum(id) FROM polar_flashback_65566;
    顯示結果如下:
       sum
    ----------
     50005000
    (1 row)