合 Oracle闪回(flashback)功能详解
Tags: Oracle闪回闪回数据库闪回查询闪回事务查询闪回删除闪回数据归档闪回版本查询闪回表
什么是闪回?闪回有哪些分类?
Oracle闪回技术从根本上改变了数据恢复策略,利用闪回技术,可以使更正错误的时间大大缩短,而且它简单易用,使用一条短命令便可恢复整个数据库,而不必执行复杂的程序。闪回技术是Oracle数据库独有的特性,支持各级恢复,包括行、事务、表、表空间和数据库范围。采用闪回技术,可以针对行级和事务级发生过变化的数据进行恢复,减少了数据恢复的时间,而且操作简单,通过SQL语句就可以实现数据的恢复,大大提高了数据库恢复的效率。
Oracle中闪回技术分类图如下所示:
闪回技术分类:
(1)闪回查询(Flashback Query):查询过去某个时间点或某个SCN值对应的表中的数据信息,即从回滚段中读取一定时间内对表进行操作的数据,恢复错误的DML操作。
(2)闪回版本查询(Flashback Version Query):查询过去某个时间段或某个SCN段内表中数据的变化情况。
(3)闪回事务查询(Flashback Transaction Query):查看某个事务或所有事务在过去一段时间对数据进行的修改。
(4)闪回表(Flashback TABLE):将表恢复到过去的某个时间点或某个SCN值时的状态。
(5)闪回删除(Flashback DROP):将已经删除的表及表上的索引恢复到删除前的状态,但索引名不会恢复到删除前的状态。
(6)闪回数据库(Flashback Database):将数据库恢复到过去某个时间点或某个SCN值时的状态。
有关闪回需要注意以下几点:
(1)闪回查询、闪回版本查询、闪回事务查询以及闪回表主要是基于回滚(Undo)表空间中的回滚信息实现的。
(2)闪回删除是基于Oracle中的回收站(Recycle Bin)特性实现的。
(3)闪回数据库是基于闪回恢复区(Flash Recovery Area)中的闪回日志来实现的。
(4)闪回数据归档是基于闪回归档区中的数据来实现的。
闪回查询(Flashback Query)
闪回查询分为基于AS OF TIMESTAMP和基于AS OF SCN的闪回查询,如下所示:
1 2 3 4 | SELECT * FROM SCOTT.EMP AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '6' MINUTE) WHERE ENAME = 'LHR'; SELECT ENAME, SAL FROM SCOTT.EMP AS OF TIMESTAMP(SYSDATE - 6 / 1440) WHERE ENAME = 'LHR'; SELECT * FROM SCOTT.EMP AS OF TIMESTAMP TO_TIMESTAMP('2017-11-14 11:41:22','YYYY-MM-DD HH24:MI:SS') WHERE WHERE ENAME = 'LHR'; INSERT INTO SCOTT.EMP select * from t AS OF SCN 67830969; |
闪回查询示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | SQL> set timing on; SQL> set serveroutput on; SQL> set sqlblanklines on; SQL> set linesize 800 SQL> set time on; 11:40:54 SQL> select * from old_t; ID NAME ---------- -------------------- 1 li 已用时间: 00: 00: 00.02 11:41:05 SQL> update old_t set name='lih' where id=1; 已更新 1 行。 已用时间: 00: 00: 00.01 11:41:16 SQL> commit; 提交完成。 已用时间: 00: 00: 00.03 11:41:20 SQL> update old_t set name='lihu' where id=1; 已更新 1 行。 已用时间: 00: 00: 00.01 11:41:31 SQL> commit; 提交完成。 已用时间: 00: 00: 00.01 11:41:34 SQL> update old_t set name='lihua' where id=1; 已更新 1 行。 已用时间: 00: 00: 00.01 11:41:39 SQL> commit; 提交完成。 已用时间: 00: 00: 00.01 11:41:43 SQL> update old_t set name='lihuar' where id=1; 已更新 1 行。 已用时间: 00: 00: 00.02 11:42:24 SQL> commit; 提交完成。 已用时间: 00: 00: 00.01 11:42:26 SQL> select * from old_t; ID NAME ---------- -------------------- 1 lihuar 已用时间: 00: 00: 00.02 ------查询5分钟之前的数据 11:45:53 SQL> select * from old_t as of timestamp sysdate-5/24/60 where id=1; ID NAME ---------- -------------------- 1 li 已用时间: 00: 00: 00.02 ------查询第一个事务提交,第二个事务还没有提交时的数据 11:55:13 SQL> select * from old_t as of timestamp to_timestamp('2012-11-14 11:41:22','YYYY-MM-DD HH2 4:MI:SS') where id=1; ID NAME ---------- -------------------- 1 lih 已用时间: 00: 00: 00.02 ------查询第二个事务提交,第三个事务还没有提交时的数据 12:23:33 SQL> select * from old_t as of timestamp to_timestamp('2012-11-14 11:41:38','YYYY-MM-DD HH2 4:MI:SS') where id=1; ID NAME ---------- -------------------- 1 lihu 已用时间: 00: 00: 00.01 12:24:01 SQL> |
闪回版本查询(Flashback Version Query)
查询语句一般为:
1 2 3 | 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 T_FVQ_20170617_LHR VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE ORDER BY VERSIONS_STARTTIME; |
其中,VERSIONS BETWEEN用于指定闪回版本查询时查询的时间段或SCN段;AS OF用于指定闪回查询时查询的时间点或SCN。在闪回版本查询的目标列中,可以使用下列几个伪列返回版本信息:
VERSIONS_STARTTIME:基于时间的版本有效范围的下界;
VERSIONS_STARTSCN:基于SCN的版本有效范围的下界;
本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!