You need to enable JavaScript to run this app.
文档中心
云数据库 MySQL 版

云数据库 MySQL 版

复制全文
下载 pdf
功能
Flashback Query
复制全文
下载 pdf
Flashback Query
本文介绍云数据库 MySQL 版闪回查询功能的相关信息。​
背景信息​
在数据库运维过程中可能会发生误操作的情况,这些误操作可能会给业务带来严重的影响,因误操作导致业务受到影响时,常见的恢复手段有回档、克隆等操作,但对于少量的数据变更以及紧急故障修复而言,容易出错且耗时较长,在数据量较大时恢复时间不可控。​
云数据库 MySQL 版在 InnoDB 引擎上设计和实现了闪回查询功能,仅通过简单的 SQL 语句即可查询误操作前的历史数据。​
参数说明​
闪回查询功能的使用依赖于参数 loose_rds_flashback_query 和 loose_rds_flashback_query_window 的配置,这两个参数的信息如下:​
​
名称​
默认值​
是否需要重启以生效​
取值范围​
级别​
参数描述​
loose_rds_flashback_query​
OFF​
否​
[ON|OFF]​
Global​
用于开启或关闭 InnoDB 的闪回查询功能。​
loose_rds_flashback_query_window​
900​
否​
[1-604800]​
Global​
用于设定支持闪回查询的时间段。​
说明​
支持闪回查询时间范围的终点只能为当前时间点,即 now()。支持闪回查询时间范围的起点由“闪回查询功能的开启时间”和“保留时间”中的较大值决定:​
  • 闪回查询功能的开启时间:开启闪回查询功能的时间点。​
  • 保留时间:当前时间减去 loose_rds_flashback_query_window 配置的时间长度,即 now() - loose_rds_flashback_query_window)。​
​
状态说明​
云数据库 MySQL 版提供了以下状态来显示当前闪回查询的状态:​
​
名称​
级别​
含义​
Innodb_flashback_state​
Global​
闪回查询运行状态​
  • DISABLED_AND_PURGED:特性关闭,并且完成 view record 的 purge。​
  • ENABLED:特性开启,并且正常运行​
  • DISABLED:特性关闭,但是还在 purge 残余的 view record。​
  • MISSING_META_TABLE:特性开启,但是元数据表还没创建。​
Innodb_flashback_state_code​
Global​
闪回查询运行状态码​
  • 0:DISABLED_AND_PURGED​
  • 1:ENABLED​
  • 2:DISABLED​
  • 3:MISSING_META_TABLE​
Innodb_flashback_query_views_table_open_count_by_purge_thread​
Global​
InnoDB purge thread 打开元数据表的次数。​
Innodb_flashback_query_views_table_open_count_by_persist_thread​
Global​
Persist thread 打开元数据表的次数。​
Innodb_flashback_query_views_table_open_count_by_user_thread​
Global​
User thread 打开元数据表的次数。​
Innodb_flashback_query_start_time​
Global​
闪回查询支持的时间起点。​
Innodb_flashback_query_end_time​
Global​
闪回查询支持的时间终点。​
​
支持版本​
  • MySQL 8.0 版本,且内核小版本为 MySQL 8.0.32_20250215 及以上。​
  • MySQL 5.7 版本,且内核小版本为 MySQL 5.7.32_20250415 及以上。​
  • MySQL 8.4 版本,且内核小版本为 MySQL 8.4.7_20260415 及以上。​
说明​
您可通过查看实例信息查看实例的内核小版本。如您实例的内核小版本未在受支持的内核小版本范围内,您可手动升级实例内核小版本。​
注意事项​
  • 功能与语法限制​
  • 适用对象:仅支持 InnoDB 引擎的表,不支持视图(View)、其他存储引擎以及没有实际列对应的函数(如 1490059)。​
  • 隔离级别要求:仅支持在 REPEATABLE READ 和 READ COMMITTED 隔离级别下使用。关于隔离级别更多信息,可以查看MySQL官方文档 17.7.2.1 Transaction Isolation Levels 。​
  • 不支持的操作:​
  • 不支持 FOR UPDATE 类型的加锁查询。​
  • 必须指定具体的 TIMESTAMP 字符串,不支持使用函数来代替时间戳。​
  • 若同一条语句对同一张表指定了多个不同的时间戳,系统仅采纳第一个时间戳,其余将被忽略。​
  • 特殊语法支持:CREATE TABLE ... SELECT 以及 INSERT INTO ... SELECT 语句仅在 READ COMMITTED 隔离级别下支持。​
  • 性能与使用建议​
  • 推荐场景:推荐在单表查询场景中使用,并尽量使用主键进行查询。​
  • 性能劣化风险:​
  • 多表闪回查询(如 JOIN、子查询)会导致查询性能显著下降,不建议在复杂查询场景下使用。​
  • 若使用二级索引进行闪回查询,性能表现较差。​
  • 资源开销:开启闪回查询(loose_rds_flashback_query = ON)会延迟 Undo 日志的清理。在配置的时间窗口 (loose_rds_flashback_query_window) 内,Undo 表空间会增长,且数据库的查询及写入性能会有所下降。建议根据业务流量合理配置时间窗口,不建议设置过大。​
  • 数据一致性与准确性​
  • 时间精度:闪回查询的精度为秒级,不保证毫秒级完全准确。如果一秒内有多次数据改动,可能会查询到其中任意一个状态。​
  • DDL 操作影响:执行 DDL 操作(如 TRUNCATE TABLE 等会导致表重建的操作)后,之前的数据无法进行闪回查询,或者查询结果可能不符合预期。​
  • 主从节点差异:由于主节点和只读节点之间存在时间差,指定相同时间查询可能得到不同结果。为解决此问题,代理通常会将闪回查询的 SQL 强制分发给主节点执行。​
  • 功能开关影响:关闭 loose_rds_flashback_query 参数后再重新开启,将无法查询到关闭期间及开启之前的历史信息。​
  • 常见报错与排查​
  • 功能未开启:如果在未开启参数时执行查询,会报错 ERROR 1030 (HY000): Got error 216 - 'Option loose_rds_flashback_query is OFF' from storage engine。​
  • 超出时间范围:如果查询的时间戳超出了保留的历史信息范围,会报错 ERROR 1030 (HY000): Got error 215 - 'Read view not found; Timestamp may be too old' from storage engine。​
  • 隔离级别不支持:在不支持的隔离级别下执行 FOR UPDATE 或特定 INSERT/CREATE 语句,会报错 ERROR 1030 (HY000): Got error 217 - 'Current transaction isolation level does not support this kind of flashback queries.' from storage engine。​
  • 查看支持范围:可以通过执行 SHOW STATUS LIKE '%flashback%',查看状态变量 Innodb_flashback_query_start_time 和 Innodb_flashback_query_end_time 来确认当前支持闪回查询的时间范围(时区与 MySQL system_time_zone 一致)。​
