flashback 闪回 (final)


1. 查询闪回(Flashback Query):  闪回数据,利用undo   

建立表 tony.TEST_FLASHBACK , 其中数据如下:

co1|co2|co3|co4
Keai|1|Rese|8/2/2010 2:32:51 PM
Seri|2|Pio|8/2/2010 2:32:31 PM
Ddise|3|Tie|8/2/2010 2:32:15 PM
Test|4|Yue|8/2/2010 2:21:08 PM
Hsee|5|Wei|8/2/2010 2:33:17 PM
Uual|6|Our|8/2/2010 2:23:34 PM


分别在以下时间点对表进行删除:

2010/08/02 14:46:30  
    delete from tony.TEST_FLASHBACK where co2=1 ;
2010/08/02 14:48:30  
    commit; 

2010/08/02 14:57:36  
    delete from tony.TEST_FLASHBACK where co2=2 ;
2010/08/02 14:59:44   
    commit; 


以下两语句都可以恢复到删除co2=1 之前的状态:

SELECT * FROM tony.TEST_FLASHBACK AS OF TIMESTAMP
 TO_TIMESTAMP('2010/08/02 14:47:29','YYYY/MM/DD HH24:MI:SS');
或者
SELECT * FROM tony.TEST_FLASHBACK AS OF TIMESTAMP
 TO_TIMESTAMP('2010/08/02 14:46:28','YYYY/MM/DD HH24:MI:SS');


以下语句可以恢复到删除co2=2 之前的状态:

SELECT * FROM tony.TEST_FLASHBACK AS OF TIMESTAMP
 TO_TIMESTAMP('2010/08/02 14:58:29','YYYY/MM/DD HH24:MI:SS');

 

 

 


2. 表闪回(Flashback Table):闪回数据,利用undo  

利用表闪回可以将表中的数据恢复到历史上的某个时间点 。表闪回要求用户具有以下权限:
(1)  FLASHBACK ANY TABLE权限或者是该表的Flashback对象权限。
(2) 有该表的SELECT、INSERT、DELETE、ALTER权限。
(3) 闪回表之前,需要启用这个table的ROW MOVEMENT(因为有可能在不同时间点上,某行
     数据在A数据块,而历史某时间点上在B数据块上,表闪回会引起数据行的移动):
     SQL> alter table t1 enable row movement ;   

Oracle 10g的闪回表与Oracle9i的查询闪回功能类似,也是利用恢复信息(Undo
Informations)对以前的一个时间点上的数据进行恢复。Oracle 10g的表闪回有如
下特性:
(1) 在线操作。
(2) 恢复到指定时间点或者SCN的任何数据。
(3) 自动恢复相关属性,如索引、触发器等。
(4) 满足分布式的一致性。
(5) 满足数据一致性,所有相关对象的一致性。


要实现表闪回,必须确保与UNDO表空间有关的参数设置合理。UNDO表空间相关参
数为:

SQL>SHOW PARAMETER UNDO 
 NAME   TYPE  VALUE
 Undo_management string  AUTO
 Undo_retention integer  900
 Undo_tablespace string  UNDOTBS1

在创建UNDO表空间时,要考虑数据保存的时间长短、每秒产生的块数据量及块大小等。假
如表空间大小用undo表示,那么:
 undo=UR×UPS×DB_BLOCK_SIZE+冗余量
(1) UR: 在undo中保持的最长时间数(秒),由数据库参数UNDO_RETENTION值决定。
(2) UPS:在undo中每秒产生的数据块数量。


表闪回的语法格式如下:
 FLASHBACK TABLE [schema.]table_name
 TO  [SCN | TIMESTAMP] expr [ENABLE | DISABLE] TRIGGERS}

(1) schema:方案名称。
(2) SCN:SCN是系统改变号,可以从flashback_transaction_query数据字典中查到。
(3) TIMESTAMP:表示系统邮戳,包含年月日以及时分秒。
(4) ENABLE TRIGGERS:表示触发器恢复之后的状态为ENABLE。默认为DISABLE状态。

例子:

SQL> delete tony.TEST_FLASHBACK3 where co2<5 ;
SQL> alter table tony.TEST_FLASHBACK3 enable row movement;
SQL> FLASHBACK TABLE tony.TEST_FLASHBACK3 TO TIMESTAMP
     TO_TIMESTAMP('2010-08-04 10:11:30', 'YYYY-MM-DD HH24:MI:SS');

