创建写至表的事件监视器

要创建事件监视器,请使用 CREATE EVENT MONITOR STATEMENT。根据您计划监视的事件类型,此语句有不同形式可供您使用。

开始之前

  • 您需要 SQLADM 或 DBADM 权限才能创建表事件监视器。
  • CREATE EVENT MONITOR 语句的目标表 - 即,事件监视器要将其输出写至的表 - 必须是非分区表。

关于此任务

表事件监视器的各种选项将在 CREATE EVENT MONITOR 语句中设置。要进一步获取对写至表事件监视器生成 CREATE EVENT MONITOR SQL 语句的帮助,可使用 db2evtbl 命令。只需要提供事件监视器的名称和需要的事件类型,就会生成 CREATE EVENT MONITOR 语句,完成所有目标表列表。然后,您可复制所生成语句,进行修改,然后通过命令行处理器执行该语句。

过程

要创建将其输出写至常规表的事件监视器,请执行以下步骤:

  1. 构造 CREATE EVENT MONITOR 语句并使用 WRITE TO TABLE 子句来指示要在一个表(或一组表)中收集事件监视数据。
    
    CREATE EVENT MONITOR evmon-name FOR eventtype
       WRITE TO TABLE
    其中 evmon-name 是事件监视器的名称,eventtype 是下列其中一个值:
    • ACTIVITIES
    • BUFFERPOOLS
    • CHANGE HISTORY
    • CONNECTIONS
    • DATABASE
    • DEADLOCKS
    • LOCKING
    • PACKAGE CACHE
    • STATEMENTS
    • STATISTICS
    • TABLE
    • TABLESPACE
    • THRESHOLD VIOLATIONS
    • TRANSACTIONS
    • UNIT OF WORK
    例如,要创建名为 myevmon 的工作单元事件监视器,请使用类似如下的语句:
    CREATE EVENT MONITOR myevmon FOR UNIT OF WORK
       WRITE TO TABLE
    以上语句创建工作单元事件监视器,该事件监视器对所收集的监视元素的逻辑组、对应输出表名和这些表的目标表空间使用缺省值。有关这些缺省值的更多信息,请参阅适当 CREATE EVENT MONITOR 语句的文档。
  2. 可选: 指定要对其收集数据的逻辑组。
    缺省情况下,会针对该事件监视器类型的所有逻辑数据组收集事件数据。如果仅需要收集所选逻辑组的数据,那么可在 CREATE EVENT MONITOR 语句中指定要包括的逻辑组的名称。例如,对于锁定事件监视器,您可能想要仅收集与 LOCK 和 PARTICIPANT 逻辑组相关联的信息。要仅包括这些逻辑组,可使用类似如下的语句:
    CREATE EVENT MONITOR mylocks FOR LOCKING 
       WRITE TO TABLE
       LOCK, PARTICIPANTS
                 
  3. 可选: 指定要用于输出表的表名。
    除非您另行指定,否则会对监视元素的每个逻辑组的表使用缺省名称。使用的缺省名称是通过将逻辑组名与事件监视器名并置派生的。例如,对于上一步中的语句创建的锁定事件监视器,所生成表的非限定名称为 LOCK_MYLOCKS 和 PARTICIPANTS_MYLOCKS。要覆盖缺省名称,请在指定逻辑组时包括要使用的表名:
    CREATE EVENT MONITOR mylocks FOR LOCKING 
       WRITE TO TABLE
       LOCK(TABLE LOCKDATA), PARTICIPANTS(TABLE PARTICIP)
    
    在上一示例中,用于 LOCK 和 PARTICIPANTS 逻辑组的表的名称为 LOCKDATA_MYLOCKS 和 PARTICIP_MYLOCKS。

    还可通过包括要使用的表空间的名称来覆盖要用于每个表的表空间:

    CREATE EVENT MONITOR mylocks FOR LOCKING 
      WRITE TO TABLE
      LOCK(TABLE LOCKDATA IN EVMONSPACE), PARTICIPANTS(TABLE PARTICIP IN EVMONSPACE)
    
    在上一示例中,同时将 EVMONSPACE 表空间用于这两个输出表。

其他选项

不同事件监视器提供不同配置选项。有关特定类型的事件监视器可用的选项的详细信息,请参阅对应要使用的事件监视器类型的 CREATE EVENT MONITOR 语句的文档。下面的示例显示您可针对不同事件监视器选择的一些配置选项:
使用单个事件监视器来捕获多个事件类型
对于某些类型1的事件监视器,可使用单个事件监视器来捕获不同类型的事件。如果要使用此事件监视器捕获多个类型的事件,请对 eventtype 指定用逗号分隔的附加值。例如,您可能想要在单个事件监视器中组合缓冲池监视和表空间监视:
CREATE EVENT MONITOR myevmon FOR BUFFERPOOLS, TABLESPACES
                     WRITE TO TABLE
