互联网服务数据库

灵活使用db2cos功能

环境

产品:DB2
版本:v8.2,9.1/9.5
平台:UNIX/Linux平台

问题

在DB2 UDB 8.2发布之后,一个很有价值的工具被加入了DB2中,它就是db2pd。在监控数据库,或者进行问题诊断的时候,由于db2pd可以直接从DB2的内存中读取信息,所以它比起snapshot来说开销更小,速度也更快。它可以收集DB2信息包括:锁,缓冲池,内存,事务等等。在问题诊断的时候,我们可以利用db2pd中的一个很有特点的功能,帮助我们在第一时间内收集重要的诊断数据。这个功能就是callout script/db2cos。
本文将介绍如何利用这一有用的功能在UNIX/Linux平台上收集数据,和如何简单的定制db2cos脚本。

解答

1. db2pd/db2pdcfg -catch和db2cos介绍
在DB2 v8.2/9.1和9.5中,我们可以使用db2pd -catch命令(在DB2 9.1和9.5中的等价命令为db2pdcfg -catch),捕捉指定的SQL code/ZRC/ECF等错误代码,并且收集数据。命令的格式为:

db2pd -catch [clear|status|] [] [count=]
例如,如果要在一个锁超时错误发生时,调用db2cos脚本:

db2pd -catch locktimeout db2cos
在DB2实例中的$HOME/sqllib目录下有一个名为db2cos的脚本,这个路径是db2cos存放的缺省路径。执行了上面的命令之后,当锁超时发生时,这个db2cos脚本就会被执行。缺省的db2cos脚本会把一些重要的信息输出到一个外部文本文件中。
2. db2cos脚本介绍

DB2安装后自带的缺省db2cos脚本有着简单的流程。DB2调用它的时候会同时传递给它一些参数。db2cos脚本通过这些参数得知调用自己的实例,进程,时间点和函数等等信息。还有一个传入的参数叫做typeReason,它告诉db2cos被调用的原因是什么,例如数据损坏(DATA_COR),锁超时(LOCKTIMEOUT),死锁(DEADLOCK)或者其他错误代码(SQLCODE)。
常见的传入参数有下面几个:
# instance : instance name
# database : database name
# dbpart : database partition number
# pid : process ID
# tid : thread ID
# function : function name of function that called the panic script
# component : component of the function
# probe : probe point
# timestamp : timestamp of when the script was called
# appid : application ID
# apphld : application handle
db2cos会遍历上面的参数,记录下他们的值,然后根据typeReason参数的定义,执行对应的动作。每次db2cos被调用,db2diag.log中都会有相应的记录。例如:

3. 用db2cos分析锁超时

使用默认的db2cos脚本就可以方便的分析锁超时问题。首先赋予db2cos脚本执行权限:

chmod u+x $HOME/sqllib/db2cos

然后使用db2pd -catch命令打开捕获开关。这个命令会告诉DB2在发生锁超时(lock timeout)的时候执行脚本db2cos。

db2pd -catch locktimeout
于是,这个缺省的db2cos脚本会在锁超时发生后,生成一个名为db2cos.rpt的文件在$HOME/sqllib/db2dump/下,其中的信息会对分析锁超时很有帮助。
4. db2cos和db2 trace一起使用

使用db2cos配合db2的trace命令,可以有效捕捉那些没有出现规律的问题。

在实际工作中,有些问题并不是有规律的发生。它们并不能被轻易的重现。当它们再次发生的时候,如何收集到尽量完整的诊断数据,有时会困扰分析人员。db2 trace是一个强有力的跟踪工具,db2trc -l命令以循环的方式收集DB2 trace信息,它在缓存中只保留最新的trace信息。
简单的修改缺省的db2cos脚本,就可以让db2pd -catch配合db2trc -l使得问题发生时的关键跟踪数据被及时的保存起来。请看下面的示例。
如果有一个SQL30082的错误无规律的发生,我们需要分析当时到底发生了什么。首先修改缺省的db2cos脚本,在"SQLCODE"段后面增加两行保存和关闭trace的命令:
"SQLCODE")
db2trc dmp /tmp/db2trc.dmp
db2trc off
... ...
然后打开捕获SQL30082错误的开关,同时打开trace,等待问题发生。

