Oracle数据库的在线重做日志中包含了数据库中所有数据的操作记录,我们可以利用重做日志做很多的操作,例如日志挖掘。
有时候,因为种种原因,我们的在线日志被人误删除或者意外损坏掉,我们应该如何进行恢复呢,其实很简单,看下面内容:
我们通过删除在线日志模拟日志被误删除的情况:
[oracle@test orcl]$ rm redo*[oracle@test orcl]$ ls -l redo*ls: 无法访问redo*: 没有那个文件或目录[oracle@test orcl]$ sqlplus / as sysdbaSQL> startup mountORACLE 例程已经启动。。。。数据库装载完毕。
因为我们只是缺失在线重做日志,所以数据库是可以启动到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.dbfORA-00280: 更改 984722 (用于线程 1) 在序列 #1 中指定日志: {=suggested | filename | AUTO | CANCEL}AUTOORA-00308: cannot open archived log '/app/archivelog/orcl_1_1_890582670.dbf'ORA-27037: unable to obtain file statusLinux-x86_64 Error: 2: No such file or directoryAdditional information: 3ORA-00308: cannot open archived log '/app/archivelog/orcl_1_1_890582670.dbf'ORA-27037: unable to obtain file statusLinux-x86_64 Error: 2: No such file or directoryAdditional information: 3ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error belowORA-01194: file 1 needs more recovery to be consistentORA-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.dbfORA-00280: 更改 984722 (用于线程 1) 在序列 #1 中指定日志: { =suggested | filename | AUTO | CANCEL}CANCELORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error belowORA-01194: file 1 needs more recovery to be consistentORA-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=TRUEecho "*._allow_resetlogs_corruption=TRUE">>p2.ora然后通过我们新建的pfile打开数据库到mount状态:SQL> startup mount pfile='/home/oracle/p2.ora'ORACLE 例程已经启动。Total System Global Area 334036992 bytesFixed Size 2253024 bytesVariable Size 171970336 bytesDatabase Buffers 155189248 bytesRedo Buffers 4624384 bytes数据库装载完毕。然后通过 resetlogs的方法打开数据库SQL> alter database open resetlogs;数据库已更改。
因为我们是用我们临时生成的pfile进行启动的,所以还要完成最后一步,重启数据库即可
好了,数据库打开了,但是因为我们的数据库从异常情况下恢复过来,可能是会有问题的,所以建议做好备份,以防数据丢失。