达梦闪回对比ORACLE闪回

对比oracle闪回功能如下:

在这里插入图片描述

达梦数据库闪回

	当系统 INI 参数 ENABLE_FLASHBACK 置为 1 时,闪回功能开启,可以进行闪回查询。MPP 环境不支持闪回查询。
select * from SYS."V$DM_INI" where "V$DM_INI".PARA_NAME	like 'ENABLE_FLASHBACK';
SP_SET_PARA_VALUE(1,'ENABLE_FLASHBACK',1);
select * from SYS."V$DM_INI" where "V$DM_INI".PARA_NAME	like 'ENABLE_FLASHBACK';
SQL> alter system set ‘ENABLE_FLASHBACK’=1 both;
SQL> select name,type,value from v$parameter where name=‘ENABLE_FLASHBACK’;

默认UNDO保留时间为900秒(15分钟),可以对保留时间进行修改。
SQL> select name,type,value from v$parameter where name = ‘UNDO_RETENTION’;
SQL> alter system set ‘UNDO_RETENTION’=3600 both;

1.闪回查询子句

<闪回查询子句>::=WHEN |
1.time_exp 一个日期表达式,一般用字符串方式表示
2.trxid 指定事务 ID 号

3.闪回查询只支持普通表(包括加密表与压缩表)、临时表和堆表,不支持水平分区表、列存储表、外部表与视图;
4.闪回查询中 trxid 的值,一般需要由闪回版本查询的伪列来确定。实际使用中多采用指定时刻的方式。
例 1 闪回查询特定时刻的 PERSON_TYPE 表。

查询 PERSON_TYPE 表。
drop table PERSON.PERSON_TYPE2;
create table PERSON.PERSON_TYPE2 as select * from PERSON.PERSON_TYPE;
SELECT * FROM PERSON.PERSON_TYPE2;
select sysdate from dual;
2021-04-22 10:27:43
INSERT INTO PERSON.PERSON_TYPE2(NAME) VALUES(5,'防损员');
INSERT INTO PERSON.PERSON_TYPE2(NAME) VALUES(6,'保洁员');
COMMIT;
SELECT * FROM PERSON.PERSON_TYPE2;
1	采购经理
2	采购代表
3	销售经理
4	销售代表
5	防损员
6	保洁员
SELECT * FROM PERSON.PERSON_TYPE WHEN TIMESTAMP '2021-04-22 10:27:43';
1	采购经理
2	采购代表
3	销售经理
4	销售代表

**注意要在图形界面里提交事务,否则实验失败**
select sysdate from dual;
2021-04-22 10:32:33
SELECT * FROM PERSON.PERSON_TYPE2;
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-04-22 10:32:33';
1	采购经理
2	采购代表
3	销售经理
4	销售代表
5	防损员
6	保洁员

例 2 闪回查询指定 TRXID 的 PERSON_TYPE 表。

要获得 TRXID 信息,需要通过闪回版本查询的伪列 VERSIONS_ENDTRXID。(详细内
容见下节―闪回版本查询‖)。 在 2022-04-22 12:24:05 时刻修改数据,并提交。
UPDATE PERSON.PERSON_TYPE SET NAME='保安员' WHERE PERSON_TYPEID=5;
COMMIT;
UPDATE PERSON.PERSON_TYPE SET NAME='收银员' WHERE PERSON_TYPEID=5;
COMMIT;
SELECT * FROM PERSON.PERSON_TYPE;

进行闪回版本查询,确定 TRXID。
SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE VERSIONS BETWEEN 
TIMESTAMP '2022-04-22 12:24:05' AND SYSDATE;

根据 TRXID 确定版本。
SELECT * FROM PERSON.PERSON_TYPE WHEN TRXID 322;
结果集如下表所示。

2.闪回版本查询

1.time_exp 日期表达式,一般用字符串方式表示。time_exp1 表示起始时间,time_exp2 表示结束时间
2.闪回版本查询支持普通表(包括加密表与压缩表)、临时表和堆表,不支持水平分区表、列存储表、外部表与视图;
3.支持如表所示伪列,作为闪回版本查询的辅助信息。

伪列说明
VERSIONS_START{TRXIDTIME}
VERSIONS_END{TRXIDTIME}
VERSIONS_OPERATION在行上的操作 (I=Insert,D=Delete,U=Update)

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

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

select sysdate from dual;
2021-04-22 10:18:13 时刻修改数据,并提交。

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;

进行闪回版本查询,获得指定时间段内变化的记录。
SELECT VERSIONS_ENDTRXID, NAME FROM PERSON.PERSON_TYPE2 VERSIONS BETWEEN 
TIMESTAMP '2021-04-22 10:18:13' AND SYSDATE;

3.闪回事务查询

闪回事务查询提供系统视图 V$FLASHBACK_TRX_INFO供用户查看在事务级对数据库
所做的更改。根据视图信息,可以确定如何还原指定事务或指定时间段内的修改。
系统视图名为 V$FLASHBACK_TRX_INFO
在这里插入图片描述
例 1 查询指定时间之后的事务信息,可为闪回查询操作提供参考。

SELECT * FROM V$FLASHBACK_TRX_INFO WHERE COMMIT_TIMESTAMP > '2021-04-22 
12:00:00';

ORACLE数据库闪回

闪回技术是Oracle数据库独有的特性,支持各级恢复,包括行、事务、表、表空间和数据库范围。

ORACL闪回技术分类

UNDO):
(1)闪回查询(Flashback Query):查询过去某个时间点或某个SCN值对应的表中的数据信息恢复错误的DML操作。
(2)闪回版本查询(Flashback Version Query):查询过去某个时间段数据变化情况。
(3)闪回事务查询(Flashback Transaction Query):查看某个事务或所有事务在过去一段时间对数据进行的修改。

(4)闪回表(Flashback TABLE):将表恢复到过去的某个时间点或某个SCN值。
基于回收站
(5)闪回删除(Flashback DROP):将已经删除的表及表上的索引恢复到删除前的状态,但索引名不会恢复到删除前的状态。
基于闪回恢复区(Flash Recovery Area)
(6)闪回数据库(Flashback Database):将数据库恢复到过去某个时间点或某个SCN值。
基于闪回归档
(7)闪回数据归档:

1.闪回查询

2.闪回版本查询

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
FROM SCOTT.DEPT VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE 
ORDER BY VERSIONS_STARTTIME;

CREATE TABLE EMP1 AS SELECT * FROM SCOTT.EMP WHERE 1=2;--创建测试表EMP1

SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;--查询时间作为TIMESTAMP开始时间
1  2021-05-23 10:48:21  1234520

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;
   
VERSIONS_STARTTIME:基于时间的版本有效范围的下界;
VERSIONS_STARTSCN:基于SCN的版本有效范围的下界;
VERSIONS_ENDTIME:基于时间的版本有效范围的上界;
VERSIONS_ENDSCN:基于SCN的版本有效范围的上界;
VERSIONS_XID:操作的事务ID,唯一的标识行;
VERSIONS_OPERATION:执行操作的类型,I 表示INSERT,D 表示DELETE,U 表示UPDATE

3.闪回事务查询

闪回事务查询(Flashback Transaction Query)是查看某个事务或所有事务在过去一段时间对数据进行的修改。可以得到重做的SQL语句,并用于撤消由事务引起的各行变化。
需要权限

 SELECT  ANY  TRANSACTION
 EXECUTE ON DBMS_FLASHBACK

开启补充日志:

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; 
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA(PRIMARY KEY,UNIQUE INDEX)  COLUMNS;

闪回事务查询实际上是查询的数据字典FLASHBACK_TRANSACTION_QUERY。可以根据该视图的UNDO_SQL列值返回数据以前版本。

SELECT TO_DATE(SYSDATE,'YYYY-MM-DD HH24:MI:SS'),TIMESTAMP_TO_SCN(SYSDATE) FROM DUAL;
1	0023-05-21	1234905

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';

4.闪回表修改

CREATE TABLE test15 (A NUMBER,B NUMBER);

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

SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
1236197

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

SELECT * FROM test15;
1	1	1
2	2	2


SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
1236205

ALTER TABLE test15 ENABLE ROW MOVEMENT;


FLASHBACK TABLE test15 TO SCN 1236197;--闪回到一行记录

SELECT * FROM test15;
1	1	1

FLASHBACK TABLE test15 TO SCN 1236205;--闪回到二行记录

SELECT * FROM test15;

