通过闪回查询(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>;
语法说明
PolarDB提供了以下参数来更精确的控制闪回功能:参数名称 | 数据类型 | 说明 |
---|---|---|
loose_innodb_backquery_enable | BOOL | 打开或者关闭闪回查询功能。取值:
|
loose_innodb_backquery_window | ULONG | 闪回查询支持的时间长度。 取值范围:1~604800。单位为秒。默认值为86400s。 |
语法示例
- 准备测试数据:在
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:18
对products
表数据进行了更新。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)