资讯专栏INFORMATION COLUMN

双节点RAC实例2 HANG 故障分析一例

IT那活儿 / 1390人阅读
双节点RAC实例2 HANG 故障分析一例

一、环境:

操作系统为:AIX 5.3

数据库版本:Oracle 10.2.0.5


二、第一现场:

1.主机能够登入,系统负载很低

2.数据库实例2登录不进去,实例1能正常提供服务

3.业务不受到影响



三、故障处理:


1、基本状态查看

首先查看下主机情况:

$ uptime

 06:06PM  up 232 days,  19:31,  6 users, load average: 6.15, 6.71, 6.69

 节点2已经运行232天,平均负载6点多,相对比较轻,最近时刻的负载也没有超过7,因此主机状态基本正常。接下来查看是否有大量换页出现:


$ vmstat 3 10

 

System configuration: lcpu=16mem=79360MB

 

kthr   memory              page              faults        cpu   

----- ----------------------------------- ------------ -----------

 r b   avm   fre re  pi  po fr   sr  cy in   sy  cs us sy id wa

 6  04932557 13865294   0   0   0   0   0   0 246 273723 268060 17 1172  0

 5  04932540 13865311   0   0   0   0   0   0 279 265072 263893 17 1172  0

 5  04932503 13865349   0   0   0   0   0   0 311 265326 264567 17 1172  0

 5  04932511 13865340   0   0   0   0   0   0 597 340525 264203 18 1270  0

 8  04932523 13865328   0   0   0   0   0   0 327 265519 260997 17 1172  0

…….



我们同样发现,CPU内存都相对空闲,没有换页发生。

$ ps -ef|grep ora|wc -l

 

    367


数据库进程300多,对于16CPU,80G内存的主机系统来说,一切似乎都很正常。

 

 

 

2、信息搜集

鉴于常规的数据库登录手段无法进入实例2,无法得知数据库状态,因此采用Oracle10g开始提供的“后门“,进入数据库进行信息搜集:

$ sqlplus -prelim / as sysdba

 

SQL*Plus: Release 10.2.0.5.0 -Production on Thu Jun 14 18:01:13 2012

 

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

 

SQL>

SQL> oradebug hanganalyze 3

Hang Analysis in /oracle/admin/bxxx/udump/bxxx2_ora_1011948.trc

SQL> oradebug setmypid

Statement processed.

SQL> oradebug dump systemstate 266

Statement processed.

SQL> set time on

18:02:57 SQL> set timing on

18:03:01 SQL>  oradebug dump systemstate 266

Statement processed.

18:04:13 SQL> oradebug hanganalyze5

Hang Analysis in /oracle/admin/bxxx/udump/bxxx2_ora_1011948.trc

18:04:24 SQL>

18:04:51 SQL>  oradebug dump systemstate 266

Statement processed.

18:07:12 SQL> exit

Disconnected from ORACLE


由于其余数据库实例正常,因此信息搜集我们仅限于本实例,以免影响到其他实例的正常运行。



3、实例重启
信息搜集完毕,在征得应用部门及DBA确认后,重新启动实例2。

先强制关闭:

$ sqlplus -prelim / as sysdba

 

SQL*Plus: Release 10.2.0.5.0 - Productionon Thu Jun 14 18:10:11 2012

 

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

 

SQL> shutdown abort

ORACLE instance shut down.

SQL> exit

Disconnected from ORACLE

 

再正常启动:

$ sqlplus / as sysdba

 

SQL*Plus: Release 10.2.0.5.0 - Productionon Thu Jun 14 18:10:34 2012

 

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

 

Connected to an idle instance.

 

SQL> startup

ORACLE instance started.

 

Total System Global Area 1610612736bytes

Fixed Size                  2096736 bytes

Variable Size            1308623264 bytes

Database Buffers          285212672 bytes

Redo Buffers               14680064 bytes

Database mounted.

Database opened.

实例重启后,所有应用能正常连接到实例2。

接下来进行原因的深入分析,以防同样的故障再次出现。

4、故障分析

 

首先我们来看hanganalyze的信息输出:

*** 2012-06-14 18:01:25.716

==============

HANG ANALYSIS:

==============

Found 177 objects waitingfor

<1/1014/60449/0x6fbfedb8/925832/SGA:allocation forcing componen>

Found 33 objects waiting for

<1/1093/1/0x6fbe9868/295728/NoWait>

Open chains found:

Chain 1 : :

<1/1093/1/0x6fbe9868/295728/NoWait>

 -- <1/1014/60449/0x6fbfedb8/925832/SGA:allocation forcing componen>

 -- <1/674/1309/0x6fc258d8/689108/librarycache load lock>

本次的故障原因从这个输出就一目了然,Oracle进行内部内存自动分配时,迟迟没有结束,导致177个对象等待着新的内存空间。

进一步的从systemdump输出:

 

…….
waiting for SGA: allocation forcing component growthwait_time=0, seconds since wait started=3
….

SO: 700000050f2a528, type: 50, owner:70000006d500910, flag: INIT/-/-/0x00

     row cache enqueue: count=1 session=70000006d45d6e0object=700000058c461b8, mode=S

     savepoint=0x7a5dd06

     row cache parent object: address=700000058c461b8cid=8(dc_objects)

     hash=875b7c55 typ=11 transaction=0 flags=00008000

     own=700000058c46288[700000050f2a558,700000050f2a558]

……

可以看出,由于Oracle在进行内存分配时,将一些对象从内存中踢出去了,新的SQL解析时,需要装载新的对象,然而没有可用内存空间,因此数据库实例hang住。

 

 

根据以往经验,发生这种等待,通常是采用了Oracle的ASMM(自动共享内存管理),即SGA自动管理引起。

从实例2的告警日志alert_bxxx2.log,我们发现:

Thu Jun 14 18:10:38 BEIST 2012

Starting ORACLE instance (normal)

sskgpgetexecname failed to get name

LICENSE_MAX_SESSION = 0

LICENSE_SESSIONS_WARNING = 0

Interface type 1 en1 172.16.1.0configured from OCR for use as a cluster interconnect

Interface type 1 en8 10.153.246.128configured from OCR for use as  a publicinterface

Picked latch-free SCN scheme 3

Using LOG_ARCHIVE_DEST_1 parameterdefault value as /oracle/product/10.2.0/db/dbs/arch

LICENSE_MAX_USERS = 0

SYS auditing is disabled

ksdpec: called for event 13740 priorto event group initialization

Starting up ORACLE RDBMS Version:10.2.0.5.0.

System parameters with non-defaultvalues:

 processes                = 1000

…….

 nls_territory            = CHINA

  sga_target               = 1610612736

 control_files            =/oradata1/control01.ctl, /oradata2/control02.ctl, /oradata3/control03.ctl

 db_block_size            = 8192

 __db_cache_size          =285212672

 compatible               =10.2.0.5.0

 db_files                 = 2000

 db_file_multiblock_read_count= 16

 cluster_database         = TRUE

 cluster_database_instances= 2

 thread                   = 2

…….

db_name                  = bxxx

 open_cursors             = 300

 pga_aggregate_target     =8311013376

 

确实采用了SGA自动管理(sga_target不为0)。

且总共80G的物理内存,只分配给Oracle SGA 2G不到,而本机唯一的任务就是确保Oracle系统正常。

5故障分析建议

 

结合本次故障发生的原因及新炬在移动行业维护经验,我们给出如下三点配置修改建议:

1.将SGA管理改为手动。

2.数据库会话在400个左右事,将SGA从2G增加到40G,其中:

shared_pool_size=1G

db_cache_size=35G

SGA_MAX_SIZE=40G

SGA_TARGET=0

3.关闭DRM特性:

_gc_affinity_time=0                                  # Only if DBversion is 10.1 or 10.2

_gc_undo_affinity=FALSE                       # Only if Db version is10.2

 

注:上述建议都需要停止数据库,因此需安排计划性停机。

 

同时,我们开发了数据库实例hang住时的自动采集脚本,供数据库发生hang住的情况下,快速搜集相关信息(存成文件放到Oracle用户下的目录即可):

#

#auto_hang_analyze.sh

#created by shsnc @20120614

#

#any question please sendemailto:master@shsnc.com

#

#!/usr/bin/ksh

 

. ~/.profile

 

#自动终止上次运行的进程

 

for line in `ps -ef|grepauto_hang_analyze.sh|grep -v grep|awk {print $2}`

 

do

 

      for line1 in `ps -ef|grep $line|grep sqlplus|awk {print $2}`

 

      do

 

         for line2 in `ps -ef|grep $line1|grepLOCAL=YES|awk {print $2}`

 

         do

 

           echo $line2

 

           kill -9 $line2

 

         done

 

      done

 

done

 

 

 

count=`ps -ef |grep $0 |grep -v grep|wc -l`

 

if [[ count -gt 2 ]]; then

 

       echo $0 already running!

 

       exit

 

fi

 

echo `date`

 

# 判断是否需要进行自动执行hang analyze

 

sqlplus -prelim  / as sysdba <

 

set feedback off

 

set termout off;

 

ttitle off;

 

btitle off;

 

set heading off

 

set timing off;

 

set verify off;

 

set echo off;

 

spool session_event_cnt.out

 

select get_event_cnt from dual;

 

spool off;

 

exit

 

EOF

 

event_cnt=`grep -v SQLsession_event_cnt.out|awk {print $1}`

 

if [[ event_cnt -lt 30 ]]; then

 

       echo no need hang analyze!

 

       exit

 

fi

 

#进行hang analyze

 

 

 

