DM7闪回与闪回查询

简介: 闪回当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。 闪回技术主要是通过回滚段存储的UNDO记录来完成历史记录的还原。

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

闪回技术主要是通过回滚段存储的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 0

used 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 90

used 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 successfully
used 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 1

used 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 90

used time: 6.236(ms). Execute id is 63.

SQL> call sp_set_para_value(1,'UNDO_RETENTION',86400);
DMSQL executed successfully
used 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 86400

used 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 1

used time: 5.703(ms). Execute id is 65.

[root@shard1 jydm]# strings dm.ini | grep flash
ENABLE_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.761683

used time: 0.480(ms). Execute id is 79.

SQL> INSERT INTO PERSON.PERSON_TYPE(NAME) VALUES('防损员');
affect rows 1

used time: 0.615(ms). Execute id is 80.
SQL> INSERT INTO PERSON.PERSON_TYPE(NAME) VALUES('保洁员');
affect rows 1

used time: 0.562(ms). Execute id is 81.
SQL> commit;
executed successfully
used 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 got

used 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.865328

used time: 0.580(ms). Execute id is 85.

SQL> DELETE FROM PERSON.PERSON_TYPE WHERE PERSON_TYPEID > 5;
affect rows 2

used time: 1.797(ms). Execute id is 86.
SQL> commit;
executed successfully
used 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 got

used 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.983996

used 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 got

used time: 0.515(ms). Execute id is 97.

SQL> UPDATE PERSON.PERSON_TYPE SET NAME='保安员' WHERE PERSON_TYPEID=9;
affect rows 1

used time: 1.460(ms). Execute id is 99.
SQL> commit;
executed successfully
used time: 16.640(ms). Execute id is 100.
SQL> UPDATE PERSON.PERSON_TYPE SET NAME='收银员' WHERE PERSON_TYPEID=9;
affect rows 1

used time: 1.851(ms). Execute id is 101.
SQL> commit;
executed successfully
used 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 got

used 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 got

used 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 got

used 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表示结束时间

  1. 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.221877

used 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 1

used time: 1.758(ms). Execute id is 110.
SQL> commit;
executed successfully
used time: 16.964(ms). Execute id is 111.
SQL>
SQL> UPDATE PERSON.PERSON_TYPE SET NAME='卫生员' WHERE PERSON_TYPEID=9;
affect rows 1

used time: 1.268(ms). Execute id is 112.
SQL> commit;
executed successfully
used 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 got

used 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 got

used 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 got

used 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 got

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

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

SQL> desc V$FLASHBACK_TRX_INFO

LINEID NAME TYPE$ NULLABLE
---------- ---------------- ------------- --------
1 START_TRXID BIGINT Y 事务中第一个DML的TRXID
2 START_TIMESTAMP DATETIME(6) Y 事务中第一个DML的时间戳
3 COMMIT_TRXID BIGINT Y 提交事务的TRXID
4 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:default
8 TABLE_NAME VARCHAR(256) Y DML 修改的表
9 TABLE_OWNER VARCHAR(256) Y DML修改表的拥有者
10 ROW_ID BIGINT Y DML修改行的ROWID
11 UNDO_SQL VARCHAR(3900) Y 撤销DML操作的SQL语句

11 rows got

used 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 NULL

used time: 1.437(ms). Execute id is 126.

