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 中
指定日志: {=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 中
指定日志: {=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'
但是我们发现,不完全恢复是失败的,这个时候通过 resetlogs打开数据库也是不可能的,那么我们只能通过应用隐含参数,通过隐含参数使状态不一致的数据库打开,如下:
SQL> create pfile='/home/oracle/p2.ora' from spfile;
在pfile里面增加*._allow_resetlogs_corruption=TRUE
echo "*._allow_resetlogs_corruption=TRUE">>p2.ora
然后通过我们新建的pfile打开数据库到mount状态:
SQL> startup mount pfile='/home/oracle/p2.ora'
ORACLE 例程已经启动。
Total System Global Area 334036992 bytes
Fixed Size 2253024 bytes
Variable Size 171970336 bytes
Database Buffers 155189248 bytes
Redo Buffers 4624384 bytes
数据库装载完毕。
然后通过 resetlogs的方法打开数据库
SQL> alter database open resetlogs;
数据库已更改。
因为我们是用我们临时生成的pfile进行启动的,所以还要完成最后一步,重启数据库即可
好了,数据库打开了,但是因为我们的数据库从异常情况下恢复过来,可能是会有问题的,所以建议做好备份,以防数据丢失。
: