部分控制文件损坏处理过程

Oracle · newbie_l · 于 9个月前发布 · 406 次阅读

1 处理思路说明

如果控制文件有多份,只确认其中一部份控制文件损坏,那么可以通过去掉损坏的控制文件, 采用可能没有损坏的控制文件来启动数据库,如果数据库启动成功,则可以通过拷贝好的控制文件来重新实现控制文件的多路复用。最后,修改对应的控制文件参数为调整后的参数即可。

特别说明:以下所有代码中的红色标示的部分请结合实际操作的数据库进行替换。

2 定位报错的控制文件

su - oracle

export ORACLE_DB_NAME=uatidm

export ORACLE_SID=uatidm1

cd $ORACLE_BASE/diag/rdbms/$ORACLE_DB_NAME/$ORACLE_SID/trace/

tail -5000 alert_$ ORACLE_SID.log|grep ORA-

可以看到类似以下信息:

ORA-00227: corrupt block detected in control file: (block 1, # blocks 1)

ORA-00202: control file: '+DATA/uatidm/controlfile/current.261.893526295'

ORA-00227: corrupt block detected in control file: (block 1, # blocks 1)

ORA-00202: control file: '+DATA/uatidm/controlfile/current.261.893526295'

ORA-00227: corrupt block detected in control file: (block 0, # blocks )

ORA-227 signalled during: ALTER DATABASE MOUNT /* db agent *//* {1:42527:362} */...

从红色标示的内容可以看到'+DATA/uatidm/controlfile/current.261.893526295'可能已损坏。

3 确认是否还存在其他控制文件

export ORACLE_DB_NAME=uatidm

export ORACLE_SID=uatidm1

sqlplus / as sysdba

startup nomount;

show parameter control_files

输出大致如下:

control_files string +DATA/uatidm/controlfile/current.261.893526295, +DATA/uatidm/controlfile/current.260.893526295

由上可知除了+DATA/uatidm/controlfile/current.261.893526295文件外,还存一个+DATA/uatidm/controlfile/current.260.893526295控制文件。

4 通过spfile创建pfile

export ORACLE_DB_NAME=uatidm

export ORACLE_SID=uatidm1

sqlplus / as sysdba

create pfile='/tmp/inituatidm1.ora.20160923' from spfile;

/tmp/inituatidm1.ora.20160923是pfile的文件名,建议格式为:init$ORACLE_SID.ora.yyyymmdd

这样方便辨识pfile属于哪个实例和创建的pfile的日期。

5 修改pfile的control_files参数

vi /tmp/inituatidm1.ora.20160923

将对应的参数*.control_files=修改为可能是好的控制文件。比如:

*.control_files='+DATA/uatidm/controlfile/current.260.893526295'

6 重启数据库,尝试mount数据库

shutdown immediate;

startup nomount pfile='/tmp/inituatidm1.ora.20160923';

alter database mount;

如果数据库能够正常mount,那么就说明指定的参数文件中的控制文件是没有损坏的。

7 尝试打开数据库

alter database open;

如果数据库能够正常open,那么就说明数据文件和日志文件都是好的。

8 关闭数据库,恢复控制文件的镜像

shutdown immediate;

exit

exit

su - grid

asmcmd

cd +DATA/$ORACLE_DB_NAME/controlfile/ <---$ORACLE_DB_NAME是需要操作的数据库名

复制第5步用于成功启动数据库的控制文件为control01.ctl和control02.ctl

cp +DATA/$ORACLE_DB_NAME/controlfile/current.260.893526295 +DATA/$ORACLE_DB_NAME/controlfile/control01.ctl

cp +DATA/$ORACLE_DB_NAME/controlfile/current.260.893526295 +DATA/$ORACLE_DB_NAME/controlfile/control02.ctl

9 修改参数文件,并重建spfile

vi /tmp/inituatidm1.ora.20160923

将对应的参数*.control_files=修改为第8步拷贝好的控制文件。比如:

*.control_files='+DATA/uatidm/controlfile/control01.ctl','+DATA/uatidm/controlfile/control02.ctl'

接着利用修改好的pfile重建spfile,然后重启数据库即可。

su - oracle

export ORACLE_DB_NAME=uatidm

export ORACLE_SID=uatidm1

sqlplus / as sysdba

startup nomount pfile='/tmp/inituatidm1.ora.20160923';

create SPFILE='+DATA/$ORACLE_DB_NAME/spfile$ORACLE_DB_NAME.ora' from pfile='/tmp/inituatidm1.ora.20160923';

shutdown immediate;

exit

10 启动数据库

srvctl start database -d $ORACLE_DB_NAME

本文由 newbie_l 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。


共收到 0 条回复
没有找到数据。
回复本帖 (需要登录)