问题: DB2在使用过程中经常会遇到HANG死,本文旨在探讨如果整个库/DB2都HANG死的时候,应该收什么数据,如何处理,以便事后分析HANG住的原因。
一 数据收集
1.) 最简单的命令是db2fodc -hang,是比较推荐的做法,优点是它收集的信息比较全,缺点是用的时间比较长。命令如下,
db2fodc -hang full -member all
或者
db2fodc -hang basic -member all
两者区别如下
basic更多资料,请参考信息中心
2.)如果实在等不及,需要立即重启系统,则最少需要收集以下数据,优点是用时相对较少,缺点是收到的数据很可能不足。
db2pd -db SAMPLE -app -tran -edu -dynamic >> app.out
db2pd -stack all -repeat 30 3
db2pd -latch -repeat 30 3 >> latch.out
db2pd -everything >> db2pd.everythingout
db2 get snapshot for all applications >> app.snap.out
db2 get snapshot for db on SAMPLE >> db.snap
注意
A.将上面的SAMPLE换成您自己的数据库的名子。
B. 隔一段时间之后,比如5分钟,再收集一次上面的数据,这个是十分必要的。
C. "-repeat 30 3",这里的30 3指的是每隔30S收集一次,一共收集3次,如果节点数很多的话,可能需要较多的时间,这时候可以缩小间隔,比如每2s收集一次,收集2次: db2pd -stack all -repeat 2 2
如果是分区数据库,则需要所有节点都收集,在catalog节点上执行,同样,需要收集两次:
db2_all "db2pd -db SAMPLE -app -tran -edu -dynamic" >> app.out
db2_all "db2pd -stack all -repeat 30 3"
db2_all "db2pd -latch -repeat 30 3" >> latch.out
db2_all "db2pd -everything" >> db2pd.everythingout
db2 "GET SNAPSHOT FOR ALL APPLICATIONS GLOBAL" >> app.snap.out
db2_all "db2 get snapshot for db on SAMPLE" >> db.snap
其中,stack的数据会在db2dump目录下。
二 HANG的解决
1) 强制杀掉DB2进程
#su - db2_instance_name
$db2_kill
$ipclean
2) 验证没有DB2进程存在
#su - db2_instance_name
$ps –ef|grep db2
3) 启动DB2进程
#su - db2_instance_name
$db2start
4) 验证DB2数据库操作正常
#su - db2_instance_name
$db2 connect to db_name
$db2 “select * from syscat.bufferpools”
三 事后原因分析
无论是哪一种数据收集的方式,重启完要收集一个db2support,连同收集的其他数据一并上传到IBM的服务器上(需要先拨打IBM技术支持热线开一个PMR):
收集db2support的命令如下,收集完成之后,会在当前目录下生成一个db2support.zip文件:
db2support . -d sample -c -s -f (将sample替换成您的数据库的名子)
如果是分区数据库:请用下面的命令收集:
db2support . -d sample -c -s -f -member all (将sample替换成您的数据库的名子)):