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

语法结构

SELECT <column_name_list> FROM <table_name> AS OF <TIMESTAMP>;

语法说明

  • 当前仅PolarDB MySQL引擎5.6版本支持该功能。
  • 使用该功能前,您需要在PolarDB集群的参数配置中先开启 innodb_backquery_enable参数。
    说明 如果您在开启 innodb_backquery_enable参数之前执行闪回查询,系统会返回报错ERROR 1815 (HY000): Internal error: the backquery_time set is out of range, too old
  • PolarDB提供了以下参数来更精确的控制闪回功能:
    参数名称 数据类型 说明
    innodb_backquery_enable BOOL 打开或者关闭闪回查询功能。取值:
    • ON:打开
    • OFF:关闭(默认)
    innodb_backquery_window ULONG 闪回查询支持的时间长度。

    取值范围:1~2592000。单位为秒。默认值为86400s。

    innodb_backquery_history_limit ULONG 闪回查询支持的undo history list最大长度。
    说明 如果history list达到设定的最大长度,系统会忽略innodb_backquery_window设置的时间长度,触发purge,直到history list长度低于设定值。

    取值范围:1~LONG_MAX。默认值为8000000。

    innodb_backquery_trackpoint_create_interval ULONG 闪回查询创建并保存一个trackpoint(readview)的时间间隔,即该参数定义了闪回查询的时间粒度。

    取值范围:1~86400。单位为秒。默认值1s。

    说明 不建议修改该参数。
    innodb_backquery_trackpoint_clean_interval ULONG 闪回查询清理过期Trackpoint(readview)的时间间隔。

    取值范围:1~86400。单位为秒。默认值1s。

    说明 不建议修改该参数。

语法示例

  • 准备测试数据:
    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());
    
                            
  • 查询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)
  • 更新测试数据:
    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)
  • 执行闪回查询:
    查看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)