当用户执行不完全恢复时,如果能够确定恢复点所对应的SCN值,那么可以使用这种方法恢复!
首先关闭数据库执行一个冷全备份
- SQL> conn /as sysdba
- 已连接。
- SQL> shutdown immediate
- 数据库已经关闭。
- 已经卸载数据库。
- ORACLE 例程已经关闭。
- SQL> ! cp /u01/app/oracle/oradata/orcl/*.dbf /u01/app/oracle/backup/
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;
- 未选定行
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/
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行。
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