达梦闪回功能与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。 在 2022-04-22 12:24:05 时刻修改数据,并提交。

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

查询PERSON_TYPE2表的数据
SELECT * FROM PERSON.PERSON_TYPE2;
PERSON_TYPEID	NAME
1				采购经理
2				采购代表
3				销售经理
4				销售代表
5				收银员

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	收银员

2.5 闪回事务查询

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

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.闪回版本查询
		3.闪回事务查询。

ORACLE支持的闪回功能:

		1.闪回查询
		2.闪回版本查询
		3.闪回事务查询
		4.闪回表
		5.闪回数据库

你可能感兴趣的:(达梦工具)