当多个 db2? 用户并发地访问一个数据库时,锁等待会导致响应变慢。锁等待是临时性的,因而难以捕捉。然而,当出现锁等待情形时,需要由数据库管理员负责确定锁等待的原因。本文通过例子演示如何使用用于 db2 for linux?, unix?, and windows? 的 db2pd 和 db
当多个 db2? 用户并发地访问一个数据库时,锁等待会导致响应变慢。锁等待是临时性的,因而难以捕捉。然而,当出现锁等待情形时,需要由数据库管理员负责确定锁等待的原因。本文通过例子演示如何使用用于 db2 for linux?, unix?, and windows? 的 db2pd 和 db2pdcfg 实用程序完成该任务。用于锁监视的 db2pd 选项
db2pd 是用于监视各种 db2 数据库活动以及故障排除的实用程序。它是从 db2 v8.2 开始随 db2 引擎发布的一个独立的实用程序,其外观和功能类似于 informix onstat 实用程序。db2pd 是从命令行以一种可选的交互模式执行的。该实用程序运行得非常快,因为它不需要获取任何锁,并且在引擎资源以外运行(这意味着它甚至能在一个挂起的引擎上工作)。通过快照监视还可以收集 db2pd 提供的很多监视器数据,但是 db2pd 和快照监视的输出格式却有很大不同。这使 dba 可以选择更符合用户需求的监视替代方法。本文关注用于锁监视的 db2pd 选项。有一篇由 sam poon 撰写的 developerworks 文章(参见 参考资料 小节)对 db2pd 的监视功能作了更广泛的介绍。
下面的图展示了用于锁监视的 db2pd 选项:
图 1. 用于锁监视的 db2pd 选项
tranhdl:用于指定事务句柄,以便只监视由特定事务持有的锁。 showlocks:这个子选项将锁名称扩展成有意义的解释。对于一个行锁,该选项显示以下信息:表空间 id、表 id、分区 id、页和槽。通过使用编目视图 syscat.tables 上的一个查询,很容易将表空间 id 和表 id 映射到相应的表名:
清单 1. 将表空间 id、表 id 映射到表模式、表名
select tabschema, tabname
from syscat.tables
where tbspaceid = tbspaceid and tableid = tableid
wait:如果指定 wait 子选项,则 db2pd 只显示事务当前正在等待的锁,以及对等待情形负责的锁。这个子选项大大简化了锁等待分析,因为它将输出限制为参与锁等待情形的锁。 db2pd database 和 file 选项不是特定于锁监视的,但是适用于(几乎)所有 db2pd 调用。database 选项将 db2pd 返回的监视器数据限制为某个数据库的监视器数据。而 file 选项则允许定义一个文件,以便将 db2pd 输出写到该文件。 锁等待分析场景
接下来,我们开始使用前面介绍的 db2pd 选项来分析一个示例锁等待情形。为此,我们创建 db2 sample 数据库:
清单 2. 创建 sample 数据库
db2sampl
用户 a 执行事务 a,以根据每个经理的薪水为他们提供 10% 的奖金:
清单 3. 事务 a 执行的更新操作
update employee
set bonus = salary * 0.1
where job = 'manager'
当事务 a 仍然在运行(因为用户 a 还没有使用 commit 或 rollback 终止该事务)时,用户 b 执行事务 b,以将每个雇员的薪水提高 2%:
清单 4. 事务 b 执行的更新操作
update employee
set salary = salary * 0.02
由于事务 b 没有完成,用户 b 请求 dba 确定问题的原因。于是,dba 调用 db2pd,看是否存在锁等待情形:
清单 5. 检查锁等待情形
db2pd -db sample -locks wait showlocks
database partition 0 -- database sample -- active -- up 3 days 08:33:05
locks:
address tranhdl lockname type mode sts owner dur
0x050a0240 6 02000600050040010000000052 row ..x w 2 1
0x050a0db0 2 02000600050040010000000052 row ..x g 2 1
holdcount att releaseflg
0 0x00 0x40000000 tbspaceid 2 tableid 6 partitionid 0 page 320 slot 5
0 0x00 0x40000000 tbspaceid 2 tableid 6 partitionid 0 page 320 slot 5
db2pd 报告 id 为 2 的表空间中一个 id 为 6 的表上有一个行锁存在锁等待情形。通过检查 syscat.tables,dba 断定表 employee 上的确存在锁等待。
清单 6. 确定锁等待情形所涉及的表
请点击此处查看全文