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

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

 2009-12-12 14:59:14 来源:WEB开发网   
核心提示:这个 db2pd 调用的输出表明,事务 2(列 TranHdl)是由应用程序 30(列 AppHandl)执行的,分析DB2 for Linux,UNIX,and Windows中的锁等待情形(2),而事务 6 是由应用程序 34 执行的,这两个事务都正在对数据库执行写更改(列 State = WRITE),为了捕捉那

这个 db2pd 调用的输出表明,事务 2(列 TranHdl)是由应用程序 30(列 AppHandl)执行的,而事务 6 是由应用程序 34 执行的。这两个事务都正在对数据库执行写更改(列 State = WRITE)。所以 DBA 现在知道,应用程序 30 正持有应用程序 34 所等待的锁。

要获得关于锁等待情形涉及的应用程序的更多信息,可使用 -agents 选项调用 db2pd。该选项打印代表应用程序运行的代理的信息。注意,-agents 是一个实例级选项,这意味着不需要指定一个数据库(实际上,当指定一个数据库时,db2pd 打印出一条警告,并忽略 database 选项)。

清单 8. 获得关于应用程序和相应代理的信息

db2pd -agents
Database Partition 0 -- Active -- Up 3 days 08:35:42
Agents:
Current agents:   2
Idle agents:     0
Active coord agents: 2
Active agents total: 2
Pooled coord agents: 0
Pooled agents total: 0
Address  AppHandl [nod-index] AgentTid  Priority  Type   State
0x04449BC0 34    [000-00034] 3392    0     Coord  Inst-Active
0x04449240 30    [000-00030] 2576    0     Coord  Inst-Active
ClientPid Userid  ClientNm Rowsread  Rowswrtn  LkTmOt DBName
3916    USER_B  db2bp.ex 43     43     NotSet SAMPLe
2524    USER_A  db2bp.ex 153    14     NotSet SAMPLE

在 db2pd -agents 输出中,DBA 可以看到使用应用程序 30 和 34 的用户的 ID(列 Userid):应用程序 30 是由 USER_A 执行的,而应用程序 34 是由 USER_B 执行的。只有当每个用户都有一个单独的数据库授权 ID 时,才可能出现那样的应用程序与用户 ID 之间的映射。通常,这对于在应用服务器上运行的应用程序是不可能的,因为这些应用程序使用连接池,连接不是个人化的。

关于每个应用程序的更多信息则由 db2pd 选项 -applications 提供:

清单 9. 获得关于应用程序的更多信息

db2pd -db sample -applications
Database Partition 0 -- Database SAMPLE -- Active -- Up 3 days 08:36:14
Applications:
Address  AppHandl [nod-index] NumAgents CoorTid  Status
0x04AF8080 34    [000-00024] 1     3940    Lock-wait
0x03841960 30    [000-00020] 1     2548    UOW-Waiting
C-AnchID C-StmtUID L-AnchID L-StmtUID Appid
195   1     0    0     *LOCAL.DB2.061122195637
0    0     60    1     *LOCAL.DB2.061122195609

Status 列确认了 DBA 已经知道的一些东西:应用程序 34 处在锁等待状态。但是这并不新鲜,于是 DBA 将注意力集中在列 C-AnchID/C-StmtUID 和 L-AnchID/L-StmtUID 上。“C” 代表当前(current),“L” 代表最近(last)的锚 ID/语句 UID。这些 ID 可用于标识应用程序最近执行的 SQL 语句和应用程序当前执行的语句。为此,可以用 -dynamic 选项调用 db2pd。该选项显示数据库动态语句缓存的内容:

清单 10. 检查动态语句缓存的内容

