veDB MySQL 支持闪回查询功能,通过该功能,能够快速查询过去某个时间点的数据信息,有助于进行数据恢复或故障排查。本文介绍如何使用闪回查询功能。
版本限制:实例兼容版本为 MySQL 8.0,且内核版本大于等于 3.0.5.2,关于版本的详细介绍请参见版本号管理。
仅支持 innoDB 表,不支持 view 及其它引擎(如 HTAP 引擎)。
仅支持在只读语句中使用(在 read committed 隔离级别下可以支持 insert ... select... 语句)。
仅支持秒级的闪回查询,不保证时间上百分之百准确。如果一秒之内有多个改动,可能会查询到其中任何一个。
在执行 DDL 之后(会产生 rebuild table 的 DDL,如 truncate table),之前的数据闪回查询结果可能不符合预期。
PITR 后的实例因为 undo log 丢失因此闪回查询功能失效(报错 DB_MISSING_HISTORY
)。
开启闪回查询后会延迟 undo 日志清理并增加内存占用,因此不建议将 innodb_flashback_query_window
设置过大,建议设置在 900 至 1800 之间。
推荐在单表场景中使用闪回查询,不建议在复杂查询场景下(如 JOIN、子查询)使用闪回查询。
veDB MySQL 通过以下参数控制闪回查询功能。
参数 | 默认值 | 说明 | 是否重启生效 |
---|---|---|---|
innodb_flashback_query | OFF | 开启或关闭闪回查询功能。取值范围:
| 否 |
innodb_flashback_query_window | 900 | 闪回查询支持的时间长度,单位为 s(秒),取值范围为 0~604800(7 天)。 说明 开启闪回查询后会延迟 undo 日志清理并增加内存占用,因此不建议将 | 否 |
支持通过以下语法使用闪回查询。
SELECT <列名> FROM <表名> AS OF TIMESTAMP <时间> WHERE <条件>;
在 2025-03-25 15:50:35
时间点创建一个表,并插入数据。
CREATE TABLE t1 ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ); INSERT INTO t1 (name) VALUES ('Bob'), ('Charlie'), ('David');
select * FROM t1; +----+---------+---------------------+ | id | name | create_time | +----+---------+---------+-----------+ | 1 | Bob | 2025-03-25 15:50:35 | | 2 | Charlie | 2025-03-25 15:50:35 | | 3 | David | 2025-03-25 15:50:35 | +----+---------+---------------------+
在 2025-03-25 16:04:50
时刻,修改 Bob
为 Alice
。
UPDATE t1 SET name = 'Alice', create_time = NOW() WHERE name = 'Bob'; select * FROM t1 ; +----+---------+---------------------+ | id | name | create_time | +----+---------+---------+-----------+ | 1 | Alice | 2025-03-25 16:04:50 | | 2 | Charlie | 2025-03-25 15:50:35 | | 3 | David | 2025-03-25 15:50:35 | +----+---------+---------------------+
查看 2025-03-25 16:00:00
时间点表中的数据。
SELECT * FROM t1 AS OF TIMESTAMP '2025-03-25 16:00:00' ; select * FROM t1 ; +----+---------+---------------------+ | id | name | create_time | +----+---------+---------+-----------+ | 1 | Bob | 2025-03-25 15:50:35 | | 2 | Charlie | 2025-03-25 15:50:35 | | 3 | David | 2025-03-25 15:50:35 | +----+---------+---------------------+
在 2025-03-25 16:10:00
删除 name='David'
的行数据。
DELETE FROM t1 WHERE name = 'David'; select * FROM t1 ; +----+---------+---------------------+ | id | name | create_time | +----+---------+---------+-----------+ | 1 | Alice | 2025-03-25 16:04:50 | | 2 | Charlie | 2025-03-25 15:50:35 | +----+---------+---------------------+
查看 2025-03-25 16:05:00
时间点表中 id=3
的数据。
SELECT * FROM t1 AS OF TIMESTAMP '2025-03-25 16:05:00' where id = 3; +----+---------+---------------------+ | id | name | create_time | +----+---------+---------+-----------+ | 3 | David | 2025-03-25 15:50:35 | +----+---------+---------------------+