注意点: 假设当前时间点为B, 历史时间点为A, 如果需要闪回到历史时间点A,
但是A,B时间点之间有对表进行任何的DDL操作,闪回操作将失败。

 

 

 

 

3. 闪回删除(Flashback Drop):闪回整个表结构及数据,利用10g recyclebin 

Oracle10g以前,Drop table后,那么该表就会从数据字典里被删除。但是Oracle10g中在
drop table(非purge)后只是在数据字典中对被删除的表进行重命名,并没有真的把表从数
据字典中删除,而用来维护被删除前的表的名字和后面重新生成的表名字之间的关系的数
据字典表,我们称之为“回收站”(recycle bin), 当drop table(没有加 purge)的时候,
索引,触发器也会一起进入回收站。

回收站中的对象将一直存在,直到用户决定永久删除它们,使用PURGE命令对回收站空间
进行清除; 或是出现表空间的空间不足时它们才会被删除。


注意: 虽然只是数据字典中的表名(当然可能还有索引名,trigger名)发生变化(一般会
变成类似BIN$Phio9oeiQYESLIAUICKSE==$0),但是实体的数据等还是存放在原表的表空间中。

回收站中表名的格式:   BIN$globalUID$Sversion
globalUID是一个全局唯一的标识对象,长度为24个字符。它是Oracle内部使用的标识。
$Sversion是数据库分配的版本号。


例子:

(1) 使用DELETE命令删除表XS_KC1
 SQL>DELETE TABLE XS_KC1;
(2) 查询数据字典信息。
 SQL>SELECT OBJECT_NAME,ORIGINAL_NAME,TYPE,DROPTIME FROM RECYCLEBIN;

OBJECT_NAME                      ORIGINAL_NAME   TYPE         DROPTIME
BIN$IjiFX9AtQ5SpWpmM0UM5XQ==$0   PK_XH          INDEX     2006-05-12:13:02:58
BIN$zSYB+LfCTxSgq52R4siO9Q==$0   XS           Table Partition    2006-05-12:13:02:58
BIN$3TBJPuzeQQ+1hW7wZncMuQ==$0  A              TABLE         2006-05-12:14:08:38
BIN$rfkYjlyoRF6uK716UUwwBg==$0   XS2             TABLE         2006-05-12:20:59:27
BIN$BFGXZQMxRMmnIpJVT/mJ1w==$0   XS_KC1    TABLE         2006-05-31:22:21:39
(3) 使用flashback drop从回收站恢复表XS_KC1。
 SQL>FLASHBACK TABLE XS_KC1 TO BEFORE DROP;

如果不知道原表名或有多个相同表在不同时间被drop,也可以直接使用回收站中的名称进行闪回。
例如: FLASHBACK TABLE  "BIN$b2q1qVWuQZy+1TAWJ0M+OA==$0"  TO  BEFORE DROP;  
这样就知道是恢复哪个时间drop掉的表了。

 

注意: table被恢复后,index不会恢复,恢复的index还是原来的BIN$开头的名字,而且在登陆
schema的下面会生成一个 SYS_TEMP_FBT 的临时表,其中含有恢复的一些动作action 。且恢复
完后, 查询 select * from dba_recyclebin;  就看不到这个表对应的BIN$ 表了。

CREATE GLOBAL TEMPORARY TABLE SYS_TEMP_FBT
(
  "SCHEMA"     VARCHAR2(32 BYTE),
  OBJECT_NAME  VARCHAR2(32 BYTE),
  OBJECT#      NUMBER,
  RID          UROWID(4000),
  ACTION       CHAR(1 BYTE)
)
ON COMMIT PRESERVE ROWS
NOCACHE;

 


-- 回收站(recycle bin)管理

回收站可以提供误操作后进行恢复的必要信息,但是如果不经常对回收站的信息
进行管理的话,磁盘空间会被长时间占用,因此要经常清除回收站中无用的东
西。要清除回收站,可以使用PURGE命令。PURGE命令可以删除回收站中的
表、表空间和索引,并释放表、表空间和索引所占用的空间。PURGE命令语法
格式如下:
 PURGE TABLE table_name ;
        PURGE INDEX index_name ;   
        PURGE RECYCLEBIN ;
        PURGE DBA_RECYCLEBIN  ;
        PURGE TABLESPACE tablespace_name USER username ; 

备注: PURGE TABLE recyclebin_object_name。
       PURGE TABLE original_table_name。    两种结果一样。