db2pd -db sample -dynamic
Database Partition 0 -- Database SAMPLE -- Active -- Up 3 days 08:37:39
Dynamic Cache:
Current Memory Used      187188
Total Heap Size        1271398
Cache Overflow Flag      0
Number of References     2
Number of Statement Inserts  3
Number of Statement Deletes  0
Number of Variation Inserts  2
Number of Statements     3
Dynamic SQL Statements:
Address  AnchID StmtUID  NumEnv   NumVar   NumRef   NumExe
0x056CEBD0 60   1     1     1     1     1
0x056CE850 180  1     0     0     0     0
0x056CFEA0 195  1     1     1     1     1
Text
UPDATE EMPLOYEE SET BONUS = SALARY * 0.1 WHERE JOB = 'MANAGER'
SET CURRENT LOCALE LC_CTYPE = 'de_DE'
UPDATE EMPLOYEE SET SALARY = SALARY * 0.02
Dynamic SQL Environments:
Address  AnchID StmtUID  EnvID Iso QOpt Blk
0x056CECD0 60   1     1   CS 5  B
0x056D30A0 195  1     1   CS 5  B
Dynamic SQL Variations:
Address  AnchID StmtUID  EnvID VarID   NumRef   Typ
0x056CEEB0 60   1     1   1     1     4
0x056D3220 195  1     1   1     1     4
Lockname
010000000100000001003C0056
01000000010000000100C30056

-applications 输出与 -dynamic 输出之间的映射很简单:

应用程序 34(处于锁等待状态)当前正在执行当前锚 ID 195 和当前语句 ID 1 所标识的 SQL 语句。在 db2pd -dynamic 输出的 Dynamic SQL Statements 部分中,那些 ID 可以映射到以下 SQL 语句:

清单 11. 应用程序 34 执行的 SQL 语句

UPDATE EMPLOYEE SET SALARY = SALARY * 0.02

持有锁的应用程序 30 最近执行的 SQL 语句是最近锚 ID 60 和最近语句 ID 1 所标识的 SQL 语句。那些 ID 可以映射到以下 SQL 语句:

清单 12. 应用程序 30 执行的 SQL 语句

UPDATE EMPLOYEE SET BONUS = SALARY * 0.1 WHERE JOB = 'MANAGER'

注意,db2pd -dynamic 输出包含另一个通常难以发现的有趣信息:Dynamic SQL Environments 部分的列 Iso 中显示了被执行的动态 SQL 语句的隔离级别(UR = Uncommitted Read,CS = Cursor Stability,RS = Read Stability,RR = Repeatable Read)。

我们来总结一下 DBA 就用户 B 的应用程序被挂起的原因有什么发现:

挂起是由表 EMPLOYEE 上一个独占式的行锁导致的。

持有锁的事务属于用户 A 执行的一个应用程序。而用户 B 的事务正在等待那个锁。

两条有冲突的语句都是表 EMPLOYEE 上的 UPDATE 语句。

有了这些信息,DBA 可以开始采取一些必要的步骤来解决锁等待状况,例如建议用户 A 终止事务,或者强制关闭用户 A 的应用程序。此外,可以采取措施避免将来出现那样的状况,例如配置 DB2 控制器(governor),使之自动终止运行时间过长的事务。

在这个示例场景中,db2pd 被连续执行数次,每次使用一个单独的选项。现实中不会出现这样的情况。相反,db2pd 只被调用一次,调用时同时使用前面介绍的所有选项:

清单 13. 分析锁等待情形所需的带有所有选项的单个 db2pd 调用

db2pd -db sample -locks wait showlocks -transactions -agents -applications -dynamic
-file db2pd.out -repeat 15 40

产生的输出由针对每个选项的输出组成,各部分输出之间的顺序与各选项在 db2pd 调用中的顺序一致。而且,请注意 db2pd 调用最后的 2 个附加选项:

-file 表明 db2pd 输出应该被写到一个文件。在示例调用中,输出被写到文件 db2pd.out 中。

-repeat 表明 db2pd 应该每隔 15 秒执行一次,共执行 40 次(即每隔 15 秒执行一次,共执行 10 分钟)。每次执行的输出被附加到 -file 选项指定的文件后面。

-file 和 -repeat 选项对于在一段时间内监视数据库活动比较有用。对于锁等待分析,这两个选项可以帮助捕捉只存在一小段时间的锁等待情形。例如,如果数据库参数 LOCKWAIT 被设置为 20 秒,一个等待锁的事务在过了 20 秒的等待时间后被回滚。为了捕捉那样的锁等待情形,db2pd 的时间间隔必须设置为比 20 秒更短的时间间隔,例如例子中的 15 秒。

上一页  1 2 3 4  下一页

Tags:分析 DB for

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