You need to enable JavaScript to run this app.
导航
闪回查询
最近更新时间:2025.04.15 16:39:11首次发布时间:2025.04.15 16:39:11
我的收藏
有用
有用
无用
无用

veDB MySQL 支持闪回查询功能,通过该功能,能够快速查询过去某个时间点的数据信息,有助于进行数据恢复或故障排查。本文介绍如何使用闪回查询功能。

前提条件

  • 已创建兼容版本为 MySQL 8.0 的实例。操作步骤请参见创建实例

  • 已在实例参数管理中开启 innodb_flashback_query 参数,该参数默认关闭。操作步骤请参见修改参数

使用限制

  • 版本限制:实例兼容版本为 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

开启或关闭闪回查询功能。取值范围:

  • ON:开启。

  • OFF:关闭(默认)。

innodb_flashback_query_window

900

闪回查询支持的时间长度,单位为 s(秒),取值范围为 0~604800(7 天)。

说明

开启闪回查询后会延迟 undo 日志清理并增加内存占用,因此不建议将 innodb_flashback_query_window 设置过大,建议设置在 900 至 1800 之间。

语法说明

支持通过以下语法使用闪回查询。

SELECT <列名> FROM <表名> AS OF TIMESTAMP <时间> WHERE <条件>;

示例

  1. 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 |
    +----+---------+---------------------+
    
  2. 2025-03-25 16:04:50 时刻,修改 BobAlice

    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 |
    +----+---------+---------------------+
    
  3. 查看 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 |
    +----+---------+---------------------+
    
  4. 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 |
    +----+---------+---------------------+
    
  5. 查看 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 |
    +----+---------+---------------------+