非归档模式,无备份的情况下,手误把CURRENT日志组给删了,导致数据库起不来
这种情况该如何处理?
先来模拟一下环境
1.mount状态下查看日志状态,由下可知,group1为current状态,其他group为unused状态
scott@ORCL>select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES BLOCKSIZE MEMBERS ARC STATUS FIRST_CHANGE# FIRST_TIM NEXT_CHANGE# NEXT_TIME
---------- ---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------- ------------ ---------
1 1 1 52428800 512 1 NO CURRENT 1633158 02-JUL-19 2.8147E+14
2 1 0 52428800 512 1 YES UNUSED 0 0
3 1 0 52428800 512 1 YES UNUSED 0 0
4 1 0 8388608 512 1 YES UNUSED 0 0
2.查看日志组所在路径
scott@ORCL>col member for a50
scott@ORCL>select * from v$logfile;
GROUP# STATUS TYPE MEMBER IS_
---------- ------- ------- -------------------------------------------------- ---
1 ONLINE /opt/oracle/oradata/orcl/redo01.log NO
3 ONLINE /opt/oracle/oradata/orcl/redo03.log NO
2 ONLINE /opt/oracle/oradata/orcl/redo02.log NO
4 ONLINE /opt/oracle/oradata/orcl/redo04.log NO
scott@ORCL>
3.将current日志删除
[oracle@db01 ~]$ rm -rf /opt/oracle/oradata/orcl/redo01.log
4.查看当前数据库状态
此时进行日志切换,暂时好像没有什么问题发生,但继续切换,当current又转回到group1时,死机
此时解决办法如下:
4.1 如果数据库模式是archived,因当前日志损坏无法归档,数据库可能挂起但没有崩溃,可以尝试在数据库打开状态下强制清除。
alter database clear unarchived logfile group n;
这步若能成功,一定要做数据库全备。因为当前日志已经坏掉,归档日志内容无法保持连续性。如需介质恢复,使用这样的归档日志前滚可能会有问题。
4.2 如果clear unarchived不能成功,则shutdown数据库,准备去做传统的基于日志的不完全恢复
SQL> recover database until cancel;
SQL> alter database open resetlogs;
4.3 如果严重到使用resetlogs也不能打开数据库,可以试试下面最后一招:
修改pfile文件,第一行添加_allow_resetlogs_corruption=TRUE
我就是用这招搞定的,下面来看具体步骤
4.3.1 此时状态是打开数据库报错
sys@ORCL>alter database open;
alter database open
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 31815
Session ID: 1 Serial number: 5
4.3.2 解决办法:设置_allow_resetlogs_corruption参数方式打开数据库:
- 创建参数文件,通过spfile生成pfile
详情可参考:https://blog.csdn.net/weixin_42161670/article/details/93366375
sys@ORCL>create pfile from spfile;
File created.
- pfile文件添加参数如下
_allow_resetlogs_corruption=TRUE
[root@db01 ~]# cd $ORACLE_HOME/dbs
[root@db01 dbs]# ll
total 28
-rw-rw----. 1 oracle oinstall 1544 Jul 2 23:36 hc_orcl.dat
-rw-r--r--. 1 oracle oinstall 2851 May 15 2009 init.ora
-rw-r--r--. 1 oracle oinstall 948 Jul 2 23:24 initorcl.ora
-rw-r-----. 1 oracle oinstall 24 May 18 17:15 lkORCL
-rw-r-----. 1 oracle oinstall 1536 May 19 11:40 orapworcl
-rw-r-----. 1 oracle oinstall 2560 Jun 29 09:33 spfileorcl.ora
-rw-r-----. 1 oracle oinstall 2560 Jun 2 13:40 spfileorcl.ora.bk
[root@db01 dbs]#
[root@db01 dbs]# vi initorcl.ora
- resetlog起库,之前需要执行recover动作
Using username "root".
Authenticating with public key "rsa-key-20190527"
Last login: Tue Jul 2 23:12:45 2019 from 192.168.1.106
[root@db01 ~]# su - oracle
Last login: Tue Jul 2 23:12:50 CST 2019 on pts/0
[oracle@db01 ~]$
[oracle@db01 ~]$
[oracle@db01 ~]$
[oracle@db01 ~]$ sqls
SQL*Plus: Release 11.2.0.1.0 Production on Tue Jul 2 23:31:53 2019
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to an idle instance.
idle>
idle>
idle>
idle>
idle>startup pfile=/opt/oracle/product/11.2.0/dbhome_1/dbs/initorcl.ora mount;
ORACLE instance started.
Total System Global Area 409194496 bytes
Fixed Size 2213856 bytes
Variable Size 310380576 bytes
Database Buffers 92274688 bytes
Redo Buffers 4325376 bytes
Database mounted.
idle>
idle>
idle>
idle>
idle>alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1: // 没recover所以报错
ORA-01139: RESETLOGS option only valid after an incomplete database recovery
idle>
idle>recover database until cancel;
Media recovery complete.
idle>
idle>alter database open resetlogs;
Database altered.
idle>
idle>
idle>conn scott/tiger;
Connected.
scott@ORCL>
scott@ORCL>
reference: https://www.cnblogs.com/beanbee/archive/2012/10/31/2748735.html