在 DB29.5数据库中,分析锁定超时的方法得到了相当大的改进,锁定超时分析也变得十分简单。本文探索这些全新的锁定超时报告功能,并检查收集的附加信息以确定发生锁定超时的原因。
在 DB29.5中,分析锁定超时的方法得到了极大改进,锁定超时分析变得更加简单。本文主要是探索这些全新的锁定超时报告功能,并检查收集的附加信息以确定发生锁定超时的具体原因。
回顾DB2 9.1中的锁定超时分析
使用DB2pd工具和db2cos脚本进行锁定超时分析的方法包含以下几步:
1.使用一个特殊的DB2脚本 — 名为 db2cos — 在每次调用db2cos脚本时执行一个db2pd调用。db2pd 调用收集与锁定、事务、应用程序、语句缓存相关的信息,并将信息存储在一个文本文件中以供分析。
2.要在锁定超时发生时自动执行 db2cos 脚本(以及包含的 db2pd 命令,需要使用 db2pdcfg 命令注册锁定超时事件。
3.在锁定超时事件中,DBA 可以检查通过自动调用 db2cos 脚本生成的 db2pd 输出。这使 DBA 能够确定发生锁定争用的原因,从而设法在以后避免发生这类情形。
尽管其中介绍的方法提供了大量信息,使得锁定超时分析比以前的 DB2 9 for Linux, Unix, and Windows 版本更加简单,但它仍然存在一些不足:
◆使用此方法需要手动改写 db2cos 脚本并通过调用 db2pdcfg 来注册锁定超时事件。两个步骤都不复杂,但是对于新手来说可能有些困难。
◆解释 db2pd 输出以识别锁定超时情形中涉及的应用程序和 SQL 语句,这个任务并不容易,而且需要一些尝试。
◆如果锁定超时是由包含多个 SQL 命令的事务引起的,那么 db2pd 收集的信息可能还不足以确定导致锁定的 SQL 语句。
DB2 9.5 中全新的锁定超时报告功能
在 DB2 9.5 的锁定超时报告功能中,引入了一个新特性,使得锁定超时分析变得非常简单。要激活锁定超时报告,只需将 DB2 注册变量 DB2_CAPTURE_LOCKTIMEOUT 设置为 ON,并重新启动您的 DB2 实例:
清单 1. 激活 DB2 9.5 中的锁定超时报告
- db2setDB2_CAPTURE_LOCKTIMEOUT=ON
- db2stop
- db2start
是的,就是这么简单。当 DB2_CAPTURE_LOCKTIMEOUT 设置为 ON 时,DB2 为每个锁定超时事件自动创建一个报告文件。报告文件保存在 DIAGPATH 数据库管理员配置(DBM CFG)参数指向的目录中,包含的信息有:锁定超时的日期和时间、存在问题的锁定、锁定请求程序和锁定拥有者。
那么 DB2 9.5 中就不使用 db2cos 脚本了吗?事实并非如此。将 db2cos 脚本和 db2pd 工具结合具有非常广泛的用途。这意味着,这些工具组合仍然可用于捕捉与 SQL 代码和 DB2 内部返回代码相关的任何 DB2 事件信息,而不仅仅是锁定超时信息。
现在看看新的 DB2 9.5 注册变量 DB2_CAPTURE_LOCKTIMEOUT 并查看一个使用 DB2 SAMPLE 数据库的锁定超时示例场景。如果 SAMPLE 数据库不存在,可以调用下面的命令创建一个:
分析DB2 9.5中的锁定超时原因
作者: kaduo, 出处:IT专家网论坛, 责任编辑: 陈子琪, 2009-05-20 07:00
在 DB29.5中,分析锁定超时的方法得到了极大改进,锁定超时分析变得更加简单。本文探索这些全新的锁定超时报告功能,并检查收集的附加信息以确定发生锁定超时的原因。
在 DB29.5中,分析锁定超时的方法得到了极大改进,锁定超时分析变得更加简单。本文探索这些全新的锁定超时报告功能,并检查收集的附加信息以确定发生锁定超时的原因。
回顾DB2 9.1中的锁定超时分析
使用db2pd工具和db2cos脚本进行锁定超时分析的方法包含以下几步:
1.使用一个特殊的DB2脚本 — 名为 db2cos — 在每次调用db2cos脚本时执行一个db2pd调用。db2pd 调用收集与锁定、事务、应用程序、语句缓存相关的信息,并将信息存储在一个文本文件中以供分析。
2.要在锁定超时发生时自动执行 db2cos 脚本(以及包含的 db2pd 命令,需要使用 db2pdcfg 命令注册锁定超时事件。
3.在锁定超时事件中,DBA 可以检查通过自动调用 db2cos 脚本生成的 db2pd 输出。这使 DBA 能够确定发生锁定争用的原因,从而设法在以后避免发生这类情形。
尽管其中介绍的方法提供了大量信息,使得锁定超时分析比以前的 DB2 9 for Linux, Unix, and Windows 版本更加简单,但它仍然存在一些不足:
◆使用此方法需要手动改写 db2cos 脚本并通过调用 db2pdcfg 来注册锁定超时事件。两个步骤都不复杂,但是对于新手来说可能有些困难。
◆解释 db2pd 输出以识别锁定超时情形中涉及的应用程序和 SQL 语句,这个任务并不容易,而且需要一些尝试。
◆如果锁定超时是由包含多个 SQL 命令的事务引起的,那么 db2pd 收集的信息可能还不足以确定导致锁定的 SQL 语句。
DB2 9.5 中全新的锁定超时报告功能
在 DB2 9.5 的锁定超时报告功能中,引入了一个新特性,使得锁定超时分析变得非常简单。要激活锁定超时报告,只需将 DB2 注册变量 DB2_CAPTURE_LOCKTIMEOUT 设置为 ON,并重新启动您的 DB2 实例:
清单 1. 激活 DB2 9.5 中的锁定超时报告
- db2setDB2_CAPTURE_LOCKTIMEOUT=ON
- db2stop
- db2start
是的,就是这么简单。当 DB2_CAPTURE_LOCKTIMEOUT 设置为 ON 时,DB2 为每个锁定超时事件自动创建一个报告文件。报告文件保存在 DIAGPATH 数据库管理员配置(DBM CFG)参数指向的目录中,包含的信息有:锁定超时的日期和时间、存在问题的锁定、锁定请求程序和锁定拥有者。
那么 DB2 9.5 中就不使用 db2cos 脚本了吗?事实并非如此。将 db2cos 脚本和 db2pd 工具结合具有非常广泛的用途。这意味着,这些工具组合仍然可用于捕捉与 SQL 代码和 DB2 内部返回代码相关的任何 DB2 事件信息,而不仅仅是锁定超时信息。
现在看看新的 DB2 9.5 注册变量 DB2_CAPTURE_LOCKTIMEOUT 并查看一个使用 DB2 SAMPLE 数据库的锁定超时示例场景。如果 SAMPLE 数据库不存在,可以调用下面的命令创建一个:#p#
清单6. 锁定超时报告
- LOCKTIMEOUTREPORT
- Date:03/01/2008
- Time:07:34:31
- Instance:DB2
- Database:SAMPLE
- DatabasePartition:0
- LockInformation:
- LockName:02000600040040010000000052
- LockType:Row
- LockSpecifics:TablespaceID=2,TableID=6,RowID=x0400400100000000
- LockRequestor:
- SystemAuthID:FECHNER
- ApplicationHandle:[0-38]
- ApplicationID:*LOCAL.DB2.080103063343
- ApplicationName:db2bp.exe
- RequestingAgentID:5232
- CoordinatorAgentID:5232
- CoordinatorPartition:0
- LocktimeoutValue:10000milliseconds
- Lockmoderequested:..U
- ApplicationStatus:(SQLM_UOWEXEC)
- CurrentOperation:(SQLM_EXECUTE_IMMEDIATE)
- LockEscalation:No
- ContextofLockRequest:
- Identification:UOWID(1);ActivityID(1)
- ActivityInformation:
- PackageSchema:(NULLID)
- PackageName:(SQLC2G13NULLID)
- PackageVersion:()
- SectionEntryNumber:203
- SQLType:Dynamic
- StatementType:DML,Insert/Update/Delete
- EffectiveIsolation:CursorStability
- StatementUnicodeFlag:No
- Statement:UPDATEEMPLOYEESETBONUS=SALARY*0.1
- WHEREJOB='MANAGER'
- LockOwner(Representative):
- SystemAuthID:FECHNER
- ApplicationHandle:[0-33]
- ApplicationID:*LOCAL.DB2.080103063332
- ApplicationName:db2bp.exe
- RequestingAgentID:5488
- CoordinatorAgentID:5488
- CoordinatorPartition:0
- Lockmodeheld:..X
- ListofActiveSQLStatements:Notavailable
- ListofInactiveSQLStatementsfromcurrentUOW:Notavailable
清单6. 锁定超时报告
- LOCKTIMEOUTREPORT
- Date:03/01/2008
- Time:07:34:31
- Instance:DB2
- Database:SAMPLE
- DatabasePartition:0
- LockInformation:
- LockName:02000600040040010000000052
- LockType:Row
- LockSpecifics:TablespaceID=2,TableID=6,RowID=x0400400100000000
- LockRequestor:
- SystemAuthID:FECHNER
- ApplicationHandle:[0-38]
- ApplicationID:*LOCAL.DB2.080103063343
- ApplicationName:db2bp.exe
- RequestingAgentID:5232
- CoordinatorAgentID:5232
- CoordinatorPartition:0
- LocktimeoutValue:10000milliseconds
- Lockmoderequested:..U
- ApplicationStatus:(SQLM_UOWEXEC)
- CurrentOperation:(SQLM_EXECUTE_IMMEDIATE)
- LockEscalation:No
- ContextofLockRequest:
- Identification:UOWID(1);ActivityID(1)
- ActivityInformation:
- PackageSchema:(NULLID)
- PackageName:(SQLC2G13NULLID)
- PackageVersion:()
- SectionEntryNumber:203
- SQLType:Dynamic
- StatementType:DML,Insert/Update/Delete
- EffectiveIsolation:CursorStability
- StatementUnicodeFlag:No
- Statement:UPDATEEMPLOYEESETBONUS=SALARY*0.1
- WHEREJOB='MANAGER'
- LockOwner(Representative):
- SystemAuthID:FECHNER
- ApplicationHandle:[0-33]
- ApplicationID:*LOCAL.DB2.080103063332
- ApplicationName:db2bp.exe
- RequestingAgentID:5488
- CoordinatorAgentID:5488
- CoordinatorPartition:0
- Lockmodeheld:..X
- ListofActiveSQLStatements:Notavailable
- ListofInactiveSQLStatementsfromcurrentUOW:Notavailable
清单9. 包含 SQL 语句历史信息的锁定超时报告
- LOCKTIMEOUTREPORT
- Date:03/01/2008
- Time:15:10:13
- Instance:DB2
- Database:SAMPLE
- DatabasePartition:0
- LockInformation:
- LockName:02000600040040010000000052
- LockType:Row
- LockSpecifics:TablespaceID=2,TableID=6,RowID=x0400400100000000
- LockRequestor:
- SystemAuthID:FECHNER
- ApplicationHandle:[0-202]
- ApplicationID:*LOCAL.DB2.080103140934
- ApplicationName:db2bp.exe
- RequestingAgentID:2356
- CoordinatorAgentID:2356
- CoordinatorPartition:0
- LocktimeoutValue:10000milliseconds
- Lockmoderequested:..U
- ApplicationStatus:(SQLM_UOWEXEC)
- CurrentOperation:(SQLM_EXECUTE_IMMEDIATE)
- LockEscalation:No
- ContextofLockRequest:
- Identification:UOWID(1);ActivityID(1)
- ActivityInformation:
- PackageSchema:(NULLID)
- PackageName:(SQLC2G13NULLID)
- PackageVersion:()
- SectionEntryNumber:203
- SQLType:Dynamic
- StatementType:DML,Insert/Update/Delete
- EffectiveIsolation:CursorStability
- StatementUnicodeFlag:No
- Statement:UPDATEEMPLOYEESETBONUS=SALARY*0.1
- WHEREJOB='MANAGER'
- LockOwner(Representative):
- SystemAuthID:FECHNER
- ApplicationHandle:[0-188]
- ApplicationID:*LOCAL.DB2.080103140511
- ApplicationName:db2bp.exe
- RequestingAgentID:5488
- CoordinatorAgentID:5488
- CoordinatorPartition:0
- Lockmodeheld:..X
- ListofActiveSQLStatements:Notavailable
- ListofInactiveSQLStatementsfromcurrentUOW:
- Entry:#1
- Identification:UOWID(6);ActivityID(2)
- PackageSchema:(NULLID)
- PackageName:(SQLC2G13)
- PackageVersion:()
- SectionEntryNumber:201
- SQLType:Dynamic
- StatementType:DML,Select(blockable)
- EffectiveIsolation:CursorStability
- StatementUnicodeFlag:No
- Statement:SELECTLASTNAME,FIRSTNME,SALARYFROMEMPLOYEE
- ORDERBYLASTNAMEASC
- Entry:#2
- Identification:UOWID(6);ActivityID(1)
- PackageSchema:(NULLID)
- PackageName:(SQLC2G13)
- PackageVersion:()
- SectionEntryNumber:203
- SQLType:Dynamic
- StatementType:DML,Insert/Update/Delete
- EffectiveIsolation:CursorStability
- StatementUnicodeFlag:No
- Statement:UPDATEEMPLOYEESETSALARYSALARY=SALARY*1.02
这个锁定超时报告的开始部分与前面看到的相同。但是,这次的 Lock Owner 部分包含额外的、有价值的信息。在标题 List of Inactive SQL Statements from current UOW 下边,可以看到在发生锁定超时之前锁持有者的事务执行的所有 SQL 语句。从这组 SQL 语句中,可以找到导致问题锁定的语句。在这个场景中,使用 UPDATE 语句增加每个员工的工资。
注意,这个功能是对结合使用 db2cos 和 db2pd 方法的一个重大改进。使用 db2cos 与 db2pd 相结合的方法,只能看到锁持有者的应用程序执行的***一条语句 — 在这个场景中是对 EMPLOYEE 表的查询。但是由于查询并没有导致出现问题的独占锁,您仍然不知道是哪条语句导致了锁定。使用新方法 — DB2_CAPTURE_LOCKTIMEOUT 和死锁事件监视器 — 您拥有在锁拥有者的事务中执行的所有 SQL 语句的历史信息,这就可以将 UPDATE 确定为相关的语句。
使用锁定超时报告的提示
带有语句历史功能的死锁事件监视器适用于所有应用程序,会增加 DB2 数据库管理程序对监视器堆的大量使用。所以应该谨慎使用。您应该始终首先设置 DB2_CAPTURE_LOCKTIMEOUT=ON,然后只在必要的时候使用 DETAILS HISTORY 选项激活死锁事件监视器。
使用锁定超时报告时,您可能会注意到,DIAGPATH 中的锁定超时报告文件的数量在持续增加。DB2 不会删除这些报告文件,所以 DBA 需要删除它们或者将它们移动到不同的位置,以便在 DIAGPATH 的文件系统上始终有足够的空间。
即使拥有了锁定超时报告功能,也不是总能够轻松确定出导致锁定超时的原因。例如,如果锁定超时由静态 SQL 或 DB2 内部锁定引起时,就没有那么容易确定原因。DB2 9.5 文档的 Lock timeout reporting 一章提供了这些局限性的一个简短列表(参见下面的 参考资料)。但是,DB2 9.5 中的锁定超时报告绝对是一个许多 DBA 期待已久的功能,而且将大大简化对锁定超时的分析。
以上的相关内容就是对分析DB2 9.5中的锁定超时原因的介绍,望你能有所收获。
【编辑推荐】
- DB2数据库从Excel中读取数据举例
- DB2数据库双机的安装方法介绍
- DB2数据库开发常见问题解答
- DB2数据库的安装目录结构介绍
- shell抽取db2数据库数据的方法示例
知优网 » 分析DB2 9.5中的锁定超时原因(db2因为死锁或超时)