千家信息网

DM7闪回与闪回查询

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,闪回当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。闪回技术主要是通过回滚段存储的UNDO记录来完成历史
千家信息网最后更新 2026年11月01日DM7闪回与闪回查询

闪回
当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。

闪回技术主要是通过回滚段存储的UNDO记录来完成历史记录的还原。设置ENABLE_FLASHBACK为1后,开启闪回功能。DM会保留回滚段一段时间,回滚段保留的时间代表着可以闪回的时间长度。由UNDO_RETENTION参数指定。

SQL> select sf_get_para_value(1,'ENABLE_FLASHBACK');LINEID     SF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK')---------- ---------------------------------------1          0used time: 204.313(ms). Execute id is 62.SQL> select sf_get_para_value(1,'UNDO_RETENTION');LINEID     SF_GET_PARA_VALUE(1,'UNDO_RETENTION')---------- -------------------------------------1          90used time: 6.236(ms). Execute id is 63.

下面修改动态参数ENABLE_FLASHBACK,scope=1同时修改内存和dm.ini文件

SQL> call sp_set_para_value(1,'ENABLE_FLASHBACK',1);DMSQL executed successfullyused time: 13.216(ms). Execute id is 64.SQL> select sf_get_para_value(1,'ENABLE_FLASHBACK');LINEID     SF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK')---------- ---------------------------------------1          1used time: 5.703(ms). Execute id is 65.

回滚段保留的时间缺省值为90秒,我们要修改它为1天

SQL> select sf_get_para_value(1,'UNDO_RETENTION');LINEID     SF_GET_PARA_VALUE(1,'UNDO_RETENTION')---------- -------------------------------------1          90used time: 6.236(ms). Execute id is 63.SQL> call sp_set_para_value(1,'UNDO_RETENTION',86400);                            DMSQL executed successfullyused time: 7.155(ms). Execute id is 74.SQL> select sf_get_para_value(1,'UNDO_RETENTION');LINEID     SF_GET_PARA_VALUE(1,'UNDO_RETENTION')---------- -------------------------------------1          86400used time: 5.877(ms). Execute id is 75.

开启闪回功能后,DM会在内存中记录下每个事务的起始时间和提交时间。通过用户指定的时刻,查询到该时刻的事务号,结合当前记录和回滚段中的UNDO记录,就可以还原出特定事务号的记录。即指定时刻的记录状态。从而完成闪回查询。闪回查询功能完全依赖于回滚段管理,对于DROP等误操作不能恢复。闪回特性可应用在以下方面:
1. 自我维护过程中的修复:当一些重要的记录被意外删除,用户可以向后移动到一个时间点,查看丢失的行并把它们重新插入现在的表内恢复;

2. 用于分析数据变化:可以对同一张表的不同闪回时刻进行链接查询,以此查看变化的数据。

闪回查询
当系统INI参数ENABLE_FLASHBACK置为1时,闪回功能开启,可以进行闪回查询。MPP环境不支持闪回查询。

SQL> select sf_get_para_value(1,'ENABLE_FLASHBACK');LINEID     SF_GET_PARA_VALUE(1,'ENABLE_FLASHBACK')---------- ---------------------------------------1          1used time: 5.703(ms). Execute id is 65.[root@shard1 jydm]# strings dm.ini | grep flashENABLE_FLASHBACK            =  1                    #Whether to enable flashback function

闪回查询子句
闪回查询子句的语法,是在数据查询语句(参考第4章)的基础上,为FROM子句增加了闪回查询子句。
语法格式
< 闪回查询子句>::=WHEN |

参数
1.time_exp 一个日期表达式,一般用字符串方式表示
2.trxid 指定事务ID号

语句功能
用户通过闪回查询子句,可以得到指定表过去某时刻的结果集。指定条件可以为时刻,或事务号

使用说明
1.闪回查询只支持普通表(包括加密表与压缩表)、临时表和堆表,不支持水平分区表、垂直分区表、列存储表、外部表与视图;

2.闪回查询中trxid的值,一般需要由闪回版本查询(见下节)的伪列来确定。实际使用中多采用指定时刻的方式。

例1闪回查询特定时刻的PERSON_TYPE表。
查询PERSON_TYPE表。

SQL> SELECT * FROM PERSON.PERSON_TYPE;LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表used time: 15.321(ms). Execute id is 78.

在插入数据之前记录时间,在闪回查询时使用

SQL> select sysdate;LINEID     SYSDATE                    ---------- ---------------------------1          2019-12-01 23:34:12.761683used time: 0.480(ms). Execute id is 79.SQL> INSERT INTO PERSON.PERSON_TYPE(NAME) VALUES('防损员');affect rows 1used time: 0.615(ms). Execute id is 80.SQL> INSERT INTO PERSON.PERSON_TYPE(NAME) VALUES('保洁员');affect rows 1used time: 0.562(ms). Execute id is 81.SQL> commit;executed successfullyused time: 16.237(ms). Execute id is 82.SQL> SELECT * FROM PERSON.PERSON_TYPE;LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表5          7             防损员6          8             保洁员6 rows gotused time: 0.626(ms). Execute id is 83.

