Oracle数据库的在线重做日志中包含了数据库中所有数据的操作记录,我们可以利用重做日志做很多的操作,例如日志挖掘。
有时候,因为种种原因,我们的在线日志被人误删除或者意外损坏掉,我们应该如何进行恢复呢,其实很简单,看下面内容:
我们通过删除在线日志模拟日志被误删除的情况:
1
2
3
4
5
6
7
8
[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阶段进行。
1
2
3
4
5
6
7
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-03113: 通信通道的文件结尾
进程 ID: 4607
会话 ID: 125 序列号: 5
打开数据库的话,会报错,并且数据库会强行关闭
下面我们使用resetlogs的方法尝试打开数据库:
1
2
3
4
5
6
7
8
9
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视图:
1
2
3
4
5
6
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的话,我们可以通过
1
2
3
4
5
6
7
8
9
10
11
12
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打开数据库,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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打开数据库也是不可能的,那么我们只能通过应用隐含参数,通过隐含参数使状态不一致的数据库打开,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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进行启动的,所以还要完成最后一步,重启数据库即可
好了,数据库打开了,但是因为我们的数据库从异常情况下恢复过来,可能是会有问题的,所以建议做好备份,以防数据丢失。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com