文档中心>TDSQL-C MySQL 版

闪回查询

最近更新时间:2024-09-30 16:48:11

我的收藏

功能介绍

在数据库运维过程中可能会发生误操作的情况,这些误操作可能会给业务带来严重的影响,因误操作导致业务受到影响时,常见的恢复手段有回档、克隆等操作,但对于少量的数据变更以及紧急故障修复而言,容易出错且耗时较长,在数据量较大时恢复时间不可控。 TXSQL 团队在 Innodb 引擎上设计和实现了闪回查询功能,仅需通过简单的 SQL 语句即可查询误操作前的历史数据,通过特定的 SQL 语法查询指定时间点的数据,节省大量的数据查询和恢复时间,使得误操作后的数据能够快速恢复,从而保障业务快速恢复运行。

支持版本

内核版本 TDSQL-C MySQL 版 8.0 3.1.10 及以上。

适用场景

闪回查询功能用于在数据库运维过程中,误操作后进行快速的查询历史数据。 在使用该功能时,需要注意以下几点:
仅支持 Innodb 物理表,不支持 view 及其它引擎,不支持 last_insert_id() 等没有实际列对应的函数。
仅支持秒级的闪回查询,不保证百分之百准确,如果一秒之内有多个改动,可能会查询到其中任何一个。
闪回查询仅支持主键(或者 GEN_CLUST_INDEX)。
不支持在 prepared statement 和 stored procedure 中使用。
不支持 DDL,如果对表进行 DDL(如 truncate table,这种建议通过回收站进行恢复),闪回查询得到的结果可能不符合预期。
同一个语句中,同一张表如果指定了多个闪回查询时间,会选择离当前查询时间最远的时间。
由于主从实例存在时间差,指定相同时间进行闪回查询,主从实例获得的结果可能不一样。
开启闪回查询后会延迟 undo 日志清理以及增加内存占用,不建议 Innodb_backquery_window 设置过大(建议设置在900至1800之间),尤其是业务访问繁忙的实例。
如果数据库实例重启或者 crash,将不能查询到重启或 crash 之前的历史信息。指定的时间需要在支持的范围之内(支持范围可通过状态变量 Innodb_backquery_up_time 和 Innodb_backquery_low_time 查看,执行 show status like '%backquery%')。

使用说明

闪回查询提供了全新的 AS OF 语法,在参数设置中将 Innodb_backquery_enable 参数设置为 ON,打开闪回查询功能,通过特定语法查询指定时间的数据。语法如下:
SELECT ... FROM <表名>
AS OF TIMESTAMP <时间>;
查询指定时间参考示例
MySQL [test]> create table t1(id int,c1 int) engine=innodb;
Query OK, 0 rows affected (0.06 sec)

MySQL [test]> insert into t1 values(1,1),(2,2),(3,3),(4,4);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0

MySQL [test]> select now();
+---------------------+
| now() |
+---------------------+
| 2023-08-17 15:50:01 |
+---------------------+
1 row in set (0.00 sec)

MySQL [test]> delete from t1 where id=4;
Query OK, 1 row affected (0.00 sec)

MySQL [test]> select * from t1;
+------+------+
| id | c1 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
+------+------+
3 rows in set (0.00 sec)

MySQL [test]> select * from t1 as of timestamp '2023-08-17 15:50:01';
+------+------+
| id | c1 |
+------+------+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
+------+------+
4 rows in set (0.00 sec)
通过历史数据创建表示例
create table t3 select * from t1 as of timestamp '2023-08-17 15:50:01';
插入历史数据至表中示例
insert into t4 select * from t1 as of timestamp '2023-08-17 15:50:01';
闪回查询还支持了持久化,支持将闪回查询内存中的 readview 信息定期持久化到物理表中,重启后仍然可以执行重启前的闪回查询。此能力需要开启闪回查询,并打开闪回查询持久化开关(打开持久化开关:设置 innodb_backquery_persistent = ON),否则无效。
说明:
要使用闪回查询持久化能力,需满足内核版本在 TDSQL-C MySQL 版 8.0 3.1.15 及以上。

参数说明

下列表中列举闪回查询功能可配置的参数说明。
参数名
参数范围
类型
默认值
取值范围
是否需重启
说明
innodb_backquery_enable
全局参数
Boolean
OFF
ON/OFF
闪回查询功能的开关。
innodb_backquery_window
全局参数
Integer
900
1 - 86400
支持闪回查询的时间范围,单位:秒,此参数的值越大,闪回查询支持的历史数据查询时间越长,同时 undo 表空间占用的存储空间也会上升。
innodb_backquery_history_limit
全局参数
Integer
8000000
1 - 9223372036854476000
undo 的历史链表长度限制,超过设定值会忽略 Innodb_backquery_window 触发 purge,直到历史链表长度低于设定值。
innodb_backquery_persistent
非全局参数
Boolean
OFF
ON/OFF
闪回查询持久化的开关。