现在的位置: 首页 > 综合 > 正文

Oracle闪回特性

2013年08月24日 ⁄ 综合 ⁄ 共 4241字 ⁄ 字号 评论关闭

Oracle闪回特性

在利用闪回功能前需要确认:

1、用户有对dbms_flashback包有执行权限!

2、进行闪回查询必须设置自动回滚段管理,在init.ora设置参数UNDO_MANAGEMENT=AUTO,参数UNDO_RETENTION=n,决定了能往前闪回的最大时间,值越大就需要越多Undo空间。

 

Oracle 9i中闪回查询操作实例

 

查看OracleDeleteCommit操作的流程分析

  
例:Oracle 9iFlashback Query操作。

(1)创建闪回查询用户

SQL> create user test identified by test;

SQL> grant connect, resource to test;

SQL> grant execute on dbms_flashback to test;

SQL> connect test/test;

 

(2)创建测试表,插入测试记录

SQL> create table test(id number(3));

SQL> insert into test values(1);

SQL> insert into test values(2);

SQL> commit;   

 

注意:在执行步骤3或者步骤4之前,等待5分钟。

 

(3)删除记录

SQL> delete from test where id=1;

SQL> commit;

 

   通过以上的操作,我们插入了两条记录,并删除了其中一条记录。在以下的操作中,我们将通过flashback query找到删除的记录

 

(4)闪回查询(分别通过timestampscn查询)

SQL> select * from test as of timestamp sysdate - 5/1440;

ID

----

1

2

SQL> select * from test as of scn 8173800;

ID

----

1

2   
 可以看出,虽然删除记录并提交,但是通过闪回操作,仍能查询到删除前的两条记录。需要注意Oracle5分钟记录一次SCNSMON_SCN_TIME,并将SCN和对应时间的映射进行纪录。如果原来插入的记录到做闪回操作的时间在5分钟之内,用基于时间的闪回查询可能得不到记录,因为基于时间点的查询实际上是转化为最近的一次SCN,然后从这个SCN开始进行恢复。因此,如果需要精确的查询可以采用基于SCN的闪回查询,可精确闪回到需要恢复的时间。可以通过DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER语句获取SCN

 

5、恢复被删除的数据实例

SQL>insert into test select * from test as of scn 8173800 where id=1;

 

Oracle 10g中闪回查询操作实例

 

     Oracle 9i相比Oracle 10gFlashback有了非常大的改进,Orcle 10g之前,SMON_SCN_TIMESMON来获取和记录信息的,每5分钟记录一次,从Oracle 10g开始,LGWR首先会在SGA中记录SCN与时间的映射关系(由于LGWR至少每3秒就会被激活一次,所以现在SMON_SCN_TIME能够支持大于3秒的闪回)SMON则定期检查SGA是否内存中的映射大于磁盘上的,如果有就刷新纪录到磁盘, 而且从普通的Flashback Query发展到了多种形式,主要表现在如下几方面新特性:

 

1Flashback Database

  Oracle Flashback Database特性允许通过SQL语句Flashback Database语句,让数据库前滚到当前的前一个时间点或者SCN,而不需要做时间点的恢复。闪回数据库可以迅速将数据库回到误操作或人为错误的前一个时间点,如Word中的"撤消"操作,可以不利用备份就快速的实现基于时间点的恢复。Oracle通过创建新的Flashback Logs(闪回日志),记录数据库的闪回操作。

如果希望能闪回数据库,需要设置如下参数:
DB_RECOVER_FILE_DEST      --日志的存放位置,
DB_RECOVER_FILE_DEST_SIZ  --E
恢复区的大小

在创建数据库的时候,Oracle将自动创建恢复区,但默认是关闭的,需要执行alter database flashback on命令。

   

执行Flashback Database命令格式:

SQL>flashback database to time to_timestamp(xxx);

SQL>flashback database to scn xxx

 

数据库的闪回状态可以从V$database视图中查询得到: 

SQL> select dbid,name,flashback_on,current_scn from v$database;

DBID             NAME       FLASHBACK_ON CURRENT_SCN

----------        ---------      ------------------       -----------

1692001961  ACF          NO                         8175168

 

一个数据库级闪回的例子:   

SQL> shutdown immediate;

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount

ORACLE 例程已经启动。

Total System Global Area 1719664640 bytes

Fixed Size 1251896 bytes

Variable Size 293602760 bytes

Database Buffers 1417674752 bytes

Redo Buffers 7135232 bytes

数据库装载完毕。

SQL> alter database flashback on;

数据库已更改。

SQL> alter database open;

数据库已更改。

SQL> select dbid,name,flashback_on,current_scn from v$database;

DBID NAME FLASHBACK_ON CURRENT_SCN

---------- --------- ------------------ -----------

1692001961 ACF YES 8175890

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

------------------------

8175973

SQL> delete from test where id=1;

1 row deleted

SQL> select * from test;

ID

----

2

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup mount ORACLE 例程已经启动。

Total System Global Area 1719664640 bytes

Fixed Size 1251896 bytes

Variable Size 301991368 bytes

Database Buffers 1409286144 bytes

Redo Buffers 7135232 bytes

数据库装载完毕。

SQL> flashback database to scn 8175973; 闪回完成。

SQL> alter database open resetlogs; 数据库已更改。

SQL> select * from test;

ID

----

2

1 --可以看到,数据已经恢复成功

 

 

2Flashback Table

  Oracle Flashback Table特性允许利用Flashback Table语句,确保闪回到表的前一个时间点。与Oracle 9i中的Flashback Query相似,利用回滚段信息来恢复一个或一些表到以前的一个时间点(一个快照)。要注意的是,Flashback Table不等于Flashback QueryFlashback Query仅仅是查询以前的一个快照点而已,并不改变当前表的状态,而Flashback Table将改变当前表及附属对象一起回到以前的时间点。

 

语法:

alter table table_name enable row movement;

flashback table tablename to timestamp xxx

flashback table tablename to scn xxx

  

注意:如果需要闪回一个表,需要以下条件:

·需要有flashback any table的系统权限或者是该表的flashback对象权限;

·需要有该表的select,insert,delete,alter权限;

·必须保证该表row movement

例:执行将test表闪回到200557日下午3

SQL>flashback table test to timestamp to_timestamp(’2005-05-07 15:00:00’,’yyyy-mm-dd hh24:mi:ss’);

 

一个完整的Flashback Table例子

SQL> select * from test;

  ID

----

   2

   1

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

------------------------

                 8178419

SQL> delete from test where id=1;

1 row deleted

SQL> select * from test;

  ID

----

   2

SQL> alter table test enable row movement;

Table altered

SQL> flashback table test to scn 8178419;

Done

SQL> select * from test;

  ID

----

   2

   1

 

3Flashback Drop

  Oracle Flashback Drop特性提供一个类似回收站的功能,用来恢复不小心被删除的表。当删除表时,Oracle 10g并不立刻释放被删除的表所占用的空间,而是将这个被删除的表进行自动重命名(为了避免同类对象名称的重复)并放进回收站中。所谓的回收站类似于Windows系统中的回收站,是一

抱歉!评论已关闭.