前提条件​
  • 已创建实例,且实例的状态为运行中。​
  • 已将参数 loose_rds_flashback_query 的运行值设置为 ON。关于修改参数的详细信息,请参见修改参数。​
  • 按需设置参数 loose_rds_flashback_query_window 的运行值。​
使用说明​
闪回查询提供了全新的 AS OF 语法,完成前提条件后,即可使用 AS OF 语法查询指定时间的数据。 AS OF 语法如下:​
​
SELECT column_name_list FROM table_name AS OF TIMESTAMP time_expr alias WHERE...;​
​
语法中涉及的参数说明如下:​
​
参数名称​
是否必选​
参数说明​
column_name_list​
是​
查询的列名。​
table_name​
是​
表名。​
time_expr​
是​
  • 闪回的时间戳,为时间字符串,精确到秒。​
  • 格式为:YYYY-MM-DD HH:MM:SS。​
  • 不支持在该参数中使用函数。​
alias​
否​
表的别名。​
join_cond1​
是​
JOIN条件。​
​
使用示例​
  • 查询指定时间参考​
  • ​
    mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;​
    Query OK, 0 rows affected (0.00 sec)​
    ​
    mysql> create table t1(id int,c1 int) engine=innodb;​
    Query OK, 0 rows affected (0.00 sec)​
    ​
    mysql> insert into t1 values(1,1),(2,2),(3,3),(4,4);​
    Query OK, 4 rows affected (0.00 sec)​
    Records: 4 Duplicates: 0 Warnings: 0​
    ​
    mysql> select now();​
    +---------------------+​
    | now() |​
    +---------------------+​
    | 2025-03-18 11:54:55 |​
    +---------------------+​
    1 row in set (0.00 sec)​
    ​
    mysql> delete from t1 where id=4;​
    Query OK, 1 row affected (0.00 sec)​
    ​
    mysql> select * from t1;​
    +------+------+​
    | id | c1 |​
    +------+------+​
    | 1 | 1 |​
    | 2 | 2 |​
    | 3 | 3 |​
    +------+------+​
    3 rows in set (0.00 sec)​
    ​
    mysql> select * from t1 as of timestamp '2025-03-18 11:54:55';​
    +------+------+​
    | id | c1 |​
    +------+------+​
    | 1 | 1 |​
    | 2 | 2 |​
    | 3 | 3 |​
    | 4 | 4 |​
    +------+------+​
    4 rows in set (0.00 sec)​
    ​
  • 通过历史数据创建表​
  • ​
    mysql> create table t3 select * from t1 as of timestamp '2025-03-18 11:54:55';​
    Query OK, 4 rows affected (6.39 sec)​
    Records: 4 Duplicates: 0 Warnings: 0​
    ​
    mysql> select * from t3;​
    +------+------+​
    | id | c1 |​
    +------+------+​
    | 1 | 1 |​
    | 2 | 2 |​
    | 3 | 3 |​
    | 4 | 4 |​
    +------+------+​
    4 rows in set (0.00 sec)​
    ​
  • 插入历史数据至表中​
  • ​
    mysql> create table t4 like t1;​
    Query OK, 0 rows affected (0.00 sec)​
    ​
    mysql> insert into t4 select * from t1 as of timestamp '2025-03-18 11:54:55';​
    Query OK, 4 rows affected (0.09 sec)​
    Records: 4 Duplicates: 0 Warnings: 0​
    ​
    mysql> select * from t4;​
    +------+------+​
    | id | c1 |​
    +------+------+​
    | 1 | 1 |​
    | 2 | 2 |​
    | 3 | 3 |​
    | 4 | 4 |​
    +------+------+​
    4 rows in set (0.00 sec)​
    ​
​
最近更新时间:2026.08.13 10:28:31
这个页面对您有帮助吗?
有用
有用
无用
无用