做操作前先备份数据库
RMAN> backup database;
1. 检查是否启动了flash recovery area:
SQL> show parameter db_recovery_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest tring D:\oracle/flash_recovery_area
db_recovery_file_dest_size big integer 1G
2. 检查是否启用了归档
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 9
下一个存档日志序列 11
当前日志序列 11
3. 检查是否启用了flashback database
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
4. 查询当前的scn
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
947921
5. 查询当前的时间
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
TIME
-----------------
09-10-14 14:37:05
6. 删除表A
SQL> select * from A;
ID NAME
---------- ----------
1 tianle
2 dave
SQL> drop table A;
表已删除。
SQL> commit;
7. Flashback Database 实际是对数据库的一个不完全恢复操作,因为需要关闭数据库重启到mount状态。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 209715200 bytes
Fixed Size 1248116 bytes
Variable Size 79692940 bytes
Database Buffers 121634816 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
8. 执行恢复:分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;
闪回完成。
9. 打开数据库:
在执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
1). 直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。
2). 先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。
这里演示,就以resetlogs方式打开:
SQL> alter database open resetlogs;
数据库已更改。
验证数据:
SQL> select * from A;
ID NAME
---------- ----------
1 tianle
2 dave
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html