管理目标表、控制表和事件监视器表
可定义事件监视器以使它将其事件记录存储在 SQL 表中。为此,应将 CREATE EVENT MONITOR 语句与 WRITE TO TABLE 子句配合使用。
如果创建“写至表”事件监视器,那么该事件监视器将创建目标表以存储每个返回数据的逻辑数据组的记录。在每个表中,列名必须与它们表示的监视元素名称相匹配。缺省情况下,该事件监视器会在事件监视器创建者的模式下创建表,并通过将它们的对应逻辑数据组名称与事件监视器名称并置来命名这些表。
CREATE EVENT MONITOR test FOR STATEMENTS WRITE TO TABLE使用 STATEMENTS 事件类型的事件监视器从 event_connheader、event_stmt 和 event_subsection
逻辑数据组收集数据。系统会创建表示特定于各事件类型的逻辑数据组的表,并为每个“写至表”事件监视器创建一个控制表。对于用户 riihi 创建的事件监视器 test,数据库管理器会创建以下表:- riihi.connheader_test
- riihi.stmt_test
- riihi.subsection_test
- riihi.control_test
仅对于非受阻事件监视器,才会将监视元素写至溢出组。对于非分块事件监视器,如果事件缓冲区已满,那么生成事件的代理程序不会等待将事件缓冲区写入表。如果从代理程序接收监视数据的速度超过了事件监视器写入数据的速度,那么生成事件的代理程序将废弃这些监视数据。在这种情况下,事件监视器会在控制表中记录信息,以指出发生了溢出。此信息中包括 message
监视元素,如果发生了溢出,那么此监视元素中包含文本 OVERFLOW:n,其中 n 表示由于事件缓冲区已满而被废弃的事件记录数。
每当“写至表”事件监视器激活时,它都会获取针对每个目标表的 IN 或 IX 表锁定,以避免事件监视器处于活动状态时修改该表。在事件监视器处于活动状态时会维护所有表上的表锁定。如果需要针对任何目标表的互斥访问(例如,以运行实用程序),那么系统会在尝试这类访问前取消激活事件监视器以释放表锁定。
目标表中的每个列名与一个事件监视元素标识相匹配。将忽略没有相应目标表列的事件监视元素。
CREATE EVENT MONITOR conn_monitor FOR CONNECTIONS WRITE TO TABLE
CONN(INCLUDES(lock_waits))您可能不希望缺省表空间内的缺省模式中包括某个事件监视器的具有缺省表名的目标表。如果预期会有大量监视数据时,那么您可能想要目标表放在它们自己的表空间中。可对 CREATE EVENT MONITOR 语句指定模式名、表名和表空间名。模式名和表名形成表的派生名称。可使用可选 IN 子句在表名后添加表空间名。与数据库管理器自动创建的目标表不同,如果事件监视器定义中包含某个表空间,那么该表空间必须已存在。如果未指定表空间,那么系统将指定您对其具有 USE 特权的表空间。
一个目标表只能由一个事件监视器使用。如果对另一个事件监视器定义了目标表,或者因为任何其他原因而不能创建该目标表,那么 CREATE EVENT MONITOR 语句失败。
可使用可选 IN 子句在表名后添加表空间名。与数据库管理器自动创建的目标表不同,如果事件监视器定义中包含某个表空间,那么该表空间必须已存在。如果没有指定表空间,那么将指定定义者对其具有 USE 特权的表空间。
在分区数据库环境中,“写至表”事件监视器只有在包含该事件监视器表的表空间所在的数据库分区上才处于活动状态。如果特定数据库分区上没有处于活动状态的事件监视器的目标表空间,那么系统将对该数据库分区取消激活此事件监视器,同时会向 db2diag 命令日志文件写入错误。
为了在检索事件监视数据时提高性能,可为事件表创建索引。如果添加了触发器、关系完整性和约束之类的表属性,那么该事件监视器会将它们忽略。
CREATE EVENT MONITOR test FOR STATEMENTS
WRITE TO TABLE CONNHEADER,
STMT (TABLE mydept.statements),
SUBSECTION (TABLE subsections, IN mytablespace) 假定用户
riihi 发出了上述语句,那么目标表的派生名称和表空间如下所示:- CONNHEADER:缺省表空间中的 riihi.connheader_test
- STMT:缺省表空间中的 mydept.statements
- SUBSECTION:mytablespace 表空间中的 riihi.subsections
对于活动的“写至表”事件监视器,可能会有存储事件记录的表空间用完容量的风险。为针对 DMS 表空间控制此风险,可定义一个百分比,表空间容量达到此百分比时会取消激活事件监视器。可在 CREATE EVENT MONITOR 语句的 PCTDEACTIVATE 子句中指定此值。对于 SMS 表空间,此值设置为 100。如果已对目标表空间启用 Autoresize 功能,那么应该将 PCTDEACTIVATE 值设置为 100。
在非分区数据库环境中,所有“写至表”事件监视器都会在最后一个应用程序终止(并且数据库未显式激活)时取消激活。在分区数据库环境中,“写至表”事件监视器将在目录分区取消激活时取消激活。