达梦闪回功能与oracle对比使用总结

1. 闪回功能介绍

当用户操作不慎导致错误的删改数据时,非常希望有一种简单快捷的方式可以恢复数据。闪回技术,就是为了用户可以迅速处理这种数据逻辑损坏的情况而产生的。闪回技术主要是通过回滚段存储的 UNDO 记录来完成历史记录的还原。数据库会在内存中记录下每个事务的起始时间和提交时间。通过用户指定的时刻,查询到该时刻的事务号,结合当前记录和回滚段中的 UNDO 记录,就可以还原出特定事务号的记录。

2. 达梦数据库闪回

2.1 达梦环境信息

WINDOWS10 + 达梦版本(DMV8:1-1-126)

2.2 达梦开启闪回

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

select * from SYS."V$DM_INI" where "V$DM_INI".PARA_NAME	like 'ENABLE_FLASHBACK';--查询是否开启了闪回功能。
PARA_NAME			PARA_VALUE
ENABLE_FLASHBACK		0


SP_SET_PARA_VALUE(1,'ENABLE_FLASHBACK',1);--开启闪回功能。

select * from SYS."V$DM_INI" where "V$DM_INI".PARA_NAME	like 'ENABLE_FLASHBACK';-查询是否开启了闪回功能。
PARA_NAME	PARA_VALUE
ENABLE_FLASHBACK	1


或者通过下面SQL开启闪回功能
SQL> alter system set ‘ENABLE_FLASHBACK’=1 both;
SQL> select name,type,value from v$parameter where name='ENABLE_FLASHBACK';
NAME				TYPE	VALUE
ENABLE_FLASHBACK	SYS		1

修改闪回数据保留时间

闪回默认UNDO保留时间为900秒(15分钟),可以对保留时间进行修改。
SQL> select name,type,value from v$parameter where name = 'UNDO_RETENTION';
NAME			TYPE		VALUE
UNDO_RETENTION	SYS			90.000000

SQL> alter system set ‘UNDO_RETENTION’=3600 both;--修改保留时间为3600秒。

2.3 闪回查询

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

创建测试表PERSON_TYPE2 表。
drop table PERSON.PERSON_TYPE2;
create table PERSON.PERSON_TYPE2 as select * from PERSON.PERSON_TYPE;
SELECT * FROM PERSON.PERSON_TYPE2;
PERSON_TYPEID	NAME
1	采购经理
2	采购代表
3	销售经理
4	销售代表
5	防损员

select sysdate from dual;--查询当前时间
2021-05-24 22:11:19

INSERT INTO PERSON.PERSON_TYPE2 VALUES(5,'防损员');
INSERT INTO PERSON.PERSON_TYPE2 VALUES(6,'保洁员');
COMMIT;

SELECT * FROM PERSON.PERSON_TYPE2;
1	采购经理
2	采购代表
3	销售经理
4	销售代表
5	防损员
6	保洁员

SELECT * FROM PERSON.PERSON_TYPE WHEN TIMESTAMP '2021-05-24 22:11:19';
1	采购经理
2	采购代表
3	销售经理
4	销售代表

**注意要在图形界面里提交事务,否则实验失败**
select sysdate from dual;
2021-05-24 22:12:21

SELECT * FROM PERSON.PERSON_TYPE2;
PERSON_TYPEID	NAME
1	采购经理
2	采购代表
3	销售经理
4	销售代表
5	防损员
6	保洁员

DELETE FROM PERSON.PERSON_TYPE2 WHERE name='保洁员';
COMMIT;

SELECT * FROM PERSON.PERSON_TYPE2;
1	采购经理
2	采购代表
3	销售经理
4	销售代表
5	防损员

使用闪回查询得到删除前的数据。
SELECT * FROM PERSON.PERSON_TYPE2 WHEN TIMESTAMP '2021-05-24 22:12:21';
1	采购经理
2	采购代表
3	销售经理
4	销售代表
5	防损员
6	保洁员

例 2 闪回查询指定 TRXID 的 PERSON_TYPE 表。
要获得 TRXID 信息,需要通过闪回版本查询的伪列 VERSIONS_ENDTRXID。 在时刻修改数据,并提交。

select sysdate from DUAL;--查询系统时间
2021-05-27 11:50:32
UPDATE PERSON.PERSON_TYPE2 SET NAME='保安员1' WHERE PERSON_TYPEID=5;
COMMIT;
UPDATE PERSON.PERSON_TYPE2 SET NAME='收银员1' WHERE PERSON_TYPEID=5;
COMMIT;

