第14章 闪回技术主要内容闪回技术概述闪回查询闪回版本查询闪回事务查询闪回表闪回删除闪回数据库 闪回数据归档14.1 闪回技术概述闪回技术 介绍闪回技术分类14.1.1 闪回技术介绍Oracle 9i实现了基于回滚段的闪回查询(Flashback Query)技术,即 从回滚段中读取一定时间内对表进行操作的数据,恢复错误的DML操作。在Oracle 11g中,除提高了闪回查询功能,实现了闪回版本查 询、闪回事务查询外,还实现了闪回表、闪回删除和闪回数据库的功能。利用Oracle数据库的闪回特性,能够完成下列工作:查询数据库过去 某一时刻的状态;查询反映过去一段时间内数据变化情况的元数据;将表中数据或将删除了的表恢复到过去的某一个时刻的状态;自动跟踪、存档数 据变化信息;回滚事务及其依赖事务的操作 14.1.2 闪回技术分类闪回查询(Flashback Query):查询过去某个时间点 或某个SCN值时表中的数据信息;闪回版本查询(Flashback Version Query):查询过去某个时间段或某个SCN段内 表中数据的变化情况;闪回事务查询(Flashback Transaction Query):查看某个事务或所有事务在过去一段时间对 数据进行的修改;闪回表(Flashback Table):将表恢复到过去的某个时间点或某个SCN值时的状态;闪回删除(Flashb ack Drop):将已经删除的表及其关联对象恢复到删除前的状态;闪回数据库(Flashback Database):将数据库恢复 到过去某个时间点或某个SCN值时的状态。闪回数据归档:利用保存在一个或多个表空间中的数据变化信息查询过去某个时刻或某个SCN值时表 中数据的快照。14.2 闪回查询闪回查询概述撤销表空间相关参数配置闪回查询操作14.2.1 闪回查询概述闪回查询主要是利用数据 库撤销表空间中存放的回退信息,根据指定的过去的一个时刻或SCN值,返回当时已经提交的数据快照。利用闪回查询可以实现下列功能:返回当 前已经丢失或被误操作的数据在操作之前的快照;可以进行当前数据与之前特定时刻的数据快照的比较;可以检查过去某一时刻事务操作的结果;简 化应用设计,不需要存储一些不断变化的临时数据。14.2.2 撤销表空间相关参数配置为了使用闪回查询功能,需要启动数据库撤销表空间 来管理回滚信息。 与撤销表空间相关的参数包括 :?UNDO_MANAGEMENT:指定回滚段的管理方式,如果设置为AUTO,则采用 撤销表空间自动管理回滚信息;?UNDO_TABLESPACE:指定用于回滚信息自动管理的撤销表空间名;?UNDO_RETENTIO IN:指定回滚信息的最长保留时间。 14.2.3闪回查询操作闪回查询可以返回过去某个时间点已经提交事务操作的结果。基本语法:SEL ECT column_name[,…] FROM table_name[AS OF SCN|TIMESTAMP expressio n][WHERE condition] (1)基于AS OF TIMESTAMP的闪回查询SQL>ALTER SESSION SE T NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS'';SQL>SET TIME ON15:33:12 SQL>ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS'';15 :33:25 SQL>SELECT employee_id,salary FROM ehr.employees WHERE emp loyee_id= 140;15:33:34 SQL>UPDATE ehr.employees SET salary=12000 WHERE employee_id=140;15:33:48 SQL>COMMIT;15:33:56 SQL>UPDATE ehr .employees SET salary=13000 WHERE employee_id=140;15:34:05 SQL>UP DATE ehr.employees SET salary=14000 WHERE employee_id=140;15:34:1 2 SQL>COMMIT;15:34:19 SQL>UPDATE ehr.employees SET salary=15000 W HERE employee_id=140;15:34:26 SQL>COMMIT;查询140号员工的当前工资值。15:34:32 SQL>SELECT employee_id,salary FROM ehr.employees WHERE employee_ id= 140;EMPLOYEE_ID SALARY------------ ----------- 140 14000查询140号员工前一个小时的工资值。15:36:34 SQL>SELEC T employee_id,salary FROM ehr.employees AS OF TIMESTAMPSYSDATE-1/ 24 WHERE employee_id=140;EMPLOYEE_ID SALARY------------ ----------140 2500 查询第一个事务已经提交,第二 个事务还没有提交时140号员工的工资。15:40:26 SQL>SELECT employee_id,salary FROM eh r.employees AS OF TIMESTAMP TO_TIMESTAMP(''2013-3-8 15:34:00'',''YYY Y-MM-DD HH24:MI:SS'') WHERE employee_id= 140;EMPLOYEE_ID SALARY ------------ -----------140 12000查询第二个事务已经提交,第三个事务还 没有提交时140号员工的工资。15:43:56 SQL>SELECT employee_id,salary FROM ehr.em ployees AS OF TIMESTAMP TO_TIMESTAMP(''2013-3-8 15:34:30'',''YYYY-MM -DD HH24:MI:SS'') WHERE employee_id=140;EMPLOYEE_ID SALARY----- ------- ----------140 14000(2)基于 AS OF SCN的闪回查询15:47:07 SQL>SELECT current_scn FROM v$database;CUR RENT_SCN-------------946572315:52:15 SQL>SELECT employee_id,salar y FROM ehr.employees WHERE employee_id= 140;EMPLOYEE_ID SALARY- ----------- ----------140 1200015 :52:29 SQL>UPDATE ehr.employees SET salary=14000 WHERE employee_i d=140;15:52:37 SQL>COMMIT;15:52:44 SQL>UPDATE ehr.employees SET s alary=15000 WHERE employee_id=140;15:52:50 SQL>COMMIT;15:52:57 SQ L>SELECT current_scn FROM v$database;CURRENT_SCN-------------9465 82015:53:07SQL>SELECT employee_id,salary FROM ehr.employees AS OF SCN 9465723WHERE employee_id=140;EMPLOYEE_ID SALARY-------- ---- -----------140 1200014.3 闪回版本查询闪回版本查询的概念闪回版本查 询操作闪回版本查询可以查询一条记录在一段时间内的变化情况,即一条记录的多个提交版本信息。闪回版本查询的基本语法为:SELECT c olumn_name[,…] FROM table_nameVERSIONS BETWEEN SCN|TIMESTAMP MINV ALUE|expression AND MAXVALUE|expression[AS OF SCN|TIMESTAMP expre ssion] WHERE condition在闪回版本查询的目标列中,可以使用下列伪列返回行的版本信息。VERSIONS_STAR TTIME:基于时间的版本有效范围的下界。VERSIONS_STARTSCN:基于SCN的版本有效范围的下界。VERSIONS_E NDTIME:基于时间的版本有效范围的上界。VERSIONS_ENDSCN:基于SCN的版本有效范围的上界。VERSIONS_XI D:操作的事务ID。VERSIONS_OPERATION:执行操作的类型,I 表示INSERT,D 表示DELETE,U 表示UP DATE。下面是一个闪回版本查询示例。SQL>UPDATE ehr.employees SET salary=6000 WHERE employee_id=140;SQL>UPDATE ehr.employees SET salary=6500 WHERE e mployee_id=140;SQL>UPDATE ehr.employees SET salary=7000 WHERE emp loyee_id=140;SQL>COMMIT;SQL>UPDATE ehr.employees SET salary=7500 WHERE employee_id=140;SQL>COMMIT;可以基于VERSIONS BETWEEN TIMESTAMP进行 闪回版本查询:SQL>SELECT versions_xid XID,versions_starttime STARTTIME, versions_endtime ENDTIME, versions_operation OPERATION,salary FROM ehr.employees VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE WHERE employee_id=140 ORDER BY STARTTIME;可以基于VERSIO NS BETWEEN SCN进行闪回版本查询:SQL>SELECT versions_xid XID,versions_star tscn STARTSCN,versions_endscn ENDSCN, versions_operation OPERAT ION, salary FROM ehr.employees VERSIONS BETWEEN SCN MINV ALUE AND MAXVALUE WHERE employee_id=140 ORDER BY STARTSCN;查询当前1 40号员工的工资。SQL>SELECT employee_id,salary FROM ehr.employees WHERE e mployee_id=140;EMPLOYEE_ID SALARY------------ -------------140 750014.4 闪回事务查询闪回事务查询的概念闪回事务查询操作闪回事务查询可以返回在一个特定事务中 行的历史数据及与事务相关的元数据,或返回在一个时间段内所有事务的操作结果及事务的元数据在Oracle 11g数据库中,为了记录事务 操作的详细信息,需要启动数据库的日志追加功能SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DAT A;可以从FLASHBACK_TRANSATION_QUERY中查看撤销表空间中存储的事务信息SQL>SELECT xid,sta rt_scn,commit_scn,operation,table_name FROM FLASHBACK_ TRANSACTIO N_QUERY WHERE table_name=’EMPLOYEES’ AND table_owner=’EHR’;SQL>SE LECT operation,undo_sql,table_name FROM FLASHBACK_TRANSACTION_QUE RY WHERE xid=HEXTORAW(''01000900F40E0000'');SQL>SELECT operation,un do_sql,table_name FROM FLASHBACK_TRANSACTION_QUERYWHERE start_tim estamp>=TO_TIMESTAMP(''2013-3-8 15:30:00'', ''YYYY-MM-DD HH24: MI:SS '') AND commit_timestamp<= TO_TIMESTAMP(''2013-3-8 16:00:00'', ''YYYY - MM-DD HH24:MI: SS'');将闪回事务查询与闪回版本查询相结合,先利用闪回版本查询获取事务ID及事务操作结果,然后 利用事务ID查询事务的详细操作信息。例如:SQL>SELECT versions_xid,salary FROM ehr.empl oyees VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE WHERE employee_id=140;14.5 闪回表闪回表是将表及附属对象一起恢复到以前的某个时刻的状态。要对表进行闪回操作,需要 启动表的ROW MOVEMENT特性,其方法为:ALTER TABLE table ENABLE ROW MOVEMENT;闪回表 操作的基本语法为:FLASHBACK TABLE [schema.]table TO SCN|TIMESTAMP expressi on [ENABLE|DISABLE TRIGGERS]14.6 闪回删除闪回删除概述回收站管理闪回删除操作 14.6.1闪回删 除概述闪回删除可恢复使用DROP TABLE语句删除的表,是一种对意外删除的表的恢复机制。在Oracle 11g数据库中,当执行D ROP TABLE操作时,并不立即回收表及其关联对象的空间,而是将它们重命名后放入一个称为“回收站”的逻辑容器中保存,直到用户决定 永久删除它们或存储该表的表空间存储空间不足时,表才真正被删除。 为了使用闪回删除技术,必须开启数据库的“回收站”。 14.6.2 回收站的管理启动“回收站” 要使用闪回删除功能,需要启动数据库的“回收站”,即将参数RECYCLEBIN设置为ON。在默认情况下 “回收站”已启动。 SQL>SHOW PARAMETER RECYCLEBIN SQL>ALTER SYSTEM SET RECY CLEBIN=ON;查看“回收站” 当执行DROP TABLE操作时,表及其关联对象被命名后保存在“回收站”中,可以通过查询USE R_RECYCLEBIN,DBA_RECYCLEBIN视图获得被删除的表及其关联对象信息。SQL>DROP TABLE test; SQL>SELECT BJECT_NAME,ORIGINAL_NAME,TYPE FROM USER_RE CYCLEBIN; 清除“回收站” :PURGE [TABLE table]|[INDEX index]|[RECYCLEBIN |DBA_RECYCLEBIN]|[TABLESPACE tablespace [USER user]]例如:SQL>PURGE TABLE flash_table;SQL>PURGE INDEX "BIN$kkOA+BVXRHW02fg7Y1KUPA==$0 ";SQL>PURGE TABLESPACE users;SQL>PURGE TABLESPACE users USER ehr; SQL>PURGE RECYCLEBIN;SQL>PURGE DBA_RECYCLEBIN;14.6.3闪回删除操作闪回删除的基本 语法为FLASHBACK TABLE [schema.]table TO BEFORE DROP [RENAME TO new_n ame]注意只有采用本地管理的、非系统表空间中的表可以使用闪回删除操作。 示例SQL>CREATE TABLE example( ID NUMBER PRIMARY KEY, NAME CHAR(20));SQL>INS ERT INTO example VALUES(1,''BEFORE DROP'');SQL>COMMIT;SQ L>DROP TABLE example;SQL>FLASHBACK TABLE example TO BEFORE DROP RENAME TO new_example;SQL>SELECT FROM new_example;ID NAME -------------- 1 BEFORE DROP14.7 闪回数据库闪回数据库概述 闪回数据库的配置闪回数据库操作 14.7.1闪回数据库的概念闪回数据库技术是将数据库快速恢复到过去的某个时间点或SCN值时的状态, 以解决由于用户错误操作或逻辑数据损坏引起的问题。 闪回数据库操作不需要使用备份重建数据文件,而只需要应用闪回日志文件和归档日志文件 。为了使用数据库闪回技术,需要预先设置数据库的闪回恢复区和闪回日志保留时间。闪回恢复区用于保存数据库运行过程中产生的闪回日志文件, 而闪回日志保留时间是指闪回恢复区中的闪回日志文件保留的时间,即数据库可以恢复到过去的最大时间。14.7.2 闪回数据库的配置数据 库必须运行在归档模式。配置了数据库的快速恢复区。在数据库加载状态下启用数据库的FLASHBACK特性。通过设置数据库参数DB_FL ASHBACK_RETENTION_TARGET,确定可以在多长时间内闪回数据库。设置数据库的归档模式 SQL> CONN SYS /TIGER AS SYSDBASQL> ARCHIVE LOG LIST; SQL> SHUTDOWN IMMEDIATESQL > STARTUP MOUNTSQL> ALTER DATABASE ARCHIVELOG;SQL> ALTER DATABASE OPEN;SQL> ALTER SYSTEM ARCHIVE LOG START;SQL> ARCHIVE LOG LIST; 设置数据库的闪回恢复区 在Oracle 11g数据库安装过程中,默认情况下已设置了数据库的闪回恢复区。可以通过参数查询数据闪回恢复 区及其空间大小。SQL> SHOW PARAMETER DB_RECOVERY_FILE启动数据库FLASHBACK特性为了使用闪 回数据库,还需要启动数据库的FLASHBACK特性,生成闪回日志文件。在默认情况下,数据库的FLASHBACK特性是关闭的。SQL >SHUTDOWN IMMEDIATESQL>STARTUP MOUNTSQL>ALTER DATABASE FLASHBACK ON;SQL>ALTER DATABASE OPEN;。 合理设置参数DB_FLASHBACK_RETENTION_TARGET 应该合理设置数据库参数DB_FLASHBACK_RETENTION_TARGET,以确定闪回日志保留时间,即可以闪回多长时间内的数 据库状态。该参数以分钟为单位,默认值为1440分钟,即24小时。可以使用ALTER SYSTEM命令合理设置该参数值,例如:SQL >ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=2880;14.7.3闪回数据库操 作闪回数据库基本语法为FLASHBACK [STANDBY] DATABASE [database] TO[SCN|TIMESTA MP expression]|[BEFORE SCN|TIMESTAMPexpression]参数说明STANDBY:指定执行闪回 的数据库为备用数据库;TO SCN:将数据库恢复到指定SCN的状态;TO TIMESTAMP:将数据库恢复到指定的时间点;TO B EFORE SCN:将数据库恢复到指定SCN的前一个SCN状态TO BEFORE TIMESTAMP:将数据库恢复到指定时间点前一 秒的状态。查询数据库系统当前时间和当前SCN。SQL>SELECT SYSDATE FROM DUAL;SYSDATE------ --------10-3月 -13SQL>SELECT CURRENT_SCN FROM V$DATABASE;CURRENT_S CN-----------9526633 查询数据库中当前最早的闪回SCN和时间。SQL>SELECT OLDEST_FLASHB ACK_SCN,OLDEST_FLASHBACK_TIME FROM V$FLASHBACK_DATABASE_LOG;OLDES T_FLASHBACK_SCN OLDEST_FLASHBA---------------------- --------- --------9526309 10-3月 -13改变数据库的当前状态。 SQL>SET TIM E ON15:02:15 SQL>CREATE TABLE test_flashback( ID NUMBER,NAME CHAR(20));15:02:26 SQL>INSERT INTO test_flashback VALUES(1,''DATAB ASE'');15:02:32 SQL>COMMIT;进行闪回数据库恢复,将数据库恢复到创建表之前的状态。 15:02:41 SQL>SH UTDOWN IMMEDIATE15:05:07 SQL>STARTUP MOUNT EXCLUSIVE15:05:24 SQL> FLASHBACK DATABASE TO TIMESTAMP(TO_TIMESTAMP(''2013-3-10 15:02:00'' ,''YYYY-MM-DD HH24:MI:SS''));15:07:02 SQL>ALTER DATABASE OPEN RESET LOGS;验证数据库的状态(test_flashback表应该不存在)。15:08:21 SQL>SELECT FROM te st_flashback;SELECT FROM test_flashback 第 1 行出现错 误:ORA-00942: 表或视图不存在14.8 闪回数据归档闪回数据归档概念创建闪回数据归档区启用表的闪回数据归档闪回数据归档 操作案例14.8.1 闪回数据归档概念闪回数据归档是将指定表的数据变化信息存储到专门创建的闪回数据归档区中,可以利用该信息实现对 表的闪回查询,与回退信息无关。在闪回数据归档区中保存的不是整个数据库的变化信息,而只是指定表的数据变化信息。闪回数据归档区有一个或 多个表空间组成。数据库中可以包含一个或多个闪回数据归档区。可以以SYSDBA身份登录数据库,为数据库设置一个默认的闪回数据归档区。 每个闪回数据归档区都使用RETENTION参数设置信息最短保留时间。默认情况下,数据库中所有表的闪回数据归档特性都没有启用。如果要 为一个表启用闪回数据归档特性,必须满足下列的要求:用户在表使用的闪回数据归档区上具有FLASHBACK ARCHIVE的对象权限; 表不能是嵌套表、聚簇表、临时表、远程表或外部表;表不能包含LONG类型列和嵌套表类型列。14.8.2 创建闪回数据归档区语法为: CREATE FLASHBACK ARCHIVE [DEFAULT] flashback_archive TABLESPACE t ablespace [QUOTA integer M|G|T|P|E] RETENTION integer YEAR|MONTH| DAY;参数说明:DEFAULT:如果以SYSDBA身份登录数据库,可以为数据库指定默认闪回数据归档区。TABLESPACE:指定 闪回数据归档区的第一个表空间名称。QUOTA:指定闪回数据归档区在第一个表空间上的配额。默认为UNLIMITED。RETENTIO N:指定闪回数据归档区存放的信息的最短保留时间。SQL>CREATE FLASHBACK ARCHIVE DEFAULT fbar _1 TABLESPACE USERS QUOTA 2G RETENTION 1 YEAR;SQL>CREATE FLASHBAC K ARCHIVE fbar_2 TABLESPACE TBS1 RETENTION 10 DAY;14.8.3 启用表的闪回数 据归档默认情况下,任何表的闪回数据归档特性都没有启用。可以在创建表的CREATE TABLE语句或修改表的ALTER TABLE语 句中使用FLASHBACK ARCHIVE子句启用表的闪回数据归档。一个表只能对应一个闪回数据归档区,如果为表再指定一个闪回数据归 档区,将会产生错误。SQL>CREATE TABLE employees1( EMPNO NUMBER(4) NOT NU LL, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4)) FL ASHBACK ARCHIVE;SQL>CREATE TABLE employees2( EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10), JOB VARCHAR2(9), MGR NUMBER(4)) FLASHBACK ARCHIVE fbar_1;SQL>ALTER TABLE employees3 FLASHBACK ARCHIVE;SQL>ALTER TABLE employees4 FLASHBACK ARCHIVE fbar_1;14.8 .4 闪回数据归档操作案例(1)创建两个闪回数据归档区。SQL>CREATE FLASHBACK ARCHIVE fbar_te st1TABLESPACE USERS QUOTA 100M RETENTION 10 DAY;SQL>CREATE FLASHB ACK ARCHIVE fbar_test2 TABLESPACE TBS1 QUOTA 200M RETENTION 1 YEA R;(2)创建两个表,一个表启用闪回数据归档特性,另一个表不启用闪回数据归档特性。SQL>CREATE TABLE fbar_ta ble1( ID NUMBER PRIMARY KEY,NAME CHAR(10)) FLASHBACK ARCHIVE fbar_test1;SQL>CREATE TABLE fbar_table2( ID NUMBER PRIMARY KEY, NAME CHAR(10));(3)分别向两个表中插入数据。SQL>SET TIME ON22:24:55 SQL>INSERT INTO fbar_table1 VALUES(1,''first row'');22:25:04 SQL>INSERT INTO f bar_table1 VALUES(2,''second row'');22:25:16 SQL>INSERT INTO fbar_t able2 VALUES(100,''first row'');22:25:29 SQL>INSERT INTO fbar_table 2 VALUES(200,''second row'');22:25:44 SQL>COMMIT;22:27:15 SQL>SELEC T FROM fbar_table1;ID NAME---- ------------1 first row 2 second row22:27:27 SQL>SELECT FROM fbar_table2;ID NA ME---- ------------100 first row200 second row(4)分别对两个表进行DM L操作。22:27:31 SQL>DELETE FROM fbar_table1 WHERE ID=1;22:33:05 SQL> DELETE FROM fbar_table2 WHERE ID=200;22:34:33 SQL>COMMIT;22:35:08 SQL>SELECT FROM fbar_table1;ID NAME---- -------------2 second row22:36:48 SQL>SELECT FROM fbar_table2;ID NAME--- - ------------100 first row(5)利用闪回查询,查看删除操作之前2013-3-11 22:27:1 5时刻两个表中数据的信息。22:41:29 SQL>SELECT FROM fbar_table1 AS OF TIMESTAMP(TO_TIMESTAMP(''2013-3-11 22:27:15'',''YYYY-MM-DD HH24:MI: SS''));ID NAME---- ------------1 first row2 second row22:41:44 SQL>SELECT FROM fbar_table2 AS OF TIMESTAMP(TO_TIMESTAMP(''2013-3-11 22:27:15'',''YYYY-MM-DD HH24:MI: SS''));ID NAME---- -------------100 first row200 second row(6)为了验证闪回查询使用的是撤销表空间中的信息还是闪回数据归档区中的信息,可以切换数据库的撤销表空间,然后删除原来使用的撤销表空间。22:46:59 SQL>ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS2;22:47:26 SQL>DROP TABLESPACE UNDOTBS1;(7)重新进行数据的闪回查询。22:48:07 SQL>SELECT FROM fbar_table1 AS OF TIMESTAMP(TO_TIMESTAMP(''2013-3-11 22:27:15'',''YYYY-MM-DD HH24:MI:SS''));ID NAME----- ------------1 first row2 second row22:51:41 SQL>SELECT FROM fbar_table2 AS OF TIMESTAMP(TO_TIMESTAMP(''2013-3-9 22:27:15'',''YYYY-MM-DD HH24:MI:SS''));SELECT FROM fbar_table2 AS OF TIMESTAMP(TO_TIMESTAMP 第 1 行出现错误:ORA-01555: 快照过旧: 回退段号 (名称为 "") 过小 总结闪回查询闪回版本查询闪回事务查询闪回表闪回删除闪回数据库 闪回数据归档 |
|