使用闪回查询取得2019-12-01 23:34:12时刻的数据。此时刻在插入数据的操作之前,可见此时的结果集不应该有2019-12-01 23:34:12时刻以后插入的数据。

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TIMESTAMP '2019-12-01 23:34:12';LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表used time: 1.416(ms). Execute id is 84.

在2019-12-01 23:39:26时刻删除数据,并提交。

SQL> select sysdate;LINEID     SYSDATE                    ---------- ---------------------------1          2019-12-01 23:39:26.865328used time: 0.580(ms). Execute id is 85.SQL> DELETE FROM PERSON.PERSON_TYPE WHERE PERSON_TYPEID > 5;affect rows 2used time: 1.797(ms). Execute id is 86.SQL> commit;executed successfullyused time: 19.834(ms). Execute id is 87.SQL> SELECT * FROM PERSON.PERSON_TYPE;LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表5          5             防损员used time: 0.691(ms). Execute id is 88.

使用闪回查询得到删除前的数据。

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TIMESTAMP '2019-12-01 23:39:26';LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表5          5             防损员6          6             保洁员6 rows gotused time: 1.262(ms). Execute id is 89.

闪回查询指定TRXID的PERSON_TYPE表。
要获得TRXID信息,需要通过闪回版本查询的伪列VERSIONS_ENDTRXID。

在2019-12-01 23:45:27 时刻修改数据,并提交。

SQL> select sysdate;LINEID     SYSDATE                    ---------- ---------------------------1          2019-12-01 23:48:27.983996used time: 0.509(ms). Execute id is 90.SQL> SELECT * FROM PERSON.PERSON_TYPE;LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表5          9             防损员6          10            保洁员6 rows gotused time: 0.515(ms). Execute id is 97.SQL> UPDATE PERSON.PERSON_TYPE SET NAME='保安员' WHERE PERSON_TYPEID=9;affect rows 1used time: 1.460(ms). Execute id is 99.SQL> commit;executed successfullyused time: 16.640(ms). Execute id is 100.SQL> UPDATE PERSON.PERSON_TYPE SET NAME='收银员' WHERE PERSON_TYPEID=9;affect rows 1used time: 1.851(ms). Execute id is 101.SQL> commit;executed successfullyused time: 16.781(ms). Execute id is 102.SQL> SELECT * FROM PERSON.PERSON_TYPE;LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表5          9             收银员6          10            保洁员6 rows gotused time: 0.516(ms). Execute id is 103.

进行闪回版本查询,确定TRXID。

SQL> SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2019-12-01 23:48:27.983996' AND SYSDATE;LINEID     VERSIONS_ENDTRXID    NAME    ---------- -------------------- --------1          NULL                 采购经理2          NULL                 采购代表3          NULL                 销售经理4          NULL                 销售代表5          NULL                 收银员6          NULL                 保洁员7          749195               保安员7 rows gotused time: 1.384(ms). Execute id is 104.

根据TRXID确定版本。

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749195;LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表5          9             保安员6          10            保洁员6 rows gotused time: 1.261(ms). Execute id is 105.

第二次更新的事务ID为749195,那么第一次更新的事务ID为749194

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749194;LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表5          9             防损员6          10            保洁员6 rows got

闪回版本查询
语法格式
< 闪回版本查询子句>::=VERSIONS BETWEEN |

参数
1.time_exp 日期表达式,一般用字符串方式表示。time_exp1表示起始时间,time_exp2表示结束时间

2. trxid 指定事务ID号,整数表示。trxid1表示起始trxid,trxid2表示结束trxid

使用说明
1.闪回版本查询支持普通表(包括加密表与压缩表)、临时表和堆表,不支持水平分区表、垂直分区表、列存储表、外部表与视图;

2.支持伪列,作为闪回版本查询的辅助信息。
伪列 说明
VERSIONS_START{TRXID|TIME} 起始TRXID或时间戳
VERSIONS_END{TRXID|TIME} 提交TRXID或时间戳。如果该值为NULL,表示行版本仍然是当前版本
VERSIONS_OPERATION 在行上的操作(I=Insert,D=Delete,U=Update)

语句功能
用户通过闪回版本查询子句,可以得到指定表过去某个时间段内,事务导致记录变化的全部记录。指定条件可以为时刻,或事务号。

例1 闪回版本查询指定时间段内,PERSON_TYPE表的记录变化

SQL> select sysdate;LINEID     SYSDATE                    ---------- ---------------------------1          2019-12-02 00:00:18.221877used time: 0.662(ms). Execute id is 107.

在2019-12-02 00:00:18时刻修改数据,并提交。

