应用flashback database先决条件:
1、数据库必须启用了flashback database
SQL> select flashback_on, force_logging from v$database; FLASHBACK_ON FORCE_ ------------------------------------ ------ YES YES
2、数据库必须打开flash recovery area
SQL> show parameter db_recovery_file; NAME TYPE VALUE ------------------------------------ ---------------------- ------------------------------ db_recovery_file_dest string /u01/app/oracle/flash_recovery _area db_recovery_file_dest_size big integer 2G
3、数据库必须处于archivelog模式
SQL> archive log list; Database log mode Archive Mode Automatic archival Enabled Archive destination /u01/app/oracle/oradata/archive Oldest online log sequence 15 Next log sequence to archive 17 Current log sequence 17
限制条件:
1、非介质恢复,不能恢复被删除的数据文件。
2、控制文件重建,日志失效,不能闪回到控制文件重建前。
3、nologging模式下插入数据恢复不了,建议forece logging模式。
(1)查询当前scn
SQL> select current_scn from v$database; CURRENT_SCN ----------- 520463
(2)模拟故障
SQL> drop table test1; Table dropped.
SQL> delete from new_test1 where id > 6; 2 rows deleted. SQL> commit; Commit complete.
(3)启动到mount,执行恢复
SQL> shutdown immediate startup mount;
SQL> flashback database to scn 520463; Flashback complete.
恢复完有两种方式修复数据库:
1、直接alter database open resetlogs打开数据库,但指定scn或timestamp时间点之后的数据丢失。
2、alter database open read only,以read-only打开数据库,立刻逻辑导出方式将误操作涉及表导出,再执行recover database以重新应用redo,修改数据库到闪回到的状态,然后再逻辑导入方式将误操作表导入,这样不会丢失数据。
这里演示第一种:
SQL> alter database open resetlogs; Database altered. SQL> select * from test1; ID NAME ---------- -------------------- 6 ff 7 gg 6 dd 7 ee SQL> select * from new_test1; ID NAME ---------- -------------------- 6 ff 7 gg 6 dd 7 ee