闪回表功能不仅可以定期保留数据页面快照到闪回日志中,而且还可以定期保留事务信息到快速恢复区。通过闪回表功能可以将某个时刻的表数据恢复到新表中。如果是人为误操作导致数据出现问题,可以使用闪回日志快速定位到误操作发生的时间,然后将目标表闪回到该时间点之前。

使用限制

  • 闪回表目前只支持普通表的闪回,不支持以下数据库对象的闪回:
    • 索引
    • 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)