此事件监视器将监视 BUFFERPOOL 和 TABLESPACE 事件类型。假定用户 dbadmin 发出了以上列出的语句,那么目标表的派生名称和表空间如下所示:
  • DBADMIN.BUFFERPOOL_MYEVMON
  • DBADMIN.TABLESPACE_MYEVMON
  • DBADMIN.CONTROL_,MYEVMON
调整事件监视器输出缓冲区的大小
可通过调整 BUFFERSIZE 值来改变某些类型1的事件监视器的表事件监视器缓冲区的大小(以 4K 页计)。例如,在以下语句中:
CREATE EVENT MONITOR myevmon FOR BUFFERPOOLS, TABLESPACES
                     WRITE TO TABLE BUFFERSIZE 8 
8 是两个事件表缓冲区的组合容量(以 4K 页计)。这加起来高达 32K 缓冲区空间,每个缓冲区 16K。

每个缓冲区的缺省大小为 4 页(分配两个 16K 缓冲区)。最小大小为 1 页。由于缓冲区是根据监视器堆进行分配,所以缓冲区的最大大小受该监视器堆大小限制。由于性能原因,活动频繁事件监视器的缓冲区应该比不活动事件监视器的缓冲区大。

控制事件监视器输出是已分块还是未分块
某些事件监视器1允许您控制事件监视器输出缓冲区变满时如何处理。对于分块事件监视器,如果事件缓冲区已满,那么生成事件的每个代理程序将等待事件缓冲区写至表。这可能会导致数据库性能降低,原因是暂挂的代理程序和所有从属代理程序在缓冲区清空之前不能运行。使用 BLOCKED 子句来确保事件数据不会丢失:
CREATE EVENT MONITOR myevmon FOR BUFFERPOOLS, TABLESPACES
                     WRITE TO TABLE BUFFERSIZE 8 BLOCKED
如果数据库性能比收集每个事件记录更重要,那么使用非分块事件监视器。在这种情况下,如果事件缓冲区已满,那么生成事件的每个代理程序将不会等待事件缓冲区写至表。因此,非分块事件监视器可能会导致活动频繁的系统上的数据丢失。使用 NONBLOCKED 子句来使事件监视导致的额外处理时间降至最少:
CREATE EVENT MONITOR myevmon FOR BUFFERPOOLS, TABLESPACES
                     WRITE TO TABLE BUFFERSIZE 8 NONBLOCKED
控制对其收集数据的监视元素
要对其收集数据的监视元素。如果您仅关心几个监视元素,那么可通过在 CREATE EVENT MONITOR 语句中指定元素名称来对某些事件监视器1指定要收集的监视元素:

CREATE EVENT MONITOR myevmon FOR DATABASE, BUFFERPOOLS, TABLESPACES
              WRITE TO TABLE DB, DBMEMUSE,
              BUFFERPOOL (EXCLUDES(db_path, files_closed)),
              TABLESPACE (INCLUDES
                (tablespace_name, direct_reads, direct_writes))
              BUFFERSIZE 8 NONBLOCKED 

将捕获 DB 和 DBMEMUSE 逻辑数据组的所有监视元素(这是缺省行为)。对于 BUFFERPOOL,会捕获除 db_pathfiles_closed 以外的所有监视元素。 最后,对于 TABLESPACE,仅捕获 tablespace_namedirect_readsdirect_writes 监视元素。

设置根据所使用表空间取消激活事件监视器的阈值
所有事件监视器都提供了一个选项,用于指定事件监视器自动取消激活前表空间可达到的充满程度:
CREATE EVENT MONITOR myevmon FOR BUFFERPOOLS, TABLESPACES
                     PCTDEACTIVATE 90
                     

如果表空间已使用 90% 的容量,那么 myevmon 事件监视器会自动关闭。PCTDEACTIVATE 子句只能用于 DMS 表空间。如果目标表空间已启用自动调整大小,那么将 PCTDEACTIVATE 子句设置为 100。

下一步做什么

缺省情况下,V9.7 或更高版本中引入的事件监视器会创建为 AUTOSTART 事件监视器。数据库下次激活时以及此后后续数据库激活时,它们会自动激活。如果要立即激活该事件监视器,请在下一次数据库激活之前使用 SET EVENT MONITOR STATE 语句来手动启动该事件监视器。此外,对于锁定事件监视器、工作单元事件监视器和程序包高速缓存事件监视器中的每一个,还必须启用数据收集。
1 BUFFERPOOLS、CONNECTIONS、DATABASE、DEADLOCKS、STATEMENTS、TABLES 和 TABLESPACES 支持此选项。