Oracle FlashBack

从oracle 9i开始,Oracle将闪回(Flashback)引入数据库中,闪回可以简化用户数据的恢复,不用从逻辑备份和物理备份中恢复过来。

Flashback支行的恢复级别包括下列几种:

事务闪回:对表进行了insert,update,delete操作,已经commit了,发现弄错了,需要恢复到某个commit操作之前的数据,则需要撤销刚才的某个操作。

行级闪回:对表进行insert,update,delete操作,需要恢复到时某个时间点。

表级闪回:错误的drop table操作,需要表和表中的数据。

数据库级闪回:错误地对整个数据库导入很多表数据,需要将整个数据库恢复到过去的时间点。

但它也有某些限制:

1. Flashback Database 不能解决Media Failure, 这种错误RMAN恢复仍是唯一选择
2. 如果删除了数据文件或者利用Shrink技术缩小数据文件大小,这时不能用Flashback Database技术回退到改变之前的状态,这时候就必须先利用RMAN把删除之前或者缩小之前的文件备份restore 出来, 然后利用Flashback Database 执行剩下的Flashback Datbase。
3. 如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用Flashback Database。
4. 使用Flashback Database锁能恢复到的最早的SCN, 取决与Flashback Log中记录的最早SCN。

以下几种drop不会将相关对象放进RecycleBin:
drop tablespace:会将RecycleBin中所有属于该tablespace的对象清除
drop user:会将RecycleBin中所有属于该用户的对象清除
drop cluster:会将RecycleBin中所有属于该cluster的成员对象清除
drop type:会将RecycleBin中所有依赖该type的对象清除

 

Flashback 不支持sys用户. system表空间下的对象,也不能从回收站里拿到。故使用SYS 或者SYSTEM用户登陆时, show recyclebin 为空。

配置Flash Recovery Area

启用Flash Recovery Area:
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=20G SCOPE=BOTH;
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='/DBA/FB' SCOPE=BOTH;
禁用Flash Recovery Area:
SQL>ALTER SYSTEM SET DB_RECOVERY_FILE_DEST='' ;

检查flash recovery area的使用情况: SQL> select * from v$flash_recovery_area_usage;

计算flash recovery area已经占用的空间: SQL> select sum(percent_space_used)*3/100 from v$flash_recovery_area_usage;

删除flash recovery area中不必要的备份来释放flash recovery area空间来解决这个问题: (1). delete obsolete; (2). crosscheck backupset; delete expired backupset;

启动Flashback功能
SQL> alter database flashback on;

设置初始化参数:DB_FLASHBACK_RETENTION_TARGET:
SQL>alter system set db_flashback_retention_target=1440 scope=both;
该参数用来控制flashback log 数据保留的时间,或者说,你希望flashback database 能够恢复的最早的时间点。默认值是1440,单位是minute,即24 小时,需要注意的是该参数虽然未直接指定flash recovery area大小,但却受其制约,举个例子假如数据库每天有10%左右的数据变动的话,如果该初始化参数值设置为1440,则flash recovery area 的大小至少要是当前数据库实际容量的10%,如果该初始化参数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%

 

查看当前用户是否具有Flashback的权限:

SQL> select * from session_privs where privilege like 'FLASHBACK%';

Flashback Database

实际是对数据库的一个不完全恢复操作,因为需要关闭数据库重启到mount状态。

1. 执行恢复:分timestamp 或者SCN两种
SQL> Flashback database to timestamp to_timestamp('09-10-14 14:37:05','yy-mm-dd hh24:mi:ss');
或者:
SQL> Flashback database to scn 947921;
2. SQL> alter database open resetlogs;

 

从Oracle 10g 开始, 每个表空间都会有一个叫作回收站的逻辑区域,当用户执行drop命令时, 被删除的表和表的关联对象( 包括索引, 约束,触发器,LOB段,LOB index 段) 不会被物理删除, 这些对象先转移到回收站中,这就给用户提供了一个恢复的可能。
初始化参数recyclebin 用于控制是否启用recyclebin功能,缺省是ON, 可以使用OFF关闭。

禁用后删除的对象将直接删除,不会写到Recycle中,当然在删除时,指定purge 参数,表也将直接删除,不会写到recyclebin中。SQL> drop table name purge;

查看回收站:

SQL>select * from recyclebin order by droptime desc;

Flashback table

SQL> flashback table emp to before drop; --可选参数:rename to XXX;

Flashback Query

要通过flashback query 查询undo 中的撤销数据,最简单的方式只需要在标准查询语句的表名后面跟上as of timestamp(基于时间)或as of scn(基于scn)即可

1、As of timestamp 的示例:

SQL> alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';

假设当前距离删除数据已经有5 分钟左右的话:

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

或者:
SQL>select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');

用Flashback Query恢复之前的数据:
SQL>Insert into A select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');

2. As of scn 示例

查看SCN:

SELECT dbms_flashback.get_system_change_number FROM dual;

SELECT CURRENT_SCN FROM V$DATABASE;

用Flashback Query恢复之前的数据:
SQL> insert into A select * from A as of scn 1095782;

如果想要对表进行flashback,必须允许表的row movement

Alter table table_name enable row movement; --or disable

恢复刚才删除的一条数据

查询flashback_transaction_query

select undo_sql from flashback_transaction_query where table_name='EMP';

找出相关的语句并执行。

 

 

posted @ 2012-09-09 22:51  南宫元耘  阅读(236)  评论(0编辑  收藏  举报