CREATE EVENT MONITOR(锁定)语句

CREATE EVENT MONITOR (锁定) 语句创建事件监视器,该事件监视器将记录使用数据库时发生的与锁定相关的事件。

调用

此语句可嵌入应用程序中或者以交互方式发出。 它是一个可执行语句,仅当 DYNAMICRULES 运行行为对于程序包有效时才能动态编译 (SQLSTATE 42509)。

授权

该语句的授权标识所拥有的特权必须包括以下权限之一:
  • DBADM 权限
  • SQLADM 权限

语法

Read syntax diagramSkip visual syntax diagramCREATE EVENT MONITORevent-monitor-name FOR LOCKINGWRITE TOTABLEformatted-event-table-infoUNFORMATTED EVENT TABLE(target-table-options) AUTOSTARTMANUALSTART
formatted-event-table-info
Read syntax diagramSkip visual syntax diagram,evm-group(target-table-options)
target-table-options
Read syntax diagramSkip visual syntax diagram12TABLEtable-nameINtablespace-namePCTDEACTIVATE100PCTDEACTIVATEinteger
Notes:
  • 1 Each table option can be specified a maximum of one time (SQLSTATE 42613).
  • 2 Clauses can be separated with a space or a comma.

描述

event-monitor-name
事件监视器的名称。 这是一部分名称。 这是一个 SQL 标识(普通标识或定界标识)。 event-monitor-name 不能标识目录中已存在的事件监视器 (SQLSTATE 42710)。
FOR
指示要记录的事件类型。
LOCKING
指定此被动事件监视器将记录当数据库管理器迂到以下一个或多个条件时产生的任何锁定事件:
  • LOCKTIMEOUT: 锁定已超时。
  • 死锁: 锁定涉及死锁 (受害者和参与者)。
  • LOCKWAIT: 在指定的持续时间内未获取的锁定。
创建锁定事件监视器并不指示将立即收集锁定数据。 相关的实际锁定事件在工作负载级别或数据库级别进行控制。
WRITE TO
指定数据的目标。
指示事件监视器数据的目标是一组格式化事件表。 事件监视器将数据流分成一个或多个逻辑数据组,并将每个组插入到单独的表中。 将保留具有目标表的组的数据,并丢弃没有目标表的组的数据。 该组中包含的每个监视器元素都会映射到同名的表列。 只会将具有对应表列的元素插入到该表中。 将丢弃其他元素。
formatted-event-table-info
定义事件监视器的目标格式化事件表。 此子句应指定要记录的每个分组。 但是,如果未指定 evm-group 子句,那么将记录事件监视器类型的所有组。

有关逻辑数据组的更多信息,请参阅 逻辑数据组和事件监视器输出表

evm-group
标识要为其定义目标表的逻辑数据组。 该值取决于事件监视器的类型,如下表中所示:
事件监视器的类型 evm-group 值
锁定
  • LOCK
  • lock_participants
  • lock_participant_activities
  • lock_activity_values
  • CONTROL
无格式事件表
指定事件监视器的目标是无格式事件表。 无格式事件表用于存储收集的锁定事件监视器数据。 数据以内部二进制格式存储在直接插入的 BLOB 列中。 每个事件都可以将多个记录插入到此表中,并且每个插入的记录可能具有不同的类型,并且关联的 BLOB 内容也会有所不同。 BLOB 列中的数据不是可读格式,需要通过使用 db2evmonfmt 基于 Java 的工具, EVMON_FORMAT_UE_TO_XML 表函数或 EVMON_FORMAT_UE_TO_TABLES 过程将其转换为可使用的格式,例如 XML 文档或关系表。
target-table-options
标识目标表的选项。 如果未指定 target-table-options 的值,那么将按如下所示继续执行 CREATE EVENT MONITOR FOR LOCKING 处理:
  • 将使用派生表名称 (如 TABLE table-name的描述中所述)。
  • 使用与使用 CREATE TABLE 创建没有表空间名称的表时相同的过程来选择缺省表空间。
  • PCTDEACTIVATE 设置为 100。