sqlplus -prelim / as sysdba<

 

set feedback off

 

set termout off;

 

ttitle off;

 

btitle off;

 

set heading off

 

set timing off;

 

set verify off;

 

set echo off;

 

spool hang_analyze.out

 

oradebug setmypid

 

oradebug unlimit;

 

oradebug hanganalyze 3;

oradebug dump systemstate  1;

 

 

 

spool off;

 

exit

 

EOF

 

#取hang analyze 文件名

 

hanganalyze_file=`grep -i -E HangAnalysis hang_analyze.out|awk {print $4}`

 

if test -z "$hanganalyze_file";then

 

 exit

 

fi

 

echo $hanganalyze_file

 

#生成自动kill脚本

 

awk{if(index($0,"Found")>0) {printf"%s ",$0} else {print$0}} $hanganalyze_file|grep Found|awk {if($2>20) {{split($7,A,"/")}{ print "ps -ef|grep "A[5]"|grepLOCAL=NO|awk 47{print "

 

-9 "$2}47|xargs kill"}}}>kill_hang_process.sh

 

 

 

#执行自动终止脚本并备份脚本

 

if [ `cat kill_hang_process.sh|wc -l`-gt 0 ]

 

then

 

sh kill_hang_process.sh

 

echo $hanganalyze_file>>kill_hang_process.sh

 

cp kill_hang_process.sh ./ak_log/kill_hang_process.sh.`date+%b_%d_%H_%M_%S`

 

fi

 

echo `date`



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/130246.html

相关文章

  • DBASK问答集萃第三期

    摘要:问答集萃接下来,我们分享本期整理出的问题和诊断总结,供大家参考学习,详细的诊断分析过程可以通过标题链接跳转到小程序中查看。诊断结论请先尝试收集系统数据字典统计信息。诊断结论一般后会出现这种情况,但是不会出现几百个的情况。 引言近期我们在DBASK小程序增加了众多专栏,其中包括盖国强、杨廷琨、罗海雄、张乐奕、黄廷忠、崔华、熊军、李真旭、何剑敏等专家栏目,还有2019年6月SCN兼容性问题...

    leap_frog 评论0 收藏0
  • 一个数据库存储架构的独白

    摘要:目前担任的分布式存储负责人。产品架构图图一产品架构图基于之上,是一个分布式存储,为提供坚实的底座。一数据组织形式会为每一个数据库分配一段存储空间,我们称之为,一个数据库对应一个。 本文由云+社区发表本文作者:许中清,腾讯云自研数据库CynosDB的分布式存储CynosStore负责人。从事数据库内核开发、数据库产品架构和规划。曾就职于华为,2015年加入腾讯,参与过TBase(PGXZ...

    ad6623 评论0 收藏0
  • 一个数据库存储架构的独白

    摘要:目前担任的分布式存储负责人。产品架构图图一产品架构图基于之上,是一个分布式存储,为提供坚实的底座。一数据组织形式会为每一个数据库分配一段存储空间,我们称之为,一个数据库对应一个。 本文由云+社区发表本文作者:许中清,腾讯云自研数据库CynosDB的分布式存储CynosStore负责人。从事数据库内核开发、数据库产品架构和规划。曾就职于华为,2015年加入腾讯,参与过TBase(PGXZ...

    int64 评论0 收藏0
  • ORACLE19C IPV4+IPV6栈配置实验

    点击上方IT那活儿公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!!一背景为了满足海量地址分配需求,IPV6替代IPV4已成为必然。新部署的ORACLE数据库已经直接使用IPV6,已部署的ORACLE数据库也正在更改IPV4使用IPV6。数据库更改IPV4使用IPV6还涉及主机和客户端网络更改,如果同时实施所有网络更改,客户端多且网络比较复杂的环境,业务停机时间会很长从而影响业务正常使用...

    社区管理员 评论0 收藏0
  • 如何设计和实现高可用的MySQL

    摘要:目前腾讯云可以做到,全年在分钟的样子。腾讯云是自己实现了一套故障检测,结构如右边的图,由高可用保证的节点来进行故障检测与切换。另外,目前我们还在做高可用的重构,届时能够做到故障检测恢复秒钟以内,大大提高了高可用。 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 王甲坤,腾讯高级工程师、腾讯云关系型数据库MySQL负...

    Cristalven 评论0 收藏0
  • 如何设计和实现高可用的MySQL

    摘要:目前腾讯云可以做到,全年在分钟的样子。腾讯云是自己实现了一套故障检测,结构如右边的图,由高可用保证的节点来进行故障检测与切换。另外,目前我们还在做高可用的重构,届时能够做到故障检测恢复秒钟以内,大大提高了高可用。 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库 TencentDB发表于云+社区专栏 王甲坤,腾讯高级工程师、腾讯云关系型数据库MySQL负...

    lbool 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<