锁定和死锁事件监视

在大型数据库环境中,诊断和排除锁定争用情况的工作可能相当复杂且耗时。锁定事件监视器旨在通过收集锁定数据简化此任务。

注: 建议不要使用死锁事件监视器,它提供的功能包括在锁定事件监视器中。此外,也建议不要使用 DB2DETAILDEADLOCK 事件监视器。有关此事件监视器的重要用法信息,请参阅不推荐使用的锁定监视功能

锁定事件监视器用于在发生锁定事件时捕获关于那些事件的描述性信息。捕获的信息将标识锁定事件引起的锁定争用情况所涉及的关键应用程序。将同时捕获关于锁定请求者(接收到死锁或锁定超时错误或者等待锁定时的耗用时间超出指定时间长度的应用程序)和当前锁定所有者的信息。

锁定事件监视器收集的信息将以二进制格式写至数据库中的无格式事件表,在这种情况下必须在后捕获步骤中处理所捕获数据。或者,可将锁定事件信息写至一组常规表。有关如何选择最适当的输出格式的更多信息,请参阅Output options for event monitors

您还可以使用动态或静态 SQL 来直接访问 关系监视接口(表函数),以便收集锁定事件信息。

确定是否已发生死锁或锁定超时的过程也有所简化。消息将在其中任何一个事件发生时被写入管理通知日志;这将对返回给应用程序的 SQL0911N(sqlcode 为 -911)错误进行补充。此外,还会将锁定升级通知写入管理通知日志;此信息对于您调整锁定表大小以及应用程序能够使用的锁定表空间量而言十分有用。另外,还可以检查有关锁定超时 (lock_timeouts)、锁定等待 (lock_waits) 和死锁 (deadlocks) 的计数器。

可以捕获其锁定数据的活动的类型如下所示:
  • SQL 语句,例如:
    • DML
    • DDL
    • CALL
  • LOAD 命令
  • REORG 命令
  • BACKUP DATABASE 命令
  • 实用程序请求

锁定事件监视器将不推荐使用的死锁事件监视器(CREATE EVENT MONITOR FOR DEADLOCKS 语句和 DB2DETAILDEADLOCK)以及不推荐使用的锁定超时报告功能(DB2_CAPTURE_LOCKTIMEOUT 注册表变量)替换为简化而一致的锁定事件数据收集接口,并添加了捕获锁定等待数据的功能。

功能概述

要使用锁定事件监视器来捕获锁定事件数据,需要执行两个步骤:
  1. 必须使用 CREATE EVENT MONITOR FOR LOCKING 语句来创建 LOCK EVENT 监视器。您应提供监视器的名称和(如果要将 UE 表作为输出格式)锁定事件数据写至的无格式事件表的名称。
    注: 如果选择对事件监视器输出使用常规表,那么会指定缺省表名。如果愿意,可覆盖 CREATE EVENT MONITOR 语句中的缺省值。
  2. 必须使用下列其中一种方法来指定锁定事件数据的捕获级别:
    • 您可以通过更改现有工作负载或者使用 CREATE 或 ALTER WORKLOAD 语句创建新工作负载来指定特定的工作负载。在工作负载级别,您必须指定要捕获的锁定事件数据的类型(死锁、锁定超时或锁定等待),并指定锁定是否涉及应用程序的 SQL 语句历史记录和输入值。对于锁定等待,还必须指定应用程序将等待锁定的时间长度(在这段时间过后,将捕获锁定等待数据)。
    • 通过设置适当的数据库配置参数,可以在数据库级别收集数据并影响所有数据库工作负载:
      mon_lockwait
      此参数控制锁定等待事件的生成方式。

      最佳实践是,在工作负载级别启用锁定等待数据收集功能。

      mon_locktimeout
      此参数控制锁定超时事件的生成方式。

      最佳实践是,如果这些事件并不是应用程序所预期的事件,请在数据库级别启用锁定超时数据收集功能。否则,请在工作负载级别启用此功能。

      mon_deadlock
      此参数控制死锁事件的生成方式。

      最佳实践是,在数据库级别启用死锁数据收集功能。

      mon_lw_thresh
      此参数控制在生成 mon_lockwait 的事件之前等待锁定时耗用的时间。

捕获 SQL 语句历史记录和输入值将使用额外的处理器时间、内存和存储,但要成功地调试锁定问题,通常需要此级别的详细信息。

发生锁定事件后,可查看该事件监视器生成的输出中的事件数据。如果使用 UE 表,那么通过使用所提供的基于 Java 的应用程序 db2evmonfmt,可以将无格式事件表中的二进制数据变换为 XML 或文本文档。另外,可以使用 EVMON_FORMAT_UE_TO_XML 表函数将无格式事件表 BLOB 列中的二进制事件数据格式化为 XML 报告文档,也可以使用 EVMON_FORMAT_UE_TO_TABLES 过程将其格式化为关系表。

如果使用常规表作为输出格式,那么可使用 SQL 直接查询该数据。

为了帮助确定应该对哪些工作负载监视锁定事件,您可以查看管理通知日志。每当遇到死锁或锁定超时情况时,系统都会将一条消息写入日志。这些消息将标识正在其中运行锁定请求者和锁定所有者的工作负载以及锁定事件的类型。另外,还可以在工作负载级别检查有关锁定超时(lock_timeouts)、锁定等待(lock_waits)和死锁(deadlocks)的计数器。

为锁定事件收集的信息

锁定事件监视器所收集的一些锁定事件信息包括:
  • 导致发生事件的锁定
  • 正在挂起导致发生锁定事件的锁定的应用程序
  • 正在等待或请求导致发生锁定事件的锁定的应用程序
  • 应用程序在锁定事件期间执行的操作
注:
  • Db2® pureScale® 环境中,死锁事件监视器不会始终报告 lock_mode 监视元素。您可能会看到死锁事件监视器输出,并且它不包含任何有关该锁定持有者的信息。即使 CF 不处于繁忙状态,也可能发生此情况。

不推荐使用的锁定监视功能

缺省情况下,将为每个数据库创建不推荐使用的详细死锁事件监视器 DB2DETAILDEADLOCK,并在激活数据库时启动该监视器。如果使用锁定事件监视器来检测死锁,请考虑禁用 DB2DETAILDEADLOCK 事件监视器。如果锁定事件监视器也在收集死锁信息期间 DB2DETAILDEADLOCK 事件监视器仍处于活动状态,那么两个事件监视器都将收集数据,这会严重影响性能。

要移除 DB2DETAILDEADLOCK 事件监视器,请发出下列 SQL 语句:
SET EVENT MONITOR DB2DETAILDEADLOCK state 0
DROP EVENT MONITOR DB2DETAILDEADLOCK