示例2CREATE TABLE test16 (A NUMBER,B NUMBER);

INSERT INTO test16 VALUES(1,1);
COMMIT;

CREATE INDEX IDX_T16_A ON test16(A);

SELECT * FROM TEST16;
1	1	1

SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
1236392

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

SELECT * FROM TEST16;
1	1	1
2	2	2


SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM DUAL;
1236409

ALTER TABLE TEST16 ENABLE ROW MOVEMENT;

FLASHBACK TABLE T_FT_20170617_LHR TO SCN 1236392;

DROP INDEX IDX_T16_A;
FLASHBACK TABLE test16 TO SCN 1236409;--不会闪回索引
 

5.闪回删除drop(回收站)

可以恢复表名但是 索引名不会恢复到删除前的状态。它以表空间中现有已经分配的空间为基础,而不是从表空间上物理划出一个固定区域用作回收站
drop操作并没有实际删除,除非PURGE或者因为存储空间不够而被数据库清除掉。
DROP TABLE T_LHR PURGE;
回收站功能可以在系统和会话级别开启

系统级别:ALTER SYSTEM SET RECYCLEBIN = ON SCOPE=SPFILE;
会话级别:ALTER SESSION SET RECYCLEBIN = ON;

关于闪回删除需要注意以下几点:
① 只能用于非系统表空间和本地管理的表空间。在SYSTEM表空间中的表被DROP后不会进入回收站。
② 对象的参考约束不会被恢复,指向该对象的外键约束需要重建。
③ 对象能否恢复成功,取决于对象空间是否被覆盖重用。
④ 当删除表时,依赖于该表的物化视图也会同时被删除,但是由于物化视图并不会被放入回收站,因此,当执行FLASHBACK TABLE TO BEFORE DROP时,也不能恢复依赖于该表的物化视图,这个时候就需要DBA手工介入重新创建物化视图。
⑤ 对于回收站中的对象,只支持查询。
⑥ 表被恢复以后,表上的索引,需要重建,虽然索引可以随着表的闪回而闪回,但是闪回后的索引仍然使用回收站中的名称,因此,需要重建索引。
⑦ 在使用“FLASHBACK TABLE … TO BEFORE DROP”命令从回收站恢复表及其所有可能的相关对象时,可以指定表的原始名称或删除对象时分配给对象的系统生成名称。如果指定原始名称,且回收站包含多个具有该名称的对象,那么Oracle会最先恢复最晚移动到回收站的对象(LIFO:后进先出)。如果删除原始表后又在同一用户中创建了同名的新表,那么这个时候再执行FLASHBACK TABLE时会返回错误,此时需要指定RENAME TO子句。

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;--闪回删除表

select * from test17;

6.闪回数据库

① 系统管理员误删除了用户。
② 用户截断了表(TRUNCATE)。
③ 用户错误地执行了某个批处理任务,或者该批处理任务的脚本编写有问题,使得多个表的逻辑出现问题,无法采用闪回表的方式进行恢复。

FLASHBACK DATABASE  to '12:05 PM';

① 数据库在Archivelog模式
② 数据库在MOUNT或OPEN状态
③ 使用闪回恢复区,参数db_recovery_file_dest_size和db_recovery_file_dest都必须配置,因为flashback log必须要求放在flash recovery area里,如下所示:

1alter system set db_recovery_file_dest_size=4g;
2alter system set db_recovery_file_dest='/u01/app/oracle/fast_recovery_area';
3alter database add supplemental log data;
4alter database add supplemental log data(primary key,unique index) columns;
5alter database FLASHBACK on;--如果要关闭使用alter database flashback off;

在Flashback DB功能启用之后,Oracle启动了一个后台进程RVWR(Recovery Writer)负责把位于SGA中的Flashback Buffer中的Flashback Log写出到闪回恢复区中:

SQL> select * from v$sgastat where lower(name) like '%flash%';
SQL> select addr,program from v$process where background=1 and program like '%RVWR%';
SQL> select paddr,description from v$bgprocess where paddr<>'00' AND paddr='8FACC870';

在启用闪回数据库功能的过程中,生成的告警日志如下所示:
Tue Feb 06 11:17:07 2018
alter database FLASHBACK on
Starting background process RVWR
Tue Feb 06 11:17:07 2018
RVWR started with pid=31, OS id=12594 
Allocated 3981120 bytes in shared pool for flashback generation buffer
Flashback Database Enabled at SCN 2010282
Completed: alter database FLASHBACK on


