与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
oracle视频教程请关注: