约束限制
表必须使用InnoDB存储引擎。
必须先为目标表开启系统版本化配置,开启命令如下:
注意
您需要先获取该表的维护权限
ALTER TABLE 表名 ADD SYSTEM VERSIONING;开启系统版本化后,表上会有一个用于版本判断的隐藏时间列(名称一般为
teledb_sys_mod_time),执行SELECT *时不会显示该列,但支持写明该列名查看:说明
该列通常在UPDATE时才会更新,新插入的行上该值可能为空,若您需要记录插入时间或按插入时刻用于业务判断,请单独设计业务字段(例如
created_at),不要使用默认的teledb_sys_mod_time代替,即不要依赖隐藏时间列。SELECT id, teledb_sys_mod_time, FROM_UNIXTIME(teledb_sys_mod_time / 1000000) AS 约等于修改时间_秒 FROM orders LIMIT 10;如需限制最远能查询多久以前的表数据,并控制历史数据占用空间,只需由管理员配置全局参数
innodb_backquery_window设置可查询范围即可,该参数说明如下:参数含义:为已开启系统版本化的表,约定大约在多长时间内尽量保留可供时点查询的历史;超时后历史可能被回收。
取值范围:0~3600,单位为秒,即最多支持设置为1小时。
默认值:0,表示不按该参数做按秒保留的约定,即不保证能够查询到很久以前的数据。
权限说明:管理员需要具备修改全局变量的权限,一般为GLOBAL权限。
注意
- 当设置的时间窗口较大时,边界时间可能存在约秒级的误差,请留余量并多次验证。
建议与管理员共同确定
innodb_backquery_window,使之覆盖业务上最远可能需要查询的时间,并留有余量。
注意事项
建议只对确实需要审计或故障排查的表开启系统版本化,先使用测试环境验证后再进行实际操作,避免查询失败或查询结果不符合预期。
表数据闪回查询功能并不会备份表数据,因此,不能替代定期的数据备份与恢复,历史数据随时可能因被回收而无法查询。超出范围时,闪回查询可能出现少行、报错、查询结果与预期不符等,请勿当作备份恢复手段的唯一依赖。更多备份恢复信息,请参见备份与恢复。
表超过保留策略、服务器被回收、表中的行被删除且相关历史被回收后,均无法通过本功能查询到数据。
如果存在长时间未提交的事务,可能影响服务器回收历史数据的进度,进而影响您能查到多久以前的数据。
当您在维护窗口执行
ADD SYSTEM VERSIONING / DROP SYSTEM VERSIONING操作时,可能短暂影响目标表的并发写入,建议在业务低峰时操作。
操作步骤
表数据闪回语法如下:
SELECT * FROM 表名
FOR SYSTEM_TIME AS OF '时间点'
WHERE id = 1;本操作以orders表在固定时间、相对当前时间和使用变量方式闪回查询数据为例,为您介绍具体操作步骤。请您以实际情况为准,进行相关操作。
为目标表开启系统版本化配置。
注意
如果需要查看多张表,则您需要单独为每一张目标表进行开启操作。
ALTER TABLE orders ADD SYSTEM VERSIONING;(推荐)由管理员设置可查询的时间范围。
-- 示例:尽量只保留约最近 1 小时内的历史(单位:秒) SET GLOBAL innodb_backquery_window = 3600;查看当前值:
SHOW VARIABLES LIKE 'innodb_backquery_window';按时间点查询表数据(即表数据闪回查询)。
-- 固定时间 SELECT * FROM orders FOR SYSTEM_TIME AS OF '2025-12-16 09:00:00' WHERE id = 100; -- 相对当前时间 SELECT * FROM orders FOR SYSTEM_TIME AS OF DATE_SUB(NOW(), INTERVAL 30 MINUTE) WHERE id = 100; -- 使用变量 SET @t = '2025-12-16 09:00:00'; SELECT * FROM orders FOR SYSTEM_TIME AS OF @t WHERE id = 100;(可选)关闭系统版本化配置。
注意
您可以在不再需要该功能时,执行关闭操作。您需要注意,关闭后,不再按系统版本化方式维护该表,是否还能查询到历史数据取决于服务器的数据回收机制。
ALTER TABLE orders DROP SYSTEM VERSIONING;
常见问题
Q:为什么我查了一小时前却看不到当时的值?
A:可能历史已被回收(例如窗口设置太短),或该行当时尚未按版本化规则留下可追溯版本。请确认innodb_backquery_window配置与实际操作时间,并让管理员协助看服务器负载与事务情况。Q:能恢复误删的数据吗?
A:本功能是查询历史形态,不是一键恢复。若历史数据仍存在,您可以通过INSERT/UPDATE进行数据恢复,若已回收则无法通过本功能恢复。Q:
innodb_backquery_window = 0表示可以查询任意过去时间吗?
A:不表示。0仅表示不按该参数做按秒保留的约定,实际能查多久远的数据仍受服务器运行状况影响,具体以实际情况为准。Q:查询时点里的时间是按哪个时区?
A:与服务器、会话的时区设置以及您写入的时间字面量有关,建议在应用中统一约定(例如统一用UTC存储与比较)。