与闪回数据库有关的几个重要视图如下所示:
SELECT * FROM V$FLASHBACK_DATABASE_LOG;--记录闪回日志信息,包括最早可以回复的SCN,闪回日志的大小
SELECT * FROM V$FLASHBACK_DATABASE_STAT;--用于监视闪回数据库日志中记录闪回数据的开销,包含24小时的信息,每行代表一个小时的时间间隔,可以确定数据生成的变化,FLASHBACK_DATA和REDO_DATA分别表示时间间隔内写入的闪回字节数和Redo日志字节数
SELECT * FROM V$FLASHBACK_DATABASE_LOGFILE ;--闪回数据库日志文件信息

7.闪回数据归档(Flashback Data Archive)

闪回数据归档通过将变化数据另外存储到创建的闪回归档区中,用来和Undo区别开来,这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不受Undo策略的影响。
闪回数据归档可以根据需要指定哪些数据库对象需要保存历史变化数据,而不是将数据库中所有对象的变化数据都保存下来,这样可以极大地减少空间需求。需要注意的是,闪回数据归档并不是记录数据库的所有变化,而只是记录了指定表的数据变化。所以,闪回数据归档是针对对象的保护,是闪回数据库的有力补充。闪回数据归档区是一个逻辑概念,是从一个或者多个表空间中拿出一定的空间,来保存表的修改历史,这样就摆脱了对Undo数据的依赖,不利用Undo就可以闪回到归档策略内的任何一个时间点上。
操作闪回恢复区需要有“FLASHBACK ARCHIVE ADMINISTER”的权限。开启闪回数据归档常用操作如下所示:

1CREATE FLASHBACK ARCHIVE DEFAULT FLA_LHR TABLESPACE TBS1 QUOTA 10M RETENTION 5 YEAR; --创建闪回数据归档
2ALTER FLASHBACK ARCHIVE FLA_LHR SET DEFAULT; --指定默认闪回数据归档
3ALTER TABLE T_LHR FLASHBACK ARCHIVE; --启用闪回数据归档
4SELECT PRODUCT_NUMBER ,PRODUCT_NAME ,COUNT FROM INVENTORY AS OF TIMESTAMP TO_TIMESTAMP (‘2017-01-01 00:00:00’ ,‘YYYY-MM-DD HH24:MI:SS’); --查看闪回数据归档数据

关于闪回数据归档的一些比较有用的视图如下所示:

l DBA_FLASHBACK_ARCHIVE:闪回归档区信息。

l DBA_FLASHBACK_ARCHIVE_TS:闪回归档有关表空间的信息。

l DBA_FLASHBACK_ARCHIVE_TABLES:对应表所对应的闪回归档信息。

闪回数据归档的后台进程是fbda,如下所示:

1[oracle@rhel6lhr ~]$ ps -ef|grep fbda
2oracle 34861 1 0 09:28 ? 00:00:01 ora_fbda_orclasm
3SYS@lhrdb> SELECT NAME,DESCRIPTION FROM V$BGPROCESS WHERE NAME=‘FBDA’;
4NAME DESCRIPTION
5----- ----------------------------------------------------------------
6FBDA Flashback Data Archiver Process

如果对表指定了闪回数据归档区,那么不能对表进行如下操作:

v 删除,重命名,或者修改列。

v 进行分区或者子分区操作。

v 转换LONG到LOB类型。

v ALTER TABLE操作。

v DROP、RENAME、TRUNACTE表。

清除闪回归档区中的数据常用操作如下所示:

1ALTER FLASHBACK ARCHIVE FLA_LHR PURGE ALL;–清除所有归档区的数据
2ALTER FLASHBACK ARCHIVE FLA_LHR PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL ‘1’ DAY);–清除一天以前的数据
3ALTER FLASHBACK ARCHIVE FLA_LHR PURGE BEFORE SCN 728969;–清除特定SCN之前的数据
4ALTER TABLE T_LHR NO FLASHBACK ARCHIVE;–将指定的表不再设置数据归档
5DROP FLASHBACK ARCHIVE data_test2;–删除数据归档区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值