达梦数据库闪回查询笔记
达梦开启闪回后,最常用的有两种查询:
- 查询某个指定时间点的数据
- 查询一段时间内的数据版本变化
假设示例表为:
T_ORDER主键:
ID = '10001'1. 查询指定时间点的数据
查看某条数据在 2026-09-04 14:30:00 时的状态:
SELECT *
FROM T_ORDER
AS OF TIMESTAMP '2026-09-04 14:30:00'
WHERE ID = '10001';可以简单理解为:
查询这条数据在这个时间点是什么样。
适合查误修改前的数据。
例如怀疑 14:35 左右被修改,可以查:
SELECT *
FROM T_ORDER
AS OF TIMESTAMP '2026-09-04 14:34:59'
WHERE ID = '10001';然后和当前数据对比:
SELECT *
FROM T_ORDER
WHERE ID = '10001';2. 查询几小时前的数据
查询 6 小时前:
SELECT *
FROM T_ORDER
AS OF TIMESTAMP (SYSDATE - 6/24)
WHERE ID = '10001';查询 12 小时前:
SELECT *
FROM T_ORDER
AS OF TIMESTAMP (SYSDATE - 12/24)
WHERE ID = '10001';查询 23 小时前:
SELECT *
FROM T_ORDER
AS OF TIMESTAMP (SYSDATE - 23/24)
WHERE ID = '10001';3. 查询 24 小时内的修改版本
如果想看某条数据最近一段时间改过几次,以及每次修改后的数据,可以使用:
SELECT
VERSIONS_STARTTIME,
VERSIONS_ENDTIME,
VERSIONS_OPERATION,
*
FROM T_ORDER
VERSIONS BETWEEN TIMESTAMP
SYSTIMESTAMP - INTERVAL '24' HOUR
AND SYSTIMESTAMP
WHERE ID = '10001'
ORDER BY VERSIONS_STARTTIME;这个查询比一个时间点一个时间点试要方便很多。
主要看这几个字段:
VERSIONS_STARTTIME 当前版本开始时间
VERSIONS_ENDTIME 当前版本结束时间
VERSIONS_OPERATION 操作类型常见操作类型:
I = INSERT
U = UPDATE
D = DELETE例如结果可能是:
10:15 U 修改后的版本1
15:30 U 修改后的版本2
18:20 U 当前版本这样可以快速判断这条数据什么时候发生过变化。
注意语法位置
VERSIONS 要直接跟在表名后面:
FROM T_ORDER
VERSIONS BETWEEN TIMESTAMP ...不要写成:
FROM T_ORDER t
VERSIONS BETWEEN TIMESTAMP ...否则部分达梦环境会直接报:
[VERSIONS]附近出现错误: 语法分析出错4. 不知道具体修改时间时
如果只知道大概在 14:00 ~ 15:00 之间被修改,可以先用版本查询:
SELECT
VERSIONS_STARTTIME,
VERSIONS_ENDTIME,
VERSIONS_OPERATION,
*
FROM T_ORDER
VERSIONS BETWEEN TIMESTAMP
'2026-09-04 14:00:00'
AND '2026-09-04 15:00:00'
WHERE ID = '10001'
ORDER BY VERSIONS_STARTTIME;
先找到大概的修改时间,再用:
AS OF TIMESTAMP查看修改前后的完整数据。
实际排查时推荐:
VERSIONS BETWEEN找修改时间AS OF TIMESTAMP看指定时间的数据
5. 几个月前创建的数据也能闪回
闪回查询不是“查询最近修改过的数据”。
即使一条数据几个月前创建,最近完全没有修改,只要查询的时间点还在当前闪回有效范围内:
SELECT *
FROM T_ORDER
AS OF TIMESTAMP '2026-09-04 10:00:00'
WHERE ID = '10001';
一样可以正常查到。
如果这期间没有修改,查询结果通常和当前数据相同。
6. 闪回时间不是绝对硬边界
例如闪回保留时间设置为 24 小时,实际可能还能查询到:
24小时05分钟前
24小时10分钟前的数据。
超过保留时间后,相关历史版本不会在某一秒立刻全部消失,所以有时会有一点额外余量。
但超过配置时间的部分不能认为是稳定可用的。
如果出现:
回滚记录版本太旧,无法获取用户记录
基本可以理解为:
目标时间需要的历史版本已经不存在了。
最常用的两条 SQL
查某个时间点
SELECT *
FROM T_ORDER
AS OF TIMESTAMP '2026-09-04 14:30:00'
WHERE ID = '10001';
查最近 24 小时修改历史
SELECT
VERSIONS_STARTTIME,
VERSIONS_ENDTIME,
VERSIONS_OPERATION,
*
FROM T_ORDER
VERSIONS BETWEEN TIMESTAMP
SYSTIMESTAMP - INTERVAL '24' HOUR
AND SYSTIMESTAMP
WHERE ID = '10001'
ORDER BY VERSIONS_STARTTIME;
记住一句话就够了:
AS OF TIMESTAMP看某个时间点,VERSIONS BETWEEN看一段时间内的数据版本变化。

