功能介绍
在数据库运维过程中可能会发生误操作的情况,这些误操作可能会给业务带来严重的影响,因误操作导致业务受到影响时,常见的恢复手段有回档、克隆等操作,但对于少量的数据变更以及紧急故障修复而言,容易出错且耗时较长,在数据量较大时恢复时间不可控。
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: 0MySQL [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 | 否 | 闪回查询持久化的开关。 |