select sysdate from DUAL;--查询系统时间
2021-05-27 11:50:46


SELECT * FROM PERSON.PERSON_TYPE2;--查询PERSON_TYPE2表的数据
1	采购经理
2	采购代表
3	销售经理
4	销售代表
5	收银员1
NULL	防损员
NULL	保洁员

SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE2 VERSIONS BETWEEN TIMESTAMP '2021-05-27 11:50:32' AND SYSDATE;--查询事务的TRXID号
NULL	采购经理
NULL	采购代表
NULL	销售经理
NULL	销售代表
NULL	收银员1
NULL	防损员
NULL	保洁员
608102	保安员1
608101	收银员1

SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 608102;--通过TRXID查询
1	采购经理
2	采购代表
3	销售经理
4	销售代表

2.4 闪回版本查询

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

select * from PERSON.PERSON_TYPE2
PERSON_TYPEID	NAME
1	采购经理
2	采购代表
3	销售经理
4	销售代表
5	收银员

INSERT INTO PERSON.PERSON_TYPE2(NAME) VALUES('防损员');
INSERT INTO PERSON.PERSON_TYPE2(NAME) VALUES('保洁员');
COMMIT;

select * from PERSON.PERSON_TYPE2;
PERSON_TYPEID	NAME
1	采购经理
2	采购代表
3	销售经理
4	销售代表
5	收银员
NULL	防损员
NULL	保洁员

对测试数据进行更新

select sysdate from dual;
2021-05-24 22:16:09  时刻修改数据,并提交。

UPDATE PERSON.PERSON_TYPE2 SET NAME='保安员' WHERE PERSON_TYPEID=5;
COMMIT;
UPDATE PERSON.PERSON_TYPE2 SET NAME='收银员' WHERE PERSON_TYPEID=5;
COMMIT;

SELECT * FROM PERSON.PERSON_TYPE2;
PERSON_TYPEID	NAME
1	采购经理
2	采购代表
3	销售经理
4	销售代表
5	收银员
NULL	防损员
NULL	保洁员

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

SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE2 VERSIONS BETWEEN 
TIMESTAMP '2021-05-24 22:16:09' AND SYSDATE;
VERSIONS_ENDTRXID	NAME
598293	保安员
598292	收银员

3. ORACLE闪回功能

3.1 ORACLE环境信息

实验环境:WINDOWS10+ORACLE11.2.0.4.0

3.2 闪回查询

创建测试表和数据

CREATE TABLE test15 (A NUMBER,B NUMBER);--创建实测表
INSERT INTO test15 VALUES(1,1);--插入测试数据
COMMIT;

查询当前系统SCN号

SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;--查看SCN号
1236197

再次插入测试数据

INSERT INTO test15 VALUES(2,2);
COMMIT;

SELECT * FROM test15;
1 1 1
2 2 2

再次查询系统SCN号

SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;--查看SCN号
1236205

使用表闪回功能时需要开启表的行移动功能

ALTER TABLE test15 ENABLE ROW MOVEMENT;--开启表行移动功能

使用闪回功能对数据进行闪回

FLASHBACK TABLE test15 TO SCN 1236197;--闪回到第一个SCN

SELECT * FROM test15;
1 1 1

FLASHBACK TABLE test15 TO SCN 1236205;--闪回到第二个SCN

SELECT * FROM test15;
1 1 1
2 2 2

3.3 闪回版本查询

创建测试数据

CREATE TABLE EMP1 AS SELECT * FROM SCOTT.EMP WHERE 1=2;--创建测试表EMP1
select * from EMP1;
1 7902  FORD  ANALYST 7566  1981-12-03  3000.00   20
2 7902  FORD  ANALYST 7566  1981-12-03  3000.00   20
3 7788  SCOTT ANALYST 7566  1982-12-09  8888.00   20
4 7698  BLAKE MANAGER 7839  1981-05-01  2850.00   30

查询当前系统时间

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;

插入测试数据

INSERT INTO EMP1 SELECT * FROM SCOTT.EMP WHERE EMPNO=7902;--插入测试数据
commit;
INSERT INTO EMP1 SELECT * FROM SCOTT.EMP WHERE EMPNO=7788;--插入测试数据
INSERT INTO EMP1 SELECT * FROM SCOTT.EMP WHERE EMPNO=7698;--插入测试数据
COMMIT;
UPDATE EMP1 SET SAL=8888 WHERE EMPNO=7788;--更新测试数据
COMMIT;