目录
相关文章
|
存储 SQL JSON
信创迁移适配实战-MySQL到达梦数据库DM8的数据迁移
信创迁移适配实战-MySQL到达梦数据库DM8的数据迁移
8141 0
信创迁移适配实战-MySQL到达梦数据库DM8的数据迁移
|
安全 Java 数据库连接
《Spring Boot配置文件大揭秘:看懂 application.yaml 与 bootstrap.yaml 的不同》
《Spring Boot配置文件大揭秘:看懂 application.yaml 与 bootstrap.yaml 的不同》
1558 0
|
6月前
|
运维 自然语言处理 Kubernetes
AIOps运维实战指南:OpenClaw阿里云+本地部署保姆级教程,让AI Agent接管运维任务!
本文基于2026年最新实战案例,完整还原OpenClaw与K8s MCP的适配全过程,详细提供阿里云与本地双部署流程,同步分享MCP客户端改造、会话缓存配置、运维技能封装等实操步骤,所有代码命令可直接复制执行,助力运维人员解放重复劳动,打造专属AI运维助手。
1713 12
|
6月前
|
存储 消息中间件 人工智能
2026年阿里云最新个人360元,企业用户1728元优惠券领取和使用介绍
2026年阿里云推出AI焕新季活动,为个人和企业用户提供满减券礼包,个人满减券总额360元,企业满减券总额1728元。这些优惠券适用于千问图像生成模型、大语言模型推理等AI产品,也适用于云服务器ECS、云数据库等官方产品的新购和升级。活动面向已实名认证的用户,用户可在活动期间内领取并使用优惠券,享受新购和升级的优惠。
1734 2
|
存储 人工智能 JavaScript
小米AI眼镜是值不值得买,看完就知道
2025年6月26日,小米正式发布首款AI眼镜,售价1999元起。搭载高通AR1芯片与恒玄2700,配备1200万摄像头、5麦克风阵列,支持录音转写、同声传译、卡路里识别等功能。可选电致变色镜片,双指轻划0.2秒变色。4GB+32GB存储组合,续航约50分钟。外观致敬Meta RayBan,经典百搭。虽定价略高,但功能丰富,适合有智能穿戴需求的用户。
|
8月前
|
人工智能 并行计算 算法框架/工具
英伟达三大AI法宝:CUDA、NVLink、InfiniBand——构筑AI时代的算力基石
英伟达三大AI法宝——CUDA(编程层)、NVLink(芯片互连)、InfiniBand(系统互连),构成软硬协同的全栈加速体系:CUDA释放GPU通用算力,NVLink实现多卡高速协同,InfiniBand支撑万卡集群高效通信,共同筑就AI时代的算力基石。(239字)
977 1
|
6月前
|
人工智能 Cloud Native Java
深耕三十载,焕新向未来——Java语言的发展之路与时代新篇
在技术迭代日新月异的今天,有一门语言自1995年诞生以来,历经三十年风雨洗礼,始终稳踞企业开发核心阵地,从桌面应用到云端架构,从移动终端到人工智能,它的身影无处不在,这就是Java。
850 0
|
数据采集 负载均衡 监控
巨量http,全民ip,芝麻http,太阳http,天启代理,大麦代理,2025最新测评隧道代理选谁?
隧道代理通过云端自动切换IP,简化了传统代理的复杂操作,成为数据采集、广告监测等领域的高效工具。本文解析其工作原理,探讨选型要点,助你找到最适合的方案。
|
NoSQL 算法 测试技术
【MongoDB 专栏】MongoDB 的自动分片与手动分片
【5月更文挑战第11天】MongoDB的分片技术在处理大规模数据和高并发场景中至关重要,提供自动和手动两种方式。自动分片基于预定义规则,简化管理,适合大部分场景,但灵活性有限。手动分片则允许用户自定义策略,实现高效布局,适用于有特殊需求的应用,但配置复杂。选择分片方式需考虑业务需求、数据特点和技术能力。正确实施分片策略能构建高性能、可扩展的系统,支持企业业务发展。随着技术进步,未来的分片技术将更加智能和易用。
662 3
【MongoDB 专栏】MongoDB 的自动分片与手动分片
|
文字识别
文本,文字识别,PaddleOCR,如何删除,PaddleOCR详解,检测,方向分类器,识别,检测的意思是检查字符的位置,查像素坐标,方向分类器,能够实现180度的图像,字符识别是把识别字符
文本,文字识别,PaddleOCR,如何删除,PaddleOCR详解,检测,方向分类器,识别,检测的意思是检查字符的位置,查像素坐标,方向分类器,能够实现180度的图像,字符识别是把识别字符