分析DB2 for Linux,UNIX,and Windows中的锁等待情形
2009-12-12 14:59:14 来源:WEB开发网捕捉罕见的锁超时
有时候,锁等待情形会导致锁超时,而锁超时又会导致事务被回滚。锁等待导致锁超时所需的时间段由数据库配置参数 LOCKTIMEOUT 指定。锁超时分析最大的问题是,不知道下一次的锁超时何时发生。为了捕捉死锁,可以创建一个死锁事件监视器。每当出现死锁时,这个死锁事件监视器便写一个条目。但是,对于锁超时就没有类似的事件监视器。所以到 DB2 9® 为止,捕捉锁超时的惟一方法还是连续的 db2pd 或快照监视(对于 db2pd,和前面解释的一样,-file 和 -repeat 选项可用于连续的锁监视)。
DB2 9 包含了一种新的机制,用于在数据库出现故障或发生事件时收集监视器数据:db2cos 脚本。为了捕捉锁超时事件,可以配置数据库,使之每当出现锁超时时启动 db2cos 脚本。在 db2cos 脚本中,和前面讨论的一样,可以以相同的选项调用 db2pd。我们来看一个示例场景,该场景演示了如何用 db2cos 脚本捕捉锁超时。
对于这个场景,假设 DBA 将数据库锁超时值设为 10 秒:
清单 14. 更新锁超时设置
UPDATE DB CFG FOR SAMPLE USING LOCKTIMEOUT 10
为了每当出现锁超时时启动 db2cos 脚本,DBA 调用 db2pdcfg 实用程序,如下所示:
清单 15. 使用 db2pdcfg 配置 db2cos 脚本的调用
db2pdcfg -catch locktimeout count=1
-catch 选项指定应该自动导致调用 db2cos 脚本的故障或事件。对于锁超时事件,可以指定字符串 locktimeout。或者,可以指定与锁超时相应的 SQL 错误码和原因码:
清单 16. 用于捕捉锁超时的另一种 db2pdcfg 调用
db2pdcfg -catch 911,68 count=1
除了一些字符串值和 SQL 代码之外,db2pdcfg 还接受内部 DB2 错误码。所以,用这种方式可以捕捉很多数据库故障和事件。锁超时事件只是使用 db2pdcfg 和 db2cos 的一个例子。
如果 count 子选项的值为 1,则表明当出现锁超时事件时应该执行 db2cos 脚本。
db2pdcfg 通过以下输出确认错误捕捉的设置:
清单 17. db2pdcfg 对错误捕捉设置的确认
Error Catch #1
Sqlcode: 0
ReasonCode: 0
ZRC: -2146435004
ECF: 0
Component ID: 0
LockName: Not Set
LockType: Not Set
Current Count: 0
Max Count: 1
Bitmap: 0x4A1
Action: Error code catch flag enabled
Action: Execute sqllib/db2cos callout script
Action: Produce stack trace in db2diag.log
db2diag.log 报告中也包括错误捕捉设置。可以使用 db2diag 实用程序(用于检查 db2diag.log 内容的一个有用的实用程序)过滤 db2diag.log 文件,而不必在一个文本编辑器中打开它:
清单 18. 在 db2diag.log 中确认错误捕捉设置
db2diag -g funcname:=pdErrorCatch
2006-12-18-13.37.25.177000+060 I727480H285 LEVEL: Event
PID : 4648 TID : 3948 PROC : db2syscs.exe
INSTANCE: DB2 NODE : 000
FUNCTION: DB2 UDB, RAS/PD component, pdErrorCatch, probe:30
START : Error catch set for ZRC -2146435004
ZRC -2146435004 是用于锁超时的 DB2 内部错误码。可以通过下面的 db2diag 调用查看这些错误码:
清单 19. 使用 db2diag 查看 DB2 内部错误码的含义
db2diag -rc -2146435004
通过使用 db2pdcfg,数据库引擎现在被配置为每当出现锁超时时调用 db2cos 脚本。db2cos 脚本收集判别锁超时原因所需的所有监视器信息。为此,DBA 必须修改 db2cos 脚本,以便用已知的选项调用 db2pd。可以在下面的子目录中找到 db2cos 脚本:
Windows:DB2 install directoryBINdb2cos.bat,例如 C:Program FilesIBMSQLLIBBINdb2cos.bat
UNIX/Linux:Instance owner home/sqllib/bin/db2cos
在 Microsoft Windows® 上,默认的 db2cos.bat 脚本看上去如下所示:
清单 20. Windows 上默认 db2cos.bat 的内容
setlocal
:iterargs
if %0. == . goto iterdone
if /i %0. == INSTANCE. set INSTANCE=%1
if /i %0. == DATABASE. set DATABASE=%1
if /i %0. == TIMESTAMP. set TIMESTAMP=%1
if /i %0. == APPID. set APPID=%1
if /i %0. == PID. set PID=%1
if /i %0. == TID. set TID=%1
if /i %0. == DBPART. set DBPART=%1
if /i %0. == PROBE. set PROBE=%1
if /i %0. == FUNCTION. set FUNCTION=%1
if /i %0. == REASON. set REASON=%1
if /i %0. == DESCRIPTION. set DESCRIPTION=%1
if /i %0. == DiAGPATH. set DIAGPATH=%1
shift
goto iterargs
:iterdone
if %DATABASE%. == . goto no_database
db2pd -db %DATABASE% -inst >> %DIAGPATH%db2cos%PID%%TID%.%DBPART%
goto exit
:no_database
db2pd -inst >> %DIAGPATH%db2cos%PID%%TID%.%DBPART%
:exit
对于数据库级的事件或故障,默认的 db2cos 脚本用 -db 和 -inst 选项调用 db2pd。DBA 用一个 db2pd 调用替换相应的行,该调用收集锁超时分析所需的监视器数据:
清单 21. 更改 db2cos 脚本,以收集用于锁超时分析的数据
if %DATABASE%. == . goto no_database
db2pd -db %DATABASE% -locks wait -transactions -agents -applications -dynamic
>> %DIAGPATH%db2cos%PID%%TID%.%DBPART%
goto exit
更多精彩
赞助商链接