oracle ASM实例ORA-04031故障处理

来源:互联网 发布:全知科技张超微博 编辑:程序博客网 时间:2024/05/16 11:03

         数据库服务器为两台AIX小型机配置的211gR2 RAC数据库。故障发生后,业务应用无法连接数据库故障,数据库整体故障,而非某一节点故障导致。

         首先,通过cts_stat -t查看集群资源,发现两个节点的实例状态是offline,其他集群资源正常。随即登陆node2数据库,发现数据库实例的状态为“start”no mount状态,尝试open数据库,无法open

         第二步,查看oracle数据库的alert日志,提示

       “ORA-19504: failed to create file "+ARCLOG"

        ORA-17502:ksfdcre:4 Failed to create file +ARCLOG

        ORA-15041:diskgroup "ARCLOG" space exhausted”,归档日志创建失败。

        随即登陆asmcmd管理工具使用lsdg查看磁盘组存储空间,发现只剩余不到4GB的容量了,在征求用户同意后,将该 ASM上的历史归档日志进行手工删除,以释放空间。

使用rm -rf 删除命令后提示“ORA-04031:unable to allocate 3896 bytes of shared memory ("sharedpool","unknown object","sgaheap(1,0)","kglsim object batch")”导致无法删除历史归档日志回收空间。

       第三步,查看grid数据库的alert日志,得到的提示如上。asm实例是用于管理数据库的数据库文件等物理文件系统资源。那么可以定位问题在于数据库asm实例无法分配空间至shared pool导致了oracle数据库实例获取数据文件、日志文件等信息从 而导致实例崩溃。

      第四步,登陆asm实例通过“show parameter mem”查看asm实例的内存分配情况,默认情况下asm实例是采用的amm内存管理方 式。当前实例仅分配了340M内存,根据Oracle的推荐,在11g中使用MEMORY_TARGET参数的话, MEMORY_TARGET至少应该分 256M以上,而且随着DISK GROUP的容量的增长,SHARED_POOL所需要的空间也随着增加。因此对于磁盘组空间比较大的ASM 例而言,采用默认参数作为MEMORY_TARGET是不够的。只需要简单的调整ASM实例的MEMORY_TARGET参数,将其扩大到500M以上,就可以避免该错误。

      第五步,调整asm实例的内存配置,在两个节点的asm实例均执行。

      SQL> altersystem set memory_max_target=500M SCOPE=spfile; 

      SQL> altersystem set memory_target=500M scope=spfile;   

       配置完成后需要进行重启实例生效,但是该ASM实例无法正常管理,仍然提示无法分配共享池错误。

       最后只能在root用户下通过crsctl stop has -f强制停止集群资源命令停止来完成ASM实例的关闭。

       第六步,启动集群资源

       使用crs_stat -all命令

       启动后,两个asm实例以及oracle实例均正常启动,业务也恢复正常。
       最后再次进行手工删除历史归档日志,保障数据库归档空间配额。
       
总结:

       本次故障咋一看现象是因为归档日志空间已满,数据库hang住,导致业务应用中断,但是通过查看asm实例的alert_ +ASM1.log日志发现问题是由于asm实例内存资源无法分配,数据库实例无法获取asm文件系统资源最终导致数据库实例挂掉。最 后手工修改asm实例后发现asm实例无法正常重启,只能通过crsctl stop has-f强制关闭。

     在处理故障的时候应当结合多方面日志进行分析,不能仅根据部分日志就盲目去操作。

1 0
原创粉丝点击