达梦数据库(DM Database)中的闪回查询(Flashback Query)功能,是用来查询“某个时间点或者某个SCN(系统变更号)”之前的数据的。也就是说,即使数据已经被修改或删除了,通过闪回查询,我们依然可以看到它过去某一时刻的样子。

这种功能在处理误操作(比如误删数据)、审计历史数据变化时,非常有用。

1. 基本使用方法

达梦数据库的闪回查询,主要通过在SELECT语句后加上:

  • AS OF SCN
  • 或者 AS OF TIMESTAMP

来指定查询的历史快照。

基本语法:

SELECT * FROM 表名 AS OF SCN SCN号 WHERE 条件;

或者

SELECT * FROM 表名 AS OF TIMESTAMP TO_TIMESTAMP('时间', 'yyyy-mm-dd hh24:mi:ss') WHERE 条件;

2. 一个简单示例

比如,假设你有一个叫 EMPLOYEE 的表,10分钟前删掉了一行数据,现在想查回来看:

SELECT * 
FROM EMPLOYEE 
AS OF TIMESTAMP TO_TIMESTAMP('2025-04-22 10:00:00', 'yyyy-mm-dd hh24:mi:ss')
WHERE EMP_ID = 12345;

如果你知道当时的SCN号(系统变更号),可以用:

SELECT * 
FROM EMPLOYEE 
AS OF SCN 135792468 
WHERE EMP_ID = 12345;

3. 注意事项

  • UNDO数据要保留得足够久。
    如果UNDO空间不够,或者UNDO已经过期了,就不能进行闪回查询了。
  • AS OF SCN / TIMESTAMP语法只适用于普通表,一些特殊对象(比如临时表)可能不支持。
  • 在使用AS OF TIMESTAMP时,系统会根据时间推算出对应的SCN,但有一点小误差是正常的。
  • 闪回查询只查询,不会影响当前的数据。

4. 小技巧

  • 想知道某个时间点对应的SCN号?可以先查一下系统表:
SELECT DBSCN FROM V$INSTANCE;
  • 或者记录下某个时刻的SCN备查。