教你如何成为Oracle 10g OCP - 第十四章 闪回

本文介绍了Oracle数据库中的闪回技术,包括闪回数据库、闪回删除、闪回表、闪回版本查询、闪回事务查询及闪回查询等功能,详细解释了各闪回操作的适用场景、操作方法及注意事项。

 

闪回 (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/

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值