(1) TABLE指示清除回收站中的表。
(2) INDEX指示清除回收站中的索引。
(3) TABLESPACE指示清除回收站中的表空间。
(4) RECYCLEBIN指的是当前用户需要清除的回收站。
(5) RECYCLEBIN仅SYSDBA系统权限才能使用,此参数可使用户从Oracle系统回收站清除所有对象。

 

 


4. 闪回数据库(Flashback Database):

闪回整个数据库,利用flash recovery area及闪回日志  


比如出现如下情形,需要闪回数据库:
A. 系统管理员错误删除了用户;
B. 用户truncate 了表;
C. 一个批处理操作导致多个表的数据发生混乱,无法使用闪回表的方式恢复。

数据库闪回可以使数据库回到过去某一时间点上或SCN的状态,用户可以不利用
备份就能快速地实现时间点的恢复。

原理 -- 实现闪回数据库的基础是闪回日志,只要我们配置了闪回数据库,就会自
动创建闪回日志,这时,只要数据库中的数据发生变化,就会将数据被修改前的旧
值保存到闪回日志中,当需要闪回数据库时,Oracle就会读取闪回日志的记录,应
用到数据库,将库回退到历史的某个时间点的状态。


闪回日志和联机日志很像,都是循环使用的,不过记录闪回日志时,只会将改变前
的值保存在flashback buffer中,再由RVWR进程写入到闪回日志文件中。联机日志
文件是将改变前后的值以重做记录形式保存,两种日志的写入都是顺序写入。

但是应用日志的时候,闪回日志和联机日志不一样,闪回时是从闪回日志的尾部
开始向头部方向依次取出日志记录应用到库上,这个过程叫做闪回; 应用联机
日志文件叫做恢复,恢复的时候和写入顺序一样,是从联机日志的头部到尾部
方向,依次取出重做记录应用到库上 。 


---- 启用闪回数据库的步骤

A. 数据库必须是归档模式;
B. 配置闪回恢复区(flash recovery area,FRA); 因为闪回日志必须放在FRA中,
   需要配置以下参数: 
(1) DB_RECOVERY_FILE_DEST:确定Flashback Logs地存放路径。
(2) DB_RECOVERY_FILE_DEST_SIZE:指定恢复区地大小,默认值为空
(3) DB_FLASHBACK_RETENTION_TARGET:设定闪回数据库的
    保存时间,单位是分钟,默认是一天(1440分钟)。
如果FRA区域出现空间压力,那么Oracle会自动删除闪回日志,也就是说不一定能
恢复到指定的时间点。
C.  启动闪回数据库:
    SQL> alter database mount;
    SQL> alter database flashback on; 
一旦关闭闪回数据库,则flash recovery area中的所有闪回日志都被自动删除;
Alter database flashback off ; 命令是关闭数据库闪回功能。

 

例子:
SQL> drop user tony cascade ;
SQL> shutdown immediate ;
SQL> startup mount exclusive;
SQL> flashback database to timestamp to_date('2007-10-11 14:25:51','yyyy-mm-dd hh24:mi:ss'); 
SQL> alter database open read only; 
(设置为read only是为了防止这时用户连接进来)
检查数据库数据恢复是否正常;如果不正常继续flashback; 如果正常:
SQL> shutdown immediate ;
SQL> startup mount;
SQL> alter database open resetlogs ;
(即便以resetlogs开启数据库,由于当前闪回日志还存在,我们仍然可以闪
回到之前的某个状态)。

当然也可以闪回到某个scn -- flashback database to scn 34528412; 

闪回日志信息的视图 -- V$FLASHBACK_DATABASE_LOG

注意: 如果A为历史时间,B为当前时间,需要闪回到A, 但是A,B时间之间对数
据库做了如下动作:恢复或重建了控制文件,或删除了某个表空间,或收缩了某
个数据文件,那么闪回到A时间点的操作会失败 。


--- 如何保证让Oracle不自动删除需要的闪回日志

我们可以在做操作前,进行如下操作,对restore point 起名字为 must_to_this_point,
那么操作一旦失败,可以保证能将数据闪回到发出该操作之前的时间点。
SQL> create restore point must_to_this_point guarantee flashback database;

 


5.  闪回事务查询 (Flashback  transaction query ):  利用undo表空间中的undo数据

select  *    from    flashback_transaction_query   ;   

 

6. 闪回版本查询 ( Flashback  version query ) 

 

 

 

 

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-670287/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/35489/viewspace-670287/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值