查询当前系统时间

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;--查询结束时间
1  2021-05-23 10:51:30  1234601

使用闪回版本查询

SELECT TO_CHAR(VERSIONS_STARTTIME,'YYYY-MM-DD HH24:MI:SS') VERSIONS_STARTTIME,VERSIONS_STARTSCN,TO_CHAR(VERSIONS_ENDTIME,'YYYY-MM-DD HH24:MI:SS') VERSIONS_ENDTIME ,VERSIONS_ENDSCN,VERSIONS_XID,VERSIONS_OPERATION,EMPNO
    FROM EMP1 VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE 
   ORDER BY VERSIONS_STARTTIME;

3.4 闪回事务查询

创建测试数据

CREATE TABLE emp5 AS SELECT * FROM SCOTT.EMP WHERE EMPNO=7902;
SELECT * FROM emp5;
1	7902	FORD	ANALYST	7566	1981-12-03	3000.00		20

查询系统时间并更新测试数据

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;
1	2021-05-23 14:46:51	1235293
UPDATE emp4 SET SAL=8888 WHERE EMPNO=7902;
COMMIT;

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;
1	2021-05-23 14:47:02	1235298
CREATE TABLE emp6 AS SELECT * FROM SCOTT.EMP WHERE EMPNO=7902;

SELECT * FROM emp6;
 1	7902	FORD	ANALYST	7566	1981-12-03	3000.00		20

UPDATE emp6 SET SAL=8888 WHERE EMPNO=7902;
commit;

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;
1	2021-05-23 14:48:17	1235349

UPDATE emp6 SET SAL=7777 WHERE EMPNO=7902;
commit;


SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;
1	2021-05-23 14:49:04	1235383

使用闪回事务查询

SELECT START_SCN, COMMIT_SCN, LOGON_USER, OPERATION, TABLE_NAME, UNDO_SQL
 FROM FLASHBACK_TRANSACTION_QUERY V
 WHERE V.logon_user='SYSTEM' and V.operation='UPDATE'  AND V.table_name='EMP6'
 ORDER BY V.START_SCN;
以下是查询结果:
1 1235344 1235345 SYSTEM  UPDATE  EMP6  update "SYSTEM"."EMP6" set "SAL" = '3000' where ROWID = 'AAATisAABAABKGJAAA';
2 1235369 1235370 SYSTEM  UPDATE  EMP6  update "SYSTEM"."EMP6" set "SAL" = '8888' where ROWID = 'AAATisAABAABKGJAAA';

3.5 闪回表

创建测试表和测试数据

CREATE TABLE test17 AS SELECT * FROM DUAL;
DROP TABLE test17;
SELECT * FROM DBA_RECYCLEBIN;

CREATE TABLE  test17 TABLESPACE USERS AS SELECT * FROM DUAL;
DROP TABLE test17;

查询回收站对象

SELECT * FROM DBA_RECYCLEBIN;
1 SYSTEM  BIN$QTlxni9UQy6EDHUwrmBbcA==$0  TEST17  DROP  TABLE USERS 2021-05-23:15:11:51 2021-05-23:15:11:54 1236981   YES YES 80054 80054 80054 8

使用闪回功能闪回表

FLASHBACK TABLE "BIN$QTlxni9UQy6EDHUwrmBbcA==$0" TO BEFORE DROP;  --闪回删除表
FLASHBACK TABLE "TEST17" TO BEFORE DROP;--闪回删除表

4.总结

通过以上实验发现,DM和ORACLE实现闪回的原理和命令基本一致,ORACLE数据库在闪回功能方面功能更丰富一下,但是两者在易用性上都比较友好。DM需要手动开启闪回功能,ORACLE数据库某些闪回应用则需要手动开启如补充日志或开启表的行移动功能。

数据闪回主要用在:
	1. 自我维护过程中的修复:当一些重要的记录被意外删除,用户可以向后移动到一个时间点,查看丢失的行并把它们重新插入现在的表内恢复;
	2. 用于分析数据变化:可以对同一张表的不同闪回时刻进行链接查询,以此查看变化的数据。

DM支持的闪回功能:

		1.闪回查询
		2.闪回版本查询等

ORACLE支持的闪回功能:

		1.闪回查询
		2.闪回版本查询
		3.闪回事务查询
		4.闪回表等
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值