闪回查询

通过闪回查询(Flashback Query)功能,您可以高效查询集群、数据库、数据表在过去某个时间点的信息。

前提条件

  • PolarDB集群版本需满足如下条件之一:

    • PolarDB MySQL版8.0.2版本且修订版本为8.0.2.2.2及以上

    • PolarDB MySQL版8.0.1版本且修订版本为8.0.1.1.24及以上

    • PolarDB MySQL版5.7版本且修订版本为5.7.1.0.21及以上

    • PolarDB MySQL版5.6版本且修订版本为5.6.1.0.32及以上

    如何确认集群版本,详情请参见查询版本号

  • 闪回查询功能需要开启 innodb_backquery_enable参数,该参数默认关闭。使用该功能前,您需要在PolarDB集群的参数配置中先开启 innodb_backquery_enable参数。

    说明

    如果您在开启 innodb_backquery_enable参数之前执行闪回查询,系统会返回报错ERROR 1815 (HY000): Internal error: the backquery_time set is out of range, too old

注意事项

  • 推荐在单表场景中使用闪回查询,不推荐在复杂查询场景下(如JOIN、子查询)使用闪回查询。

  • 推荐使用主键来进行闪回查询,目前不支持使用二级索引来进行闪回查询。若使用二级索引来进行闪回查询,会转换为全表扫描,查询性能会比较慢。

  • 由于Undo日志保留了部分历史差值数据,在配置的innodb_backquery_window时间窗口内,打开闪回查询功能会使得Undo表空间增长。除此之外,在BLOB场景下也可能会存在表空间增长的情况,且在表空间增长的过程中,写入性能会略有下降。

  • 单条记录的历史版本上限是10万次。超过该上限后,若闪回查询该记录,系统将会报错record undo history version exceed limit

  • 在执行DDL操作后,之前的数据不能进行闪回查询,若闪回查询DDL之前的数据,系统可能会报错Backquery primary key invisible

  • 开启闪回查询功能前删除表,无法通过闪回查询功能查看。开启闪回查询功能后删除表,可以通过闪回查询功能查看。

语法说明

  • 单表闪回查询语法

    SELECT column_name_list FROM table_name AS OF TIMESTAMP time_expr alias WHERE...;
  • 多表闪回查询语法

    SELECT column_name_list FROM table1_name AS OF TIMESTAMP time_expr alias1,table2_name AS OF TIMESTAMP time_expr alias2 WHERE... ;
  • 多表JOIN闪回查询语法

    SELECT column_name_list FROM table1_name AS OF TIMESTAMP time_expr alias1 
    JOIN table2_name AS OF TIMESTAMP time_expr alias2 ON join_cond1 
    JOIN table3_name AS OF TIMESTAMP time_expr alias3 ON join_cond2
    WHERE...;

语法中涉及的参数说明如下:

参数名称

是否必选

参数说明

column_name_list

查询的列名。

table_name

table1_name

table2_name

table3_name

表名。

time_expr

闪回的时间戳,为时间字符串或者其他时间函数,仅支持常量表达式,不能包含列名。示例如下:

  • 时间字符串:'2021-08-31 14:00:00'。

  • 时间函数:FROM_UNIXTIMESTAMP(unix_timestamp('2024-01-01 00:00:00'))CONVERT(unix_timestamp('2024-01-01 00:00:00'), DATETIME)

alias

alias1

alias2

alias3

表的别名。

join_cond1

join_cond2

JOIN条件。

参数说明

PolarDB提供了以下参数来更精确地控制闪回功能:

参数名称

数据类型

说明

loose_innodb_backquery_enable

BOOL

打开或者关闭闪回查询功能。取值:

  • ON:打开

  • OFF:关闭(默认)

loose_innodb_backquery_window

ULONG

闪回查询支持的时间长度。

  • 取值范围:1~604800。

  • 单位:秒。

  • 默认值:86400。

loose_innodb_backquery_capacity_limit

ULONG

闪回查询支持的undo日志容量。当undo日志容量大于或等于该值时,将会缩短闪回查询支持的时间长度。

  • 取值范围:100~200000000。

  • 单位:MB。

  • 默认值:100000000。

示例

以单表闪回为例。

  1. 准备测试数据:

    2021-08-31 13:51创建products表,并插入数据。

    create table products (
           prod_id bigint(10) primary key NOT NULL,
           prod_name varchar(20) NOT NULL,
           cust_id bigint(10) NULL,
           createtime datetime NOT NULL DEFAULT NOW()
    );
    
    INSERT INTO  products(prod_id,prod_name,cust_id,createtime)
    values
    (101,'Book',1,NOW()),(102,'Apple',1,NOW()),(103,'Beef',2,NOW()),(104,'Bread',3,NOW()),(105,'Cheese',4,NOW());
    
                            
  2. 查询products表中的数据:

    SELECT * FROM products;
    +---------+-----------+---------+---------------------+
    | prod_id | prod_name | cust_id | createtime          |
    +---------+-----------+---------+---------------------+
    |     101 | Book      |       1 | 2021-08-31 13:51:22 |
    |     102 | Apple     |       1 | 2021-08-31 13:51:24 |
    |     103 | Beef      |       2 | 2021-08-31 13:51:26 |
    |     104 | Bread     |       3 | 2021-08-31 13:51:27 |
    |     105 | Cheese    |       4 | 2021-08-31 13:51:29 |
    +---------+-----------+---------+---------------------+
    5 rows in set (0.00 sec)
  3. 更新测试数据:

    2021-08-31 14:18products表数据进行了更新。

    UPDATE products SET prod_id = 110, createtime = NOW() WHERE prod_name = "Book";
    UPDATE products SET prod_id = 119, createtime = NOW() WHERE prod_name = "Apple";
    
    SELECT * FROM products;
    +---------+-----------+---------+---------------------+
    | prod_id | prod_name | cust_id | createtime          |
    +---------+-----------+---------+---------------------+
    |     103 | Beef      |       2 | 2021-08-31 13:51:26 |
    |     104 | Bread     |       3 | 2021-08-31 13:51:27 |
    |     105 | Cheese    |       4 | 2021-08-31 13:51:29 |
    |     110 | Book      |       1 | 2021-08-31 14:18:21 |
    |     119 | Apple     |       1 | 2021-08-31 14:18:22 |
    +---------+-----------+---------+---------------------+
    5 rows in set (0.00 sec)
  4. 执行闪回查询:

    查看products表中2021-08-31 14:00:00这个历史时间点的数据。

    SELECT * FROM products AS of TIMESTAMP '2021-08-31 14:00:00';
    +---------+-----------+---------+---------------------+
    | prod_id | prod_name | cust_id | createtime          |
    +---------+-----------+---------+---------------------+
    |     101 | Book      |       1 | 2021-08-31 13:51:22 |
    |     102 | Apple     |       1 | 2021-08-31 13:51:24 |
    |     103 | Beef      |       2 | 2021-08-31 13:51:26 |
    |     104 | Bread     |       3 | 2021-08-31 13:51:27 |
    |     105 | Cheese    |       4 | 2021-08-31 13:51:29 |
    +---------+-----------+---------+---------------------+
    5 rows in set (0.00 sec)