基于时间点的恢复主要使用于以下情况:误删除表、误截断表、提交了错误的数据。(从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/
打开数据库,可以看见用户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; 未选定行
现在用户发现错误的删除了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/
查看如下视图,可以看见需要恢复的数据文件,备份时间是“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行。
恢复,由于备份的时间是“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