WEB开发网
开发学院数据库DB2 分析DB2 for Linux,UNIX,and Windows中的锁等待... 阅读

分析DB2 for Linux,UNIX,and Windows中的锁等待情形

 2009-12-12 14:59:14 来源:WEB开发网   
核心提示:捕捉罕见的锁超时有时候,锁等待情形会导致锁超时,分析DB2 for Linux,UNIX,and Windows中的锁等待情形(3),而锁超时又会导致事务被回滚,锁等待导致锁超时所需的时间段由数据库配置参数 LOCKTIMEOUT 指定,默认的 db2cos 脚本用 -db 和 -inst 选项调用 db2pd,DBA

捕捉罕见的锁超时

有时候,锁等待情形会导致锁超时,而锁超时又会导致事务被回滚。锁等待导致锁超时所需的时间段由数据库配置参数 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

上一页  1 2 3 4  下一页

Tags:分析 DB for

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接