Oracle数据库的在线重做日志中包含了数据库中所有数据的操作记录,我们可以利用重做日志做很多的操作,例如日志挖掘。
有时候,因为种种原因,我们的在线日志被人误删除或者意外损坏掉,我们应该如何进行恢复呢,其实很简单,看下面内容:
我们通过删除在线日志模拟日志被误删除的情况:
[[email protected] orcl]$ rm redo* [[email protected] orcl]$ ls -l redo* ls: 无法访问redo*: 没有那个文件或目录 [[email protected] 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‘
但是我们发现,不完全恢复是失败的,这个时候通过 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进行启动的,所以还要完成最后一步,重启数据库即可
好了,数据库打开了,但是因为我们的数据库从异常情况下恢复过来,可能是会有问题的,所以建议做好备份,以防数据丢失。