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

 

1、Flashback 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 --可以看到,数据已经恢复成功

 

2、Flashback Table

Oracle Flashback Table特性允许利用Flashback Table语句,确保闪回到表的前一个时间点。与Oracle 9i中的Flashback Query相似,利用回滚段信息来恢复一个或一些表到以前的一个时间点(一个快照)。要注意的是,Flashback Table不等于Flashback Query,Flashback 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表闪回到2005年5月7日下午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