db2pd -catch -30082
db2trc on -l 64M
当问题发生后,db2trc.dmp文件会被立即生成在/tmp/目录下面,同时db2trc off命令将trace关闭。这保证了在db2trc的缓存中保留的诊断数据可以在第一时间内被保存下来,而不会被后续的信息所覆盖。
5. 定制和改进db2cos脚本

有些问题,我们可能需要捕捉不只一次数据,例如锁超时和死锁。db2pd -catch有一个参数count可以控制db2cos最多被调用几次。例如,如何我们需要连续捕捉十次锁超时:

db2pd -catch locktimeout count=10
缺省的db2cos脚本会将所有信息写入到同一个db2cos.rpt文件中,不方便分析。我们可以为每一次锁超时指定不同的文件名。在db2cos脚本的开头,定义输出文件名:

COSOUT=$HOME/sqllib/db2dump/db2cos.rpt.`date +%Y%m%d.%H%M%S`
然后将"LOCKTIMEOUT")下面的每个输出文件名指向这个文件:
echo "Lock Timeout Caught" > $COSOUT
date >> $COSOUT
echo "Instance " $instance >> $COSOUT
... ...
每次生成的文件会形如 db2cos.rpt.20080314.172409。
6. DB2 9.5中,db2cos的缺省路径更改为$HOME/sqllib/adm/,如果这里找不到,那么$HOME/sqllib/bin/目录下面的db2cos会被执行。
db2cos是一个很有用的工具,它给分析人员和用户提供了更加自主的空间,为灵活诊断问题带来了便利。
参与4

3同行回答

wangzhonnewwangzhonnew软件工程师IBM Canada Ltd.
v9.7里面可以随意抓db2diag.log得内容比如db2diag.log里面有一行"hello world"得字样经常重复显示出来,如果用户想要知道发生hello world得时候db2正在干什么,就可以db2pdcfg -catch diagstr="hello world"这样下次db2在向db2diag.log里面写hello world字样之前,如果监测到...显示全部
v9.7里面可以随意抓db2diag.log得内容
比如db2diag.log里面有一行"hello world"得字样经常重复显示出来,如果用户想要知道发生hello world得时候db2正在干什么,就可以
db2pdcfg -catch diagstr="hello world"

这样下次db2在向db2diag.log里面写hello world字样之前,如果监测到要写的内容包含hello world,就会首先调用db2cos,db2cos调用完成后继续写hello world:lol

v95 fp5里面也会添加这个功能收起
IT分销/经销 · 2009-06-15
浏览855
leo_wynleo_wyn商业智能工程师Security
原帖由 wangzhonnew 于 2009-6-15 12:14 发表 v9.7里面可以随意抓db2diag.log得内容比如db2diag.log里面有一行"hello world"得字样经常重复显示出来,如果用户想要知道发生hello world得时候db2正在干什么,就可以db2pdcfg -catch diagstr="hello world"这样下次 ... 这个...显示全部
原帖由 wangzhonnew 于 2009-6-15 12:14 发表


v9.7里面可以随意抓db2diag.log得内容
比如db2diag.log里面有一行"hello world"得字样经常重复显示出来,如果用户想要知道发生hello world得时候db2正在干什么,就可以
db2pdcfg -catch diagstr="hello world"

这样下次 ...

这个方法很不错!:lol收起
系统集成 · 2009-06-15
浏览783
leo_wynleo_wyn商业智能工程师Security
不错!:)显示全部
不错!:)收起
系统集成 · 2009-06-15
浏览797

提问者

WUJJ0828
系统架构师华际信息系统有限公司
擅长领域: 数据库服务器AIX

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2009-06-12
  • 关注会员:0 人
  • 问题浏览:4329
  • 最近回答:2009-06-15
  • X社区推广