当用户执行不完全恢复时,如果能够确定恢复点所对应的SCN值,那么可以使用这种方法恢复!
首先关闭数据库执行一个冷全备份
SQL> conn /as sysdba 已连接。 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> ! cp /u01/app/oracle/oradata/orcl/*.dbf /u01/app/oracle/backup/
打开数据库,可以看见用户u1的t表里面是有数据的,然后截断表
SQL> conn /as sysdba 已连接到空闲例程。 SQL> startup ORACLE 例程已经启动。 Total System Global Area 167772160 bytes Fixed Size 1266392 bytes Variable Size 71306536 bytes Database Buffers 92274688 bytes Redo Buffers 2924544 bytes 数据库装载完毕。 数据库已经打开。 SQL> conn u1/u1 已连接。 SQL> select * from t; ID VALUE ---------- ---------- 1 a 2 b 3 c SQL> truncate table t; 表被截断。 SQL> select * from t; 未选定行
现在用户发现错误的删除了t表的数据,要求恢复。在不完全恢复之前数据库处于open状态,必须先关闭数据库,再mount,把备份的数据文件复制过来
SQL> conn /as sysdba 已连接。 SQL> shutdown immediate 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。 SQL> startup mount ORACLE 例程已经启动。 Total System Global Area 167772160 bytes Fixed Size 1266392 bytes Variable Size 71306536 bytes Database Buffers 92274688 bytes Redo Buffers 2924544 bytes 数据库装载完毕。 SQL> ! rm -rf /u01/app/oracle/oradata/orcl/*.dbf SQL> ! mv /u01/app/oracle/backup/*.dbf /u01/app/oracle/oradata/orcl/
查看如下视图,可以看见需要恢复的数据文件,备份时间是“2011-10-09 02:12:08”,scn是“504040 ”。还可以看见控制文件中scn号码要比数据文件中scn号码新。
SQL> select file#,online_status,error,change#,to_char(time,'yyyy-mm-dd hh24:mi:ss') from v$recover_file; FILE# ONLINE_ ERROR CHANGE# TO_CHAR(TIME,'YYYY- ---------- ------- ----------------------------------------------------------------- ---------- ------------------- 1 ONLINE 504040 2011-10-09 04:07:52 2 ONLINE 504040 2011-10-09 04:07:52 3 ONLINE 504040 2011-10-09 04:07:52 4 ONLINE 504040 2011-10-09 04:07:52 5 ONLINE 504040 2011-10-09 04:07:52 6 ONLINE 504040 2011-10-09 04:07:52 已选择6行。 SQL> select file#,checkpoint_change# from v$datafile; --查看控制文件中的scn号码 FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 504428 2 504428 3 504428 4 504428 5 504428 6 504428 已选择6行。 SQL> select file#,checkpoint_change# from v$datafile_header; --查看数据文件中的scn号码 FILE# CHECKPOINT_CHANGE# ---------- ------------------ 1 504040 2 504040 3 504040 4 504040 5 504040 6 504040 已选择6行。
恢复,由于备份的时候scn是504040,这里就是采用这个值来恢复。
SQL> recover database until change 504040; 完成介质恢复。 SQL> alter database open; alter database open * 第 1 行出现错误: ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项 SQL> alter database open resetlogs; 数据库已更改。 SQL> conn u1/u1 已连接。 SQL> select * from t; ID VALUE ---------- ---------- 1 a 2 b 3 c