TABLE table-name
指定目标表的名称。 目标表必须是非分区表。 如果名称未限定,那么表模式缺省为 CURRENT SCHEMA 专用寄存器中的值。 如果没有为未格式化的事件表提供名称,那么未限定的名称等于 event-monitor-name,即,未格式化的事件表将在事件监视器之后命名。 如果没有为格式化事件表提供名称,那么未限定的名称派生自 evm-groupevent-monitorname ,如下所示:
   substring(evm-group CONCAT '_'
     CONCAT event-monitor-name,1,128)
IN 表空间名称
定义要在其中创建表的表空间。 CREATE EVENT MONITOR FOR LOCKING 语句不会创建表空间。

如果未提供表空间名称,那么将使用与使用 CREATE TABLE 在没有表空间名称的情况下创建表时相同的进程来选择表空间。

当为格式化事件表指定表空间名称时,表空间的页面大小会影响所使用的 INLINE LOB 长度。请考虑指定具有尽可能大的页面大小的表空间,以提高事件监视器的 INSERT 性能。

PCTDEACTIVATE integer
如果要在自动存储(非临时)或 DMS 表空间中创建事件监视器的表,那么 PCTDEACTIVATE 参数会指定在自动停用事件监视器之前表空间必须达到的填满程度。 指定的值 (表示百分比) 的范围从 0 到 100。 缺省值为 100 ,其中 100 表示当表空间完全已满时,事件监视器将取消激活。 如果未指定 PCTDEACTIVATE,那么将使用缺省值 100。 对于 SMS 表空间,将忽略此选项。
要点: 如果目标表空间已启用自动调整大小,请将 PCTDEACTIVATE 设置为 100。 或者,完全省略此子句以应用缺省值 100。 否则,如果在表空间自动调整大小之前表空间达到 PCTDEACTIVTATE 指定的阈值,那么可能会意外停用事件监视器。
AUTOSTART
指定每当激活用于运行事件监视器的数据库分区时,都会自动激活事件监视器。 这是锁定事件监视器的缺省行为。
MANUALSTART
指定必须使用 SET EVENT MONITOR STATE 语句手动激活事件监视器。 在激活 MANUALSTART 事件监视器后,只能使用 SET EVENT MONITOR STATE 语句或通过停止实例来停用该事件监视器。

