基于时间点的恢复主要使用于以下情况:误删除表、误截断表、提交了错误的数据。(从oracle 10g利用闪回更easy!)
首先关闭数据库执行一个冷全备份(冷备份的时候用户u1的t表中是有3条记录的。)
- 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 117443880 bytes
- Database Buffers 46137344 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 117443880 bytes
Database Buffers 46137344 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 62917928 bytes
- Database Buffers 100663296 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 62917928 bytes
Database Buffers 100663296 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是“500441 ”。还可以看见控制文件中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 500441 2011-10-09 02:12:08
- 2 ONLINE 500441 2011-10-09 02:12:08
- 3 ONLINE 500441 2011-10-09 02:12:08
- 4 ONLINE 500441 2011-10-09 02:12:08
- 5 ONLINE 500441 2011-10-09 02:12:08
- 6 ONLINE 500441 2011-10-09 02:12:08
- 已选择6行。
- SQL> select file#,checkpoint_change# from v$datafile; --查看控制文件中的scn号码
- FILE# CHECKPOINT_CHANGE#
- ---------- ------------------
- 1 500814
- 2 500814
- 3 500814
- 4 500814
- 5 500814
- 6 500814
- 已选择6行。
- SQL> select file#,checkpoint_change# from v$datafile_header; --查看数据文件中的scn号码
- FILE# CHECKPOINT_CHANGE#
- ---------- ------------------
- 1 500441
- 2 500441
- 3 500441
- 4 500441
- 5 500441
- 6 500441
- 已选择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 500441 2011-10-09 02:12:08
2 ONLINE 500441 2011-10-09 02:12:08
3 ONLINE 500441 2011-10-09 02:12:08
4 ONLINE 500441 2011-10-09 02:12:08
5 ONLINE 500441 2011-10-09 02:12:08
6 ONLINE 500441 2011-10-09 02:12:08
已选择6行。
SQL> select file#,checkpoint_change# from v$datafile; --查看控制文件中的scn号码
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 500814
2 500814
3 500814
4 500814
5 500814
6 500814
已选择6行。
SQL> select file#,checkpoint_change# from v$datafile_header; --查看数据文件中的scn号码
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 500441
2 500441
3 500441
4 500441
5 500441
6 500441
已选择6行。
恢复,由于备份的时间是“2011-10-09 02:12:08”,恢复时间我选在“2011-10-09 02:12:01”,提前了7秒。在实际生产环境中可以大致评估误操作的时间,多基于几个时间点来恢复多次,找到最合适的数据。
- SQL> recover database until time '2011-10-09 02:12:01';
- 完成介质恢复。
- 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