环境 产品: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| 例如,如果要在一个锁超时错误发生时,调用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是一个很有用的工具,它给分析人员和用户提供了更加自主的空间,为灵活诊断问题带来了便利。 |
原帖由 wangzhonnew 于 2009-6-15 12:14 发表
v9.7里面可以随意抓db2diag.log得内容
比如db2diag.log里面有一行"hello world"得字样经常重复显示出来,如果用户想要知道发生hello world得时候db2正在干什么,就可以
db2pdcfg -catch diagstr="hello world"
这样下次 ...