tencent cloud

文档反馈

闪回查询

最后更新时间:2023-02-22 16:13:27

    功能介绍

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

    支持版本

    • 内核版本 MySQL 5.7 20220715 及以上。
    • 内核版本 MySQL 8.0 20220331 及以上。

    如何查看或升级内核小版本,请参见 升级内核小版本

    适用场景

    闪回查询功能用于在数据库运维过程中误操作后进行快速的查询历史数据。
    在使用该功能时,需要注意以下几点:

    • 仅支持 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()               |
    +---------------------+
    | 2022-02-17 16:01: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 '2022-02-17 16:01: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 '2022-02-17 16:01:01';
    

    插入历史数据至表中示例

    insert into t4 select * from t1 as of timestamp '2022-02-17 16:01:01';
    

    参数说明

    下列表中列举闪回查询功能可配置的参数说明。

    参数名 参数范围 类型 默认值 取值范围 是否需重启 说明
    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,直到历史链表长度低于设定值。
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持