闪回 (flashback)
1. 闪回主要是针对逻辑错误(比如用户误删除了数据,表,管理员误删除了用户等),而像物理数据块损坏,online redo损坏等物理错误,闪回是不能提供帮助的。
2. 需要进行闪回的几种可能情况:
A. 管理员错误删除了用户
B. 用户或管理员Drop Table
C. 用户Truncate Table
D. 用户执行了错误的脚本导致多个表数据混乱
E. 用户误删除了表的数据
3. 闪回的分类
A. 闪回数据库(flashback database): 适用于删除用户,truncate table, 运行错误脚本导致多表数据混乱(无法通过闪回表方式恢复)
B. 闪回删除(flashback drop): 如果错误drop了table, 我们可以通过闪回删除来恢复 。
C. 闪回表(flashback table): 如果误删除了table中的某些数据,可以通过flashback table回退到历史上的某个时间点。
D. 闪回版本查询(flashback version query): 每次事务引起的数据行的变化,每次变化就是一个版本。通过闪回版本查询可以看到数据行的整个变化过程。
E. 闪回事务查询(flashback_transaction_query): 利用此视图可得到哪些事务引起数据变化,其中的undo_sql是撤销语句。
F. 闪回查询(flashback query): 显示历史的某个时间点上Table中有哪些数据 。
4. 先看看 Oracle9i (flashback query )
Oracle9i flashback query :
用Oracle 多版本读一致的特性通过undo 来提供所需的前镜像中的数据。通过这个功能,可以看到历史数据,甚至用历史数据来修复误操作引起的错误。可以通过指定时间或者SCN 来检索需要的数据。
数据库最好处于Automatic Undo Management 状态(也有文章说必须,我查找了oracle文档应用了这个词Prerequisite,同时在AskTom上我也查找到相应的解释,指明最好是自动Undo管理,手动的Undo管理也是可以的,并且有例子)最大可以闪回查询的时间段由UNDO_RETENTION 初始化参数(单位为秒)指定,参看下面执行命令
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 10800
undo_suppress_errors boolean FALSE
undo_tablespace string UNDOTBS1
可以通过ALTER SYSTEM SET UNDO_RETENTION =; 来修改参数值
设置了相对大的UNDO_RETENTION, 就必须设置足够大的UNDO ROLLBACK SEGMENTS
尽管timestamp可以精确到毫秒,可是由于 oracle 每隔5分钟会将产生的 SCN 对应一个 TIME 做记录 ,也就是说通常只记录了SCN,但是每5分钟会记录 SCN and TIME ,当采用 timestamp 来做flashback 的时候就有可能产生偏差,5分钟的来由是在于SYS.SMON_SCN_TIME,所以基于SCN的Flashback Query是最准确的, 为了避免恢复失败,我们可以先等5分钟,然后再进行恢复。 还有在Oracle 9i中SCN和对应时间的映射信息只会保留5天,因此我们无法恢复5天前的数据。如果你想使用闪回查询来恢复5天前的数据,你必须自己来确定需要恢复的SCN (SCN的确定可以使用Logminer) 。
eg:
alter session set nls_date_format='YYYY-MM-DD HH24:MI:SS'; --- 定义时间格式,精确到秒
select * from sfis1.LOGIN_LOG_TRACE
as of timestamp to_timestamp('2008-4-17 15:36:00','YYYY-MM-DD HH24:MI:SS')
where id in ('18479513','18479514','18479515');
SQL> select sal from emp AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE) where empno=7369;
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY)
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE)
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '2' HOUR)
----------
当前SCN: SQL> select dbms_flashback.get_system_change_number fscn from dual;
SQL> col fscn for 9999999999999999999
SQL> col nscn for 9999999999999999999
SQL> select name, FIRST_CHANGE# fscn, NEXT_CHANGE# nscn, FIRST_TIME from v$archived_log;
...................
NAME FSCN NSCN FIRST_TIME
------------------------------ -------------------- -------------------- -------------------
/arch/oracle/1_52413.dbf 12929941968 12929942881 2005-06-22 14:38:28
/arch/oracle/1_52414.dbf 12929942881 12929943706 2005-06-22 14:38:32
/arch/oracle/1_52415.dbf 12929943706 12929944623 2005-06-22 14:38:35
/arch/oracle/1_52416.dbf 12929944623 12929945392 2005-06-22 14:38:38
/arch/oracle/1_52417.dbf 12929945392 12929945888 2005-06-22 14:38:41
/arch/oracle/1_52418.dbf 12929945888 12929945965 2005-06-22 14:38:44
create table sfis1.LOGIN_LOG_TRACE_recov as select * from sfis1.LOGIN_LOG_TRACE where 1=0;
insert into sfis1.LOGIN_LOG_TRACE_recov select * from sfis1.LOGIN_LOG_TRACE
as of scn 12929942881 where id in ('18479513','18479514','18479515');
----------------------
SQL> exec dbms_flashback.enable_at_time(to_date('20080110131400','yyyymmddhh24miss')) , 实现数据库的回闪。
闪回得到的结果并不是把被删除的数据直接找了回来,而是在回滚段中找到了被删除表的一个镜相,所以表还是被删除了,但因为镜相已经找到,可以利用他来进行数据恢复。
5. Oracle10g 闪回数据库
原理: Oracle是通过读取闪回日志来进行数据回退动作的。闪回日志类似于redo log一样在flashback buffer 记录数据行改变前的所有列数值(注意redo log是记录前后的值),然后再由RVWR进程写入闪回日志文件中(flash_recovery_area目录下的文件),读取闪回日志的时候和写入顺序相反(因为闪回需要逐渐恢复到更以前的时间点,而redo log的写入和应用顺序是一样的),
条件:
A. 数据库要求归档模式 ;
B. 配置闪回恢复区(flash recovery area,闪回日志存放处) . SQL>show parameter db_recovery_file
C. 配置闪回保留时间,默认为1440分钟,一天。 SQL> show parameter db_flashback_retention_target
D. 启动或关闭闪回数据库。 SQL> alter database moutn ; SQL> alter database flashback on ; SQL> alter database flashback off ;
开启后Oracle会在flash recovery area区域自动创建闪回日志。 关闭闪回数据库后,则这个区域的所有闪回日志都被自动删除。
操作:
SQL> flashback database to timestamp to_date('2008-10-12 12:26:23','yyyy-mm-dd hh24:mi:ss') ;
或者 SQL> flashback database to scn 3562415 ;
闪回结束后,一般应该先以read only打开库,确认闪回数据是否正确,如果不正确,可以关闭然后mout,继续闪回。如果正确了,则需要关闭数据,然后
以resetlog方式打开数据。
备注:
我们也可以使用备库进行闪回,read only读出正确资料后,再将备库恢复到最新状态。
注意点:
闪回数据受到时间db_flashback_retention_target 以及空间 flash_recovery_area 的影响, 达到空间大小后Oracle会自动删除闪回日志。当前到闪回的时间点
之间如果重建controlfile或 删除了某个表空间或收缩了某个数据文件,那么闪回到那个点会失败 。
相关视图: v$flashback_database_log
5. Oracle10g 闪回删除(flashback drop)
Oracle10g之前删除(drop)一个表,那么该表就会从数据字典中删除,10g或之后drop table后默认只是在数据字典里对被删除的表进行重命名,并没有真的将表
从数据字典中删除,维护删除前后对应关系的数据字典表,我们称为回收站(recycle bin), 表上相关对象,trigger,index也会一并进入回收站。
查看: SQL> show recyclebin ; 或视图 dba_recyclebin , user_recyclebin ;
删除后的表在回收站中名称变为类似 BIN$PHI0e0pQESPCL1Aao3EB==$0 的名称,同样index也被改名。 他们原来所占用的空间在物理上并没有被释放。
可以通过user_segments 查看 segment_name = 'BIN$PHI0e0pQESPCL1Aao3EB==$0' ,的确物理上占用空间,但是逻辑上已经释放了,并入dba_free_space中了。
操作:
SQL> flashback table A_TEST to before drop ; 表被恢复后,相关index,trigger等需要重建。
SQL> flashback table A_TEST to before drop rename to A_TEST_NEW ; (如果需要恢复的表名称已经存在了)
SQL> flashback table "BIN$PHI0e0pQESPCL1Aao3EB==$0" to before drop ; (如果同样的名称表被多次drop, show recyclebin多个同名表)
6. 10g中drop table 如何回收物理空间
A. 自动回收: 当tablespace存在空间压力,首先使用非回收站可用空间,然后才是释放回收站最老的那些对象占用的空间,知道释放完回收站所有的空间。
B. 手工回收: purge命令释放回收站里面对象占用的空间
SQL> purge table A_TEST ;
SQL> purge index index_A_TEST; 清除回收站中某个index占用的空间
SQL> purge tablespace users ; 清除回收站中属于users表空间的对象所占用的空间
SQL> purge user_recyclebin ; 清除回收站中属于当前用户的所有对象所占用的空间
SQL> purge user_recyclebin ; 清除回收站中所有对象占用的空间
C. 我们删除表的时候可以直接见回收站物理空间清理。 SQL> drop table A_TEST purge ; 这样的删除,table将没有办法通过闪回删除进行恢复了。
D. drop user tolywang cascade ; drop tablespace users including contents ; 这些命令物理上删除,也不会放入回收站中。
7. 10g中闪回表(flashback table)
闪回表就是将表中的数据回退到历史上的某个时间点,闪回表利用的是undo表空间中记录的数据改变前的值。这些undo中的数据保留的时间取决于
undo_retention 的值,如果要回退的数据被其他事务覆盖的话,就不能恢复到指定的时间了,除非在undo上设置retention guarantee选项。
备注: 由于闪回表操作会修改表中的数据,可能引起数据行的迁移(闪回前后分别在A,B数据块中),所以闪回表之前,需要启动数据行的转移特性。
SQL> alter table A_TEST enable row movement ;
闪回表可以从时间上向前,向后任意闪回,只要这些时间段的数据在UNDO中存在。比如:
SQL> flashback table A_TEST to timestamp to_date('2007-10-12 20:35:12','yyyy-mm-dd hh24:mi:ss'); 闪回到2007-10-12 20:35:12
SQL> flashback table A_TEST to timestamp to_date('2007-10-12 20:23:42','yyyy-mm-dd hh24:mi:ss'); 然后闪回到2007-10-12 20:23:42
SQL> flashback table A_TEST to timestamp to_date('2007-10-12 20:35:12','yyyy-mm-dd hh24:mi:ss'); 再次闪回到2007-10-12 20:35:12
注意: 在闪回的两个时间段A,B之间如果存在对table的DDL操作(Alter),闪回操作会失败。SYS下的表不能闪回操作。
8. 10g中闪回版本查询(flashback version query)
闪回版本查询不是闪回操作,是查看引起数据行变化的每次操作(变化情况)。闪回版本查询也是利用的undo表空间里面记录的undo数据。
SQL查询语法:
select [Pseundocolumns] ... from ... versions between
{scn | timestamp {expr | minvalue } and {expr | maxvalue} }
[as of {scn | timestamp expr}]
where [Preundocolumns...]....
Pseundocolumns 伪列
A. versions_starttime 事务开始时的时间
B. versions_startscn 事务开始时的scn号
C. versions_endtime 事务结束时的时间
D. versions_endscn 事务结束时scn号
E. versions_xid 事务的ID号
F. versions_operation 事务进行的操作类型,包括插入(I),删除(D)和更新(U) .
例子:
select versions_starttime, versions_startscn, versions_endtime, versions_endscn,
versions_xid, versions_operation from A_TEST versions between scn minvalues
and maxvalues ;
注意: 闪回版本查询不支持外部表,临时表,X$表,视图。
9. 10g中闪回事务查询(flashback transaction query)
10g中闪回事务查询指一个视图: flashback_transaction_query ,同时也是一个诊断工具。通过查询可以显示哪些事务引起了数据的变化。
并为此提供撤销的SQL语句。 利用的是undo表空间中的undo数据。
SQL> select operation, undo_sql from flashback_transaction_query where table_name='A_TEST'
and table_owner='TOLYWANG' order by start_timestamp desc ;
10. 10g中闪回查询(flashback query)
同样,闪回查询利用的是undo表空间中的undo数据。
语法如下:
SQL> select ... from as of timestamp ... where ....
SQL> select ... from as of scn ... where ....
以上显示是在历史某个时间点上这个table有哪些数据 。
例子:
SQL > create table A_TEST_TMP select * from as of timestamp to_date('2007-10-12 20:23:42','yyyy-mm-dd hh24:mi:ss') ;
Oracle9i (flashback query )
http://www.eygle.com/archives/2005/06/eoaoracle9iaeai.html
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-617143/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-617143/
本文介绍了Oracle数据库中的闪回技术,包括闪回数据库、闪回删除、闪回表、闪回版本查询、闪回事务查询及闪回查询等功能,详细解释了各闪回操作的适用场景、操作方法及注意事项。
1747

被折叠的 条评论
为什么被折叠?



