From
|转载自:DatabaseTime
|原文链接:http://mp.weixin.qq.com/s/RFvXTWxQlttF3wp2p0ajlw
一、闪回技术概述
Oracle 9i实现了基于回滚段的闪回查询(Flashback Query)技术,即从回滚段中读取一定时间内对表进行操作的数据,恢复错误的DML操作。在Oracle 10g中,除提高了闪回查询功能,实现了闪回版本查询、闪回事务查询外,还实现了闪回表、闪回删除和闪回数据库的功能。
闪回技术是数据库恢复技术历史上一次重大的进步,从根本上改变了数据恢复。
采用闪回技术,可以针对行级和事务级发生过变化的数据进行恢复,减少了数据恢复的时间,而且操作简单,通过SQL语句就可以实现数据的恢复,大大提高了数据库恢复的效率。
Oracle数据库提供了Oracle闪回技术:该技术由一组功能组成,支持查看数据的以前状态和来回读取数据,而无需从备份还原数据库。使用此技术可帮助用户分析错误并从错误中进行恢复。如果用户提交了错误的更改,可使用以下功能分析错误:
闪回查询:查看在过去某个时间点存在的已提交数据。带AS OF子句的SELECT命令通过时间戳或SCN引用过去的某一时间。
闪回版本查询:查看在特定时间间隔内提交的历史记录数据。使用SELECT命令的VERSIONS BETWEEN子句(出于性能方面的考虑,使用现有索引)。
闪回事务处理查询:查看在事务处理级进行的所有数据库更改。
从用户错误中进行恢复的可能的解决方案包括
闪回事务处理恢复:回退特定的事务处理及其从属事务处理。
闪回表:将一个或多个表回读到其以前某一时间的内容,而不影响其它数据库对象。
闪回删除:通过将已删除的表及其从属对象(如索引和触发器)从回收站返回到数据库,撤消删除该表的操作
注意:
闪回查询、闪回版本查询、闪回事务查询以及闪回表主要是基于撤销表空间中的回滚信息实现的;闪回删除、闪回数据库是基于Oracle 10g中的回收站(Recycle Bin)和闪回恢复区(Flash Recovery Area)特性实现的。
为了使用数据库的闪回技术,必须启用撤销表空间自动管理回滚信息。如果要使用闪回删除技术和闪回数据库技术,还需要启用回收站、闪回恢复区。
二、 闪回查询技术
1.闪回查询机制
闪回查询是指利用数据库回滚段存放的信息查看指定表中过去某个时间点的数据信息,或过去某个时间段数据的变化情况,或某个事务对该表的操作信息等。
为了使用闪回查询功能,需要启动数据库撤销表空间来管理回滚信息。
与撤销表空间相关的参数包括
UNDO_MANAGEMENT:指定回滚段的管理方式,如果设置为AUTO,则采用撤销表空间自动管理回滚信息;
UNDO_TABLESPACE:指定用于回滚信息自动管理的撤销表空间名;
UNDO_RETENTIOIN:指定回滚信息的最长保留时间。
2.闪回查询
闪回查询可以返回过去某个时间点已经提交事务操作的结果。其基本语法:
SELECT column_name[,…]
FROM table_name
[AS OF SCN|TIMESTAMPexpression]
[WHERE condition]
(1)闪回查询有基于AS OF TIMESTAMP的闪回查询
ALTERSESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';
SET TIME ON
SELECTempno,sal FROM scott.emp WHERE empno=7844;
UPDATE scott.empSET sal=2000 WHERE empno=7844; COMMIT;
UPDATEscott.emp SET sal=2500 WHERE empno=7844;
UPDATEscott.emp SET sal=3000 WHERE empno=7844;
COMMIT;
UPDATEscott.emp SET sal=3500 WHERE empno=7844;
COMMIT;
查询7844号员工的当前工资值。
SELECTempno,sal FROM scott.emp WHERE empno=7844;
查询7844号员工前一个小时的工资值。
SELECTempno,sal FROM scott.emp AS OF
TIMESTAMPSYSDATE-1/24 WHERE empno=7844;
查询第一个事务提交,第二个事务还没有提交时7844号员工的工资。
SELECTempno,sal FROM scott.emp AS OF TIMESTAMP
TO_TIMESTAMP('2015-4-2119:30:40','YYYY-MM-DD HH24:MI:SS')
WHEREempno=7844;
查询第二个事务提交,第三个事务还没有提交时7844号员工的工资。
SELECTempno,sal FROM scott.emp AS OF TIMESTAMP
TO_TIMESTAMP('2015-4-2119:30:52','YYYY-MM-DD HH24:MI:SS')
WHEREempno=7844;
3. 闪回版本查询
SELECTcurrent_scn FROM v$database;
SELECTempno,sal FROM scott.emp WHERE empno=7844;
UPDATEscott.emp SET sal=5000 WHERE empno=7844;
commit;
UPDATEscott.emp SET sal=5500 WHERE empno=7844;
利用闪回版本查询,可以查看一行记录在一段时间内的变化情况,即一行记录的多个提交的版本信息,从而可以实现数据的行级恢复。
基本语法:
SELECT column_name[,…]FROM table_name
[VERSIONS BETWEENSCN|TIMESTAMP
MINVALUE|expression ANDMAXVALUE|expression]
[AS OF SCN|TIMESTAMPexpression]
WHERE condition
参数说明:
VERSIONS BETWEEN:用于指定闪回版本查询时查询的时间段或SCN段;
AS OF:用于指定闪回查询时查询的时间点或SCN。
在闪回版本查询的目标列中,可以使用下列几个伪列返回版本信息。
VERSIONS_STARTTIME:基于时间的版本有效范围的下界;
VERSIONS_ENDTIME:基于时间的版本有效范围的上界;
VERSIONS_STARTSCN:基于SCN的版本有效范围的下界;
VERSIONS_ENDSCN:基于SCN的版本有效范围的上界;
VERSIONS_XID:操作的事务ID;
VERSIONS_OPERATION:执行操作的类型,I 表示INSERT,D 表示DELETE,U 表示UPDATE。
基于VERSIONS BETWEEN TIMESTAMP的闪回版本查询。
SELECTversions_xid XID,versions_starttime
STARTTIME,versions_endtimeENDTIME,
versions_operationOPERATION, sal FROM scott.emp
VERSIONSBETWEEN TIMESTAMP MINVALUE AND MAXVALUE
WHERE empno=7844
ORDER BYSTARTTIME;
基于VERSIONS BETWEEN SCN的闪回版本查询。
SELECTversions_xid XID,versions_startscnSTARTSCN,
versions_endscnENDSCN,versions_operation OPERATION, sal FROM scott.emp
VERSIONSBETWEEN SCN MINVALUE AND MAXVALUE
WHERE empno=7844 ORDER BY STARTSCN;
如果需要,可以将数据恢复到过去某个时刻的状态。
UPDATEscott.emp SET sal=(
SELECT salFROM scott.emp AS OF TIMESTAMP TO_TIMESTAMP('2015-4-21 22:11:33','YYYY- MM-DDHH24:MI:SS') WHERE empno=7844) WHERE empno=7844;
COMMIT;
SELECTempno,sal FROM scott.emp
WHEREempno=7844;
注意:
在进行闪回版本查询时,可以同时使用VERSIONS 短语和AS OF 短语。AS OF短语决定了进行查询的时间点或SCN,VERSIONS 短语决定了可见的行的版本信息。对于在VERSIONS BETWEEN下界之前开始的事务,或在AS OF指定的时间或SCN之后完成的事务,系统返回的版本信息为NULL。
4. 闪回事务查询
闪回事务查询提供了一种查看事务级数据库变化的方法。
可以从FLASHBACK_TRANSATION_QUERY中查看回滚段中存储的事务信息。
例如:
SELECToperation,table_name,undo_sql
FROMFLASHBACK_TRANSACTION_QUERY
WHERExid=HEXTORAW('01001B00A0050000');
通常,将闪回事务查询与闪回版本查询相结合,先利用闪回版本查询获取事务ID及事务操作结果,然后利用事务ID查询事务的详细操作信息。
SELECTversions_xid,sal FROM scott.emp
VERSIONSBETWEEN SCN MINVALUE AND MAXVALUE
WHEREempno=7844;
SELECToperation,undo_sql
FROMFLASHBACK_TRANSACTION_QUERY
WHERExid=HEXTORAW('01001B00A0050000');