注意

  • 如果目标表尚不存在,那么将在执行 CREATE EVENT MONITOR FOR LOCKING 语句时创建该表。
  • 在 CREATE EVENT MONITOR FOR LOCKING 处理期间,如果发现某个表已定义为供另一个事件监视器使用,那么 CREATE EVENT MONITOR FOR LOCKING 语句将失败,并且会将错误传递回应用程序。 将定义一个表以供其他事件监视器使用(前提是该表名与在 SYSCAT.EVENTTABLES 目录视图中找到的值匹配)。 如果该表存在并且未定义为供另一个事件监视器使用,那么该事件监视器将复用该表。
  • 删除事件监视器不会删除任何表。 删除事件监视器后,必须手动删除任何关联的表。
  • 不会自动从此事件监视器创建的无格式事件表或常规表中修剪锁定事件数据。 使用 EVMON_FORMAT_UE_TO_TABLES 过程时,可以使用用于从 UE 表中修剪数据的选项。 对于写入常规表的事件监视器,必须手动修剪事件数据。
  • FLUSH EVENT MONITOR 语句不适用于此事件监视器,并且对其发出此语句将不起作用。
  • 对于无格式事件表,会将事件数据插入到表中的内联 BLOB 数据列中。 通常, BLOB 数据存储在单独的 LOB 表空间中,因此可能会迂到额外的性能开销。 当直接插入到基本表的数据页面中时, BLOB 数据不会迂到此开销。 如果 BLOB 数据的大小小于表空间页大小减去记录前缀,那么数据库管理器将自动内联无格式事件表记录的 BLOB 数据部分。 因此,为了实现高效率和应用程序吞吐量,建议您在尽可能大的表空间中创建事件监视器,直至并包括 32KB 表空间和关联的缓冲池。
    示例
    锁定事件监视器当前具有以下两种记录类型:
    • 应用程序信息记录
    • 应用程序活动记录

    应用程序信息记录 = 最大大小 3.5KB

    应用程序活动记录 = 3KB + SQL 语句文本大小 (其中 SQL 语句文本大小最大为 2MB)

    应用程序信息记录非常小,只要正在使用 4KB 页面大小,就应该始终直接插入该记录。 将根据以下公式直接插入应用程序活动记录:
    Application Activity Record < inline length (Pagesize - overhead non-LOB columns (0.5KB))
       3KB + SQL statement text < inline length (Pagesize - overhead non-LOB columns (0.5KB))
    
             SQL statement text < Pagesize - nonLOB overhead (1K) - 3KB
             SQL statement text < 16KB - 1KB - 3KB
                                < 12KB

    因此,使用 16KB 页面大小时,仅当要捕获的 SQL 语句的大小小于 12KB 时,才会直接插入锁定事件监视器记录。

  • 每个数据库仅创建一个锁定事件监视器。 创建多个锁定事件监视器将使用其他处理器周期和存储器,而不提供任何其他数据。
    重要信息: 为了与产品的较旧版本兼容,将在启用 DB2DETAILDEADLOCK 事件监视器的情况下创建所有数据库。 锁定事件监视器 Db2® V 9.7 中引入 是收集与锁定相关的数据的首选机制; 不推荐使用 DB2DETAILEDDEALOCK 事件监视器,在将来的发行版中可能会将其除去。 创建锁定事件监视器时,请禁用并删除 DB2DETAILEDDEADLOCK 事件监视器,以防止收集重复的不必要信息。
    要移除 DB2DETAILDEADLOCK 事件监视器,请发出下列 SQL 语句:
    SET EVENT MONITOR DB2DETAILDEADLOCK state 0
    DROP EVENT MONITOR DB2DETAILDEADLOCK 
  • 在分区数据库环境中,数据仅写入其表空间所在的数据库分区上的目标表。 如果某个数据库分区上不存在目标表的表空间,那么将忽略该目标表的数据。 此行为允许用户创建只在特定数据库分区中存在的表空间,从而选择要监视的部分数据库分区。
  • 在分区数据库环境中,如果某些目标表不驻留在数据库分区上,但其他目标表驻留在同一数据库分区上,那么仅会记录驻留在该数据库分区上的目标无格式事件表的数据。

示例

  • 示例 1: 此示例创建锁定事件监视器 LOCKEVMON ,该监视器将收集在创建数据库上发生的锁定事件。
       CREATE EVENT MONITOR LOCKEVMON
         FOR LOCKING
         WRITE TO TABLE 
    此事件监视器将其输出写入以下表:
    • 位置-位置-VMON
    • 锁定参与者
    • 锁定参与者的活动
    • 锁定活动值
    • 控制位置 VMON
  • 示例 2: 此示例创建锁定事件监视器 LOCKEVMON ,该监视器将收集创建数据库上发生的锁定事件,并将其存储在无格式事件表 IMRAN.LOCKEVENTS。
       CREATE EVENT MONITOR LOCKEVMON
         FOR LOCKING
         WRITE TO UNFORMATTED EVENT TABLE (TABLE IMRAN.LOCKEVENTS)
  • 示例 3: 此示例创建锁定事件监视器 LOCKEVMON ,该监视器将收集创建数据库上发生的锁定事件,并将其存储在无格式事件表 IMRAN.LOCKEVENTS 。 当表空间变满 85% 时,事件监视器将取消激活。
       CREATE EVENT MONITOR LOCKEVMON
         FOR LOCKING
         WRITE TO UNFORMATTED EVENT TABLE 
            (TABLE IMRAN.LOCKEVENTS IN APPSPACE PCTDEACTIVATE 85)