Oracle数据库的在线重做日志中包含了数据库中所有数据的操作记录,我们可以利用重做日志做很多的操作,例如日志挖掘。
有时候,因为种种原因,我们的在线日志被人误删除或者意外损坏掉,我们应该如何进行恢复呢,其实很简单,看下面内容:
我们通过删除在线日志模拟日志被误删除的情况:
[oracle@test orcl]$ rm redo*
[oracle@test orcl]$ ls -l redo*
ls: 无法访问redo*: 没有那个文件或目录
[oracle@test orcl]$ sqlplus / as sysdba
SQL> startup mount
ORACLE 例程已经启动。
。。。
数据库装载完毕。
因为我们只是缺失在线重做日志,所以数据库是可以启动到mount状态的,mount状态的数据库只会打开控制文件,并不会去校验每个数据文件的状态,校验动作会在open阶段进行。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结尾
进程 ID: 4607
会话 ID: 125 序列号: 5
打开数据库的话,会报错,并且数据库会强行关闭
下面我们使用resetlogs的方法尝试打开数据库:
SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
SQL> alter database open resetlogs;
数据库已更改。
resetlogs打开数据库必须在数据库不完全恢复之后才可以用,而且在不完全恢复后必须使用 RESETLOGS 或 NORESETLOGS 选项
除了这种方法以外,我们还可以通过清除logfile的方法进行打开数据库,如下:
首先将数据库启动到mount状态
查询v$log视图:
SQL> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ------------------- ------------ -------------------
1 1 1 134217728 5121 NO CURRENT 984719 2015-09-16 16:04:30 2.8147E+14
3 1 0 134217728 5121 YES UNUSED 0 0
2 1 0 134217728 5121 YES UNUSED 0 0
如果ARCHIVED栏位是YES的话,我们可以通过
alter database clear logfile 命令进行清除,如果是No的话,我们可以通过
alter database clear unarchived logfile 进行强行清除
SQL> alter database clear logfile group 2;
数据库已更改。
SQL> alter database clear logfile group 3;
数据库已更改。
SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
第 1 行出现错误:
ORA-01624: 日志 1 是紧急恢复实例 orcl (线程 1) 所必需的
ORA-00312: 联机日志 1 线程 1: '/app/oradata/orcl/redo01.log'
但是由于group 1是当前的在线日志,再加上之前我是使用的 shutdown abort进行关闭的数据库
数据文件状态不一致,需要使用当前日志进行实例恢复,所以无法通过清除日志命令进行清除
如果数据库文件状态一致,做到这里我们就可以通过 alter database open命令打开数据库了,但是如果碰到这样的不一致的情况,还需要通过 resetlogs打开数据库,如下:
SQL> recover database until cancel;
ORA-00279: 更改 984722 (在 09/16/2015 16:04:43 生成) 对于线程 1 是必需的
ORA-00289: 建议: /app/archivelog/orcl_1_1_890582670.dbf
ORA-00280: 更改 984722 (用于线程 1) 在序列 #1 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
AUTO
ORA-00308: cannot open archived log '/app/archivelog/orcl_1_1_890582670.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
ORA-00308: cannot open archived log '/app/archivelog/orcl_1_1_890582670.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/app/oradata/orcl/system01.dbf'
SQL> recover database until cancel
ORA-00279: 更改 984722 (在 09/16/2015 16:04:43 生成) 对于线程 1 是必需的
ORA-00289: 建议: /app/archivelog/orcl_1_1_890582670.dbf
ORA-00280: 更改 984722 (用于线程 1) 在序列 #1 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/app/oradata/orcl/system01.dbf'
ORA-01112: 未启动介质恢复
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01194: 文件 1 需要更多的恢复来保持一致性
ORA-01110: 数据文件 1: '/app/oradata/orcl/system01.dbf'