您可以使用锁定事件监视器来收集锁定超时、锁定等待和死锁信息,以帮助确定和解决锁定问题。本任务描述以不可读格式在无格式事件表中收集锁定事件数据之后,如何获取可读的文本报告。
开始之前
要创建锁定事件监视器并收集锁定事件监视数据,您必须具有 DBADM 或 SQLADM 权限。
关于此任务
锁定事件监视器用于收集有助于确定和解决锁定问题的相关信息。例如,锁定事件监视器收集的一些锁定事件信息如下:
- 导致锁定事件的锁定
- 正在请求或挂起导致锁定事件的锁定的应用程序
- 应用程序在锁定事件期间执行的操作
本任务提供有关收集指定工作负载的锁定事件数据的指示信息。在下列情况下,您可能想收集锁定事件数据:
- 使用 MON_GET_WORKLOAD 表函数时,您注意到锁定等待值超出正常情况。
- 应用程序在管理通知日志中返回 SQL 返回码 -911,原因码为 68,这表明“事务由于锁定超时而回滚”。有关更多详细信息,另请参阅 SQL0911N 消息。
- 您注意到管理通知日志中出现死锁事件消息(SQL 返回码为 -911,且原因码为 2,指出“因为死锁,事务已回滚。”)。此日志消息指出在两个应用程序之间发生锁定事件,例如在应用程序 A 与 B 之间发生此事件,其中 A 是工作负载 FINANCE 的组成部分,B 是工作负载 PAYROLL 的组成部分。有关更多详细信息,另请参阅 SQL0911N 消息。
限制
要查看数据值,您必须对 EVMON_FORMAT_UE_* 例程具有 EXECUTE 特权(SQLADM
和 DBADM 权限隐式地包含此特权)。您还必须对无格式事件表具有 SELECT 特权,缺省情况下,具有
DATAACCESS 权限的用户以及事件监视器及相关无格式事件表的创建者具有此特权。
过程
要收集关于将来有可能发生的锁定事件的详细信息,请执行以下步骤:
- 使用 CREATE EVENT MONITOR FOR LOCKING 语句来创建名为
lockevmon
的锁定事件监视器,如以下示例所示: CREATE EVENT MONITOR lockevmon FOR LOCKING
WRITE TO UNFORMATTED EVENT TABLE
注: 以下列示创建事件监视器时要记住的要点:
- 您可以提前创建事件监视器而不必担心耗用磁盘空间,这是因为,在数据库或工作负载级别激活数据收集操作之前不会写入任何内容
- 在分区数据库环境中,请确保在分区表空间的所有节点上设置事件监视器。否则,在没有分区表空间的分区中,将丢失锁定事件。
- 请确保设置表空间和缓冲池,以便最大程度地降低对表进行访问以获取数据期间执行的工作对高性能工作的影响。
- 通过运行以下语句来激活名为
lockevmon 的锁定事件监视器: SET EVENT MONITOR lockevmon STATE 1
- 要在工作负载级别启用锁定事件数据收集功能,请发出带有下列其中一个 COLLECT 子句的 ALTER WORKLOAD 语句:COLLECT LOCK TIMEOUT DATA、COLLECT DEADLOCK DATA 或 COLLECT LOCK WAIT DATA。对 COLLECT 子句指定 WITH HISTORY 选项。设置数据库配置参数将在数据库级别影响锁定事件数据收集,并且所有工作负载都将受影响。
- 对于锁定等待事件
- 要对 FINANCE 应用程序收集任何超过 5 秒钟才能获取的锁定的锁定等待数据,并且要对 PAYROLL 应用程序收集任何超过 10 秒才能获取的锁定的锁定等待数据,请发出下列语句:
ALTER WORKLOAD finance COLLECT LOCK WAIT DATA WITH HISTORY AND VALUES
FOR LOCKS WAITING MORE THAN 5 SECONDS
ALTER WORKLOAD payroll COLLECT LOCK WAIT DATA
FOR LOCKS WAITING MORE THAN 10 SECONDS WITH HISTORY
- 要使用 HIST_AND_VALUES 输入数据值对 SAMPLE 数据库设置 mon_lockwait
数据库配置参数,并且要将 mon_lw_thresh
数据库配置参数设置为 10 秒,请发出下列命令:
db2 update db cfg for sample using mon_lockwait hist_and_values
db2 update db cfg for sample using mon_lw_thresh 10000000
- 对于锁定超时事件
- 要对 FINANCE 和 PAYROLL 应用程序收集锁定超时数据,请发出下列语句:
ALTER WORKLOAD finance COLLECT LOCK TIMEOUT DATA WITH HISTORY
ALTER WORKLOAD payroll COLLECT LOCK TIMEOUT DATA WITH HISTORY
- 要使用 HIST_AND_VALUES 输入数据值对 SAMPLE 数据库设置 mon_locktimeout
数据库配置参数,请发出以下命令:
db2 update db cfg for sample using mon_locktimeout hist_and_values
- 对于死锁事件
- 要对 FINANCE 和 PAYROLL 应用程序收集数据,请发出下列语句:
ALTER WORKLOAD finance COLLECT DEADLOCK DATA WITH HISTORY
ALTER WORKLOAD payroll COLLECT DEADLOCK DATA WITH HISTORY
- 要使用 HIST_AND_VALUES 输入数据值对 SAMPLE 数据库设置 mon_deadlock
数据库配置参数,请发出以下命令:
db2 update db cfg for sample using mon_deadlock hist_and_values
- 重新运行工作负载,以便接收另一个锁定事件通知。
- 连接到数据库。
- 使用下列其中一个过程来获取锁定事件报告:
- 使用 XML 解析器工具 db2evmonfmt
来生成基于无格式事件表中收集的事件数据并使用缺省样式表的纯文本报告,例如:
java db2evmonfmt -d db_name -ue table_name -ftext -u user_id -p password
- 使用 EVMON_FORMAT_UE_TO_XML 表函数来获取 XML 文档。
- 使用 EVMON_FORMAT_UE_TO_TABLES 过程将该数据输出到关系表。
- 分析报告,确定锁定事件问题的原因并解决该问题。
- 通过运行下列语句或重置数据库配置参数,对 FINANCE 和 PAYROLL 应用程序关闭锁定数据收集功能:
- 对于锁定等待事件
ALTER WORKLOAD finance COLLECT LOCK WAIT DATA NONE
ALTER WORKLOAD payroll COLLECT LOCK WAIT DATA NONE
- 要使用缺省的 NONE 输入数据值对 SAMPLE 数据库重置 mon_lockwait
数据库配置参数,并且要将 mon_lw_thresh
数据库配置参数重置为缺省值(5 秒),请发出下列命令:
db2 update db cfg for sample using mon_lockwait none
db2 update db cfg for sample using mon_lw_thresh 5000000
- 对于锁定超时事件
ALTER WORKLOAD finance COLLECT LOCK TIMEOUT DATA NONE
ALTER WORKLOAD payroll COLLECT LOCK TIMEOUT DATA NONE
- 要使用缺省的 NONE 输入数据值对 SAMPLE 数据库重置 mon_locktimeout
数据库配置参数,请发出以下命令:
db2 update db cfg for sample using mon_locktimeout none
- 对于死锁事件
ALTER WORKLOAD finance COLLECT DEADLOCK DATA NONE
ALTER WORKLOAD payroll COLLECT DEADLOCK DATA NONE
- 要使用缺省的 WITHOUT_HIST 输入数据值对 SAMPLE 数据库重置 mon_deadlock
数据库配置参数,请发出以下命令:
db2 update db cfg for sample using mon_deadlock without_hist
下一步做什么
请重新运行应用程序,以确保锁定问题已不再存在。