DM8 闪回查询:查看指定时间数据和历史版本

达梦数据库闪回查询笔记

达梦开启闪回后,最常用的有两种查询:

  1. 查询某个指定时间点的数据
  2. 查询一段时间内的数据版本变化

假设示例表为:

SQL
T_ORDER

主键:

SQL
ID = '10001'

1. 查询指定时间点的数据

查看某条数据在 2026-09-04 14:30:00 时的状态:

SQL
SELECT *
FROM T_ORDER
AS OF TIMESTAMP '2026-09-04 14:30:00'
WHERE ID = '10001';

可以简单理解为:

查询这条数据在这个时间点是什么样。

适合查误修改前的数据。

例如怀疑 14:35 左右被修改,可以查:

SQL
SELECT *
FROM T_ORDER
AS OF TIMESTAMP '2026-09-04 14:34:59'
WHERE ID = '10001';

然后和当前数据对比:

SQL
SELECT *
FROM T_ORDER
WHERE ID = '10001';

2. 查询几小时前的数据

查询 6 小时前:

SQL
SELECT *
FROM T_ORDER
AS OF TIMESTAMP (SYSDATE - 6/24)
WHERE ID = '10001';

查询 12 小时前:

SQL
SELECT *
FROM T_ORDER
AS OF TIMESTAMP (SYSDATE - 12/24)
WHERE ID = '10001';

查询 23 小时前:

SQL
SELECT *
FROM T_ORDER
AS OF TIMESTAMP (SYSDATE - 23/24)
WHERE ID = '10001';

3. 查询 24 小时内的修改版本

如果想看某条数据最近一段时间改过几次,以及每次修改后的数据,可以使用:

SQL
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;

这个查询比一个时间点一个时间点试要方便很多。

主要看这几个字段:

Plaintext
VERSIONS_STARTTIME   当前版本开始时间
VERSIONS_ENDTIME     当前版本结束时间
VERSIONS_OPERATION   操作类型

常见操作类型:

Plaintext
I = INSERT
U = UPDATE
D = DELETE

例如结果可能是:

SQL
10:15   U   修改后的版本1
15:30   U   修改后的版本2
18:20   U   当前版本

这样可以快速判断这条数据什么时候发生过变化。

注意语法位置

VERSIONS 要直接跟在表名后面:

SQL
FROM T_ORDER
VERSIONS BETWEEN TIMESTAMP ...

不要写成:

SQL
FROM T_ORDER t
VERSIONS BETWEEN TIMESTAMP ...

否则部分达梦环境会直接报:

Plaintext
[VERSIONS]附近出现错误: 语法分析出错

4. 不知道具体修改时间时

如果只知道大概在 14:00 ~ 15:00 之间被修改,可以先用版本查询:

SQL
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;

先找到大概的修改时间,再用:

SQL
AS OF TIMESTAMP

查看修改前后的完整数据。

实际排查时推荐:

VERSIONS BETWEEN 找修改时间
AS OF TIMESTAMP 看指定时间的数据


5. 几个月前创建的数据也能闪回

闪回查询不是“查询最近修改过的数据”。

即使一条数据几个月前创建,最近完全没有修改,只要查询的时间点还在当前闪回有效范围内:

SQL
SELECT *
FROM T_ORDER
AS OF TIMESTAMP '2026-09-04 10:00:00'
WHERE ID = '10001';

一样可以正常查到。

如果这期间没有修改,查询结果通常和当前数据相同。


6. 闪回时间不是绝对硬边界

例如闪回保留时间设置为 24 小时,实际可能还能查询到:

Plaintext
24小时05分钟前
24小时10分钟前

的数据。

超过保留时间后,相关历史版本不会在某一秒立刻全部消失,所以有时会有一点额外余量。

但超过配置时间的部分不能认为是稳定可用的。

如果出现:

回滚记录版本太旧,无法获取用户记录

基本可以理解为:

目标时间需要的历史版本已经不存在了。


最常用的两条 SQL

查某个时间点

SQL
SELECT *
FROM T_ORDER
AS OF TIMESTAMP '2026-09-04 14:30:00'
WHERE ID = '10001';

查最近 24 小时修改历史

SQL
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 看一段时间内的数据版本变化。

海拔科技

自媒体人,喜欢网络,热爱研究。本站头条号:星河 熊掌号:海拔科技

相关推荐

查询MySQL数据库中没有主键的表

以下语句可批量查询MySQL数据库中未设置主键的表,查询后会列出所有未设置主键的表。 select table_schema,table_name from information_schema.tables where (table_schema,table_name) not in( select distinc …

CentOS7安装MySQL5.7.x全过程记录

此文章记录了如何在CentOS7安装MySQL5.7.X版本,本文安装方法采用的是yum安装,非编译安装。文章转自镜湖月色的博客,并根据自身项目需求稍作修改。 1. 下载 MySQL yum包  2.安装MySQL源 3.安装MySQL …

简单SQL多表连接查询示例

一、内连接 ——inner join(inner可以省略) 返回两个表的交集: 1.1隐式内连接(看不到join的内连接)          就是加了条件的交叉连接:select * from A,B where A.id = B.aid   &nb …

解决方法 | ORA-00922选项缺失或无效

创建oracle的时候提示ORA-00922选项缺失或无效,如果忽略接下来会提示 ORA-28000: 账户锁定的错误,这个问题的解决方法很简单: 就是在上面创建数据库有一步是输入密码的,这里的密码不能以数字开头!!! 密码 …