SQL> UPDATE PERSON.PERSON_TYPE SET NAME='打字员' WHERE PERSON_TYPEID=9;affect rows 1used time: 1.758(ms). Execute id is 110.SQL> commit;executed successfullyused time: 16.964(ms). Execute id is 111.SQL> SQL> UPDATE PERSON.PERSON_TYPE SET NAME='卫生员' WHERE PERSON_TYPEID=9;affect rows 1used time: 1.268(ms). Execute id is 112.SQL> commit;executed successfullyused time: 15.983(ms). Execute id is 113.SQL> SELECT * FROM PERSON.PERSON_TYPE;LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表5          9             卫生员6          10            保洁员6 rows gotused time: 0.669(ms). Execute id is 114.

进行闪回版本查询,获得指定时间段内变化的记录。

SQL> SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE VERSIONS BETWEEN TIMESTAMP '2019-12-02 00:00:17' AND SYSDATE;LINEID     VERSIONS_ENDTRXID    NAME    ---------- -------------------- --------1          NULL                 采购经理2          NULL                 采购代表3          NULL                 销售经理4          NULL                 销售代表5          NULL                 卫生员6          NULL                 保洁员7          749197               打字员7 rows gotused time: 1.412(ms). Execute id is 115.

第二次更新的事务ID为749197

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749197;LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表5          9             打字员6          10            保洁员6 rows gotused time: 1.371(ms). Execute id is 120.

第一次更新的事务ID为749196

SQL> SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 749196;LINEID     PERSON_TYPEID NAME    ---------- ------------- --------1          1             采购经理2          2             采购代表3          3             销售经理4          4             销售代表5          9             收银员6          10            保洁员6 rows gotused time: 0.585(ms). Execute id is 121.

闪回事务查询
闪回事务查询提供系统视图V$FLASHBACK_TRX_INFO供用户查看在事务级对数据库所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。

使用说明
系统视图名为V$FLASHBACK_TRX_INFO,定义如下所示。

SQL> desc V$FLASHBACK_TRX_INFOLINEID     NAME             TYPE$         NULLABLE---------- ---------------- ------------- --------1          START_TRXID      BIGINT        Y        事务中第一个DML的TRXID2          START_TIMESTAMP  DATETIME(6)   Y        事务中第一个DML的时间戳3          COMMIT_TRXID     BIGINT        Y        提交事务的TRXID4          COMMIT_TIMESTAMP DATETIME(6)   Y        提交事务时的时间戳5          LOGIN_USER       VARCHAR(256)  Y        拥有事务的用户6          UNDO_CHANGE#     INTEGER       Y        记录修改顺序序号7          OPERATION        CHAR(1)       Y        DML操作类型 D:删除;U:修改;I:插入;N:更新插入(专门针对CLUSTER PRIMARY KEY的插入);C:事务提交;P:预提交记录;O:default8          TABLE_NAME       VARCHAR(256)  Y        DML 修改的表     9          TABLE_OWNER      VARCHAR(256)  Y        DML修改表的拥有者      10         ROW_ID           BIGINT        Y        DML修改行的ROWID11         UNDO_SQL         VARCHAR(3900) Y        撤销DML操作的SQL语句11 rows gotused time: 88.801(ms). Execute id is 122.

查询指定时间之后的事务信息,可为闪回查询操作提供参考

SQL> SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP > '2019-12-01 23:13:28';LINEID     START_TRXID          START_TIMESTAMP             COMMIT_TRXID         COMMIT_TIMESTAMP            LOGIN_USER UNDO_CHANGE# OPERATION TABLE_NAME TABLE_OWNER ROW_ID               UNDO_SQL---------- -------------------- --------------------------- -------------------- --------------------------- ---------- ------------ --------- ---------- ----------- -------------------- --------1          749189               2019-12-01 23:13:28.000000  749190               2019-12-01 23:33:57.588000  SYSDBA     16           C         NULL       NULL        NULL                 NULLused time: 1.437(ms). Execute id is 126.
查询 代表 经理 采购 销售 事务 时间 数据 时刻 保洁员 版本 保洁 用户 功能 子句 防损员 支持 参数 视图 变化 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技企业 互联网和科技技术 互联网科技社 麻工互联网科技 银川新华互联网科技学校地址 深圳前海聚择互联网科技有限公司 宁波青枫互联网科技有限公司 互联网金融科技展 迪庆互联网科技招生 为客找房互联网科技公司怎么样 山东大美朱楼互联网科技有限公司 新氧科技和美国互联网有关系吗 济南小医互联网科技有限公司招聘 互联网科技机房 易租星互联网科技有限公司 互联网的科技体现在哪里 北京品多多互联网科技有限公司 平安好医生打造互联网科技医疗 每日互联网科技新闻 广州全民伙伴互联网科技有限公司 工业互联网科技新基建 互联网科技公司电话 互联网汽车科技小镇 互联网科技中介 重庆威客帮互联网科技 受益于互联网科技的高速发展 迪庆互联网科技招生 工业互联网科技创业 兰石爱特工业互联网科技分公司 北京瑞云互联网科技有限公司
0