本文介绍了PolarDB PostgreSQL版(兼容Oracle)的闪回表功能。

前提条件

支持的PolarDB PostgreSQL版(兼容Oracle)的版本如下:

PostgreSQL 11(内核小版本1.1.22及以上)

说明

您可通过如下语句查看PolarDB PostgreSQL版(兼容Oracle)的内核小版本的版本号:

show polar_version;

简介

闪回表

闪回表 (Flashback Table) 功能通过定期保留数据页面快照到闪回日志中,保留事务信息到快速恢复区中,支持用户将某个时刻的表数据恢复到一张新的表中。

语法

FLASHBACK TABLE
    [ schema. ]table
    TO TIMESTAMP expr;

语法参数说明:

参数名称

参数说明

[ schema. ]table

需要执行闪回操作的表名称。

expr

需要闪回数据的时间。

示例

  1. 准备测试数据。

    1. 创建表test,并插入数据。

      CREATE TABLE test(id int);
      INSERT INTO test select * FROM generate_series(1, 10000);
    2. 查询test表中总共有多少行数据。

      SELECT count(1) FROM test;

      显示结果如下:

       count
      -------
       10000
      (1 row)
    3. 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)

使用指南

闪回表功能依赖闪回日志和快速恢复区功能,需要设置polar_enable_flashback_logpolar_enable_fast_recovery_area参数并重启。其他的参数也需要按照需求来修改,建议一次性修改完成并在业务低峰期重启。打开闪回表功能将会增大内存、磁盘的占用量,并带来一定的性能损失,请谨慎评估后再使用。

内存占用

打开闪回日志功能需要增加的共享内存大小为以下三项之和:

  • polar_flashback_log_buffers* 8 kB

  • polar_flashback_logindex_mem_sizeMB

  • polar_flashback_logindex_queue_buffersMB

打开快速恢复区需要增加大约32 KB的共享内存大小,请评估当前集群状态后再调整参数。

磁盘占用

为了保证能够闪回到一定时间之前,需要保留该段时间的闪回日志和WAL日志,以及两者的LogIndex文件,这会增加磁盘空间的占用。理论上polar_fast_recovery_area_rotation设置得越大,磁盘占用越多。例如,polar_fast_recovery_area_rotation设置为300,则将会保存5个小时的历史数据。

打开闪回日志之后,会定期去创建闪回点(Flashback Point)。闪回点是检查点的一种,当触发检查点后会检查polar_flashback_point_segmentspolar_flashback_point_timeout参数来判断当前检查点是否为闪回点。所以建议设置以下参数值:

  • 设置polar_flashback_point_segmentsmax_wal_size的倍数。

  • 设置polar_flashback_point_timeoutcheckpoint_timeout的倍数。

例如,5个小时共产生20 GB的WAL日志,闪回日志与WAL日志的比例大约是1:20,那么大约会产生1 GB的闪回日志。闪回日志和WAL日志的比例大小和以下两个因素有关:

  • 业务模型中,写业务越多,闪回日志越多。

  • polar_flashback_point_segmentspolar_flashback_point_timeout参数设定越大,闪回日志越少。

性能影响

闪回日志功能增加了两个后台进程来消费闪回日志,这势必会增大CPU的开销。可以通过调整polar_flashback_log_bgwrite_delaypolar_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版(兼容Oracle)的闪回删除功能来恢复。

使用建议

当出现人为误操作数据的情况时,建议先使用审计日志快速定位到误操作发生的时间,然后将目标表闪回到该时间之前。在表闪回过程中,会持有目标表的排他锁,因此仅可以对目标表进行查询操作。另外,在表闪回的过程中,目标表涉及到的页面在共享内存池中换入换出,可能会造成其他数据库访问操作的性能抖动。因此,建议在业务低峰期执行闪回操作。

闪回的速度和表的大小相关。当表比较大时,为节约时间,可以增大polar_workers_per_flashback_table参数值,增加并行闪回的worker个数。

在表闪回结束后,可以根据NOTICE的提示,查询对应闪回表的数据,和原表的数据进行比对。闪回表上不会有任何索引,用户可以根据查询需要自行创建索引。在数据比对完成之后,可以将缺失的数据重新回流到原表。

参数说明

参数名称

参数说明

polar_enable_flashback_log

是否打开闪回日志功能。取值如下:

  • on:打开。

  • off:关闭(默认)。

说明

SIGHUP生效。

polar_enable_fast_recovery_area

是否打开快速恢复区功能。取值如下:

  • on:打开。

  • off:关闭(默认)。

说明

SIGHUP生效。

polar_flashback_log_keep_segments

闪回日志保留的文件个数。取值范围:3~2147483647。默认值:8。

说明
  • 闪回日志文件可重用。每个闪回日志大小为256 MB。

  • SIGHUP生效。

polar_fast_recovery_area_rotation

快速恢复区保留事务信息的时长。单位:分钟。

取值范围:1~14400。默认值:180。

说明

SIGHUP生效。

polar_flashback_point_segments

两个闪回点之间的最少WAL日志个数。每个WAL日志大小为1 GB。

取值范围:1~2147483647。默认值:16。

说明

SIGHUP生效。

polar_flashback_point_timeout

两个闪回点之间的最小时间间隔。单位:秒。

取值范围:1~86400。默认值:300。

说明

SIGHUP生效。

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。

说明
  • 当设置为0时,表示不打开并行执行。

  • 即时生效。

polar_flashback_log_bgwrite_delay

闪回日志bgwriter进程的工作间隔周期。单位:毫秒。

取值范围:1~10000。默认值:100。

说明

SIGHUP生效。

polar_flashback_log_flush_max_size

闪回日志bgwriter进程每次刷盘闪回日志的大小。单位:KB。

取值范围:0~2097152。默认值:5120。

说明
  • 设置为0时,表示不限制闪回日志大小。

  • SIGHUP生效。

polar_flashback_log_insert_list_delay

闪回日志bginserter进程的工作间隔周期。单位:毫秒。

取值范围:1~10000。默认值:10。

说明

SIGHUP生效。

polar_flashback_log_size_limit

闪回日志占用空间大小限制,取值范围:0~2147483647。默认值:20480。闪回日志占用空间大小超过该设定值就会触发闪回日志回收,0表示不限制闪回日志大小。