监控 DB2 活动之捕获事件监控数据


  事件监控器

  DB2数据库快照监控器提供了一种捕获并记录实例或数据库在特定时间点的状态信息的方法。与之不同,事件监控器在特定事件或事务发生时收集监控数据。事件监控器提供了一种在发生了无法使用快照监控器监控的事件或活动时收集数据的途径。

  例如,假设您希望只要出现死锁循环,就捕获监控数据。若您熟知死锁的概念,就会了解,一种称为死锁探测器(守护程序)的特殊进程默默地在后台运行,按预定义的时间间隔 “苏醒” 过来,在锁定系统中扫描死锁循环。如果找到了一个死锁循环,死锁探测器随机选择、回滚并终止此循环涉及到的一个事务。从而使被选中的事务接收到一个 SQL 错误代码,所有为此事务而获得的锁都将被释放,以便使其余事务得到处理。这样一系列的事件无法被快照监控器捕获,这是因为往往在死锁循环发生了很长时间以后,才能捕获快照。而事件监控器将在探测到死锁循环时立即激活,因而能捕获诸如此类事件的重要信息。

  两种监控器之间还有另外一个显著的差异:快照监控器作为后台进程而存在,一旦建立起到数据库的连接,就立即开始捕获监控数据。反之,事件监控器在使用之前必须明确创建。可以存在多个不同的事件监控器,各事件监控器仅在特定类型的事件或事务发生时被激活。表 3 展示了可导致事件监控器被激活的事件类型,另外还列出了为各事件类型收集的监控数据类型。

表3. 事件类型和为各类型收集的数据

事件类型 所收集的数据 何时收集数据 关联组(目标表)名称
DATABASE 所有数据库级计数器的值 数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 DB、CONTROL
BUFFERPOOLS 各缓冲池所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 BUFFERPOOL、CONTROL
TABLESPACES 各表空间所用的全部缓冲池计数器、预获取器和页面清除器的值,以及直接 I/O 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLESPACE、CONTROL
TABLES 各表读取及写入的行数 在数据库被取消激活状态时,或在最后一个连接到数据库的应用程序断开时 TABLE、CONTROL
DEADLOCKS 关于所涉应用程序的全面信息,包括涉及的全部 SQL 语句的标识(及语句文本)以及各语句具有的锁列表 探测到死锁循环时 CONNHEADER、DEADLOCK、DLCONN、DLLOCK、CONTROL
CONNECTIONS 所有应用程序级计数器的值 一个连接到数据库的应用程序断开时 CONNHEADER、CONN、CONTROL
STATEMENTS 语句的开始/停止时间、CPU 占用量、动态 SQL 语句的文本、SQLCA(SQL语句的返回代码),以及获取数量等指标。对于分区的数据库:CPU 占用量、执行时间、表信息、表队列信息 SQL 语句执行完毕时;对于分区的数据库,则为 SQL 语句的子段执行完毕时 CONNHEADER、STMT、SUBSECTION、CONTROL
TRANSACTIONS 事务开始/结束时间、前一事务处理时间、CPU 占用量,以及锁定和日志记录指标(若数据库使用分为两个阶段的提交处理和 X/Open XA Interface,则不生成事务记录) 事务处理终止时(通过 COMMIT 或 ROLLBACK 语句) CONNHEADER、XACT、CONTROL

  由于事件监控器是特殊的数据库对象,必须首先创建,之后才能使用,因而只能为那些定义了事件监控器的数据库中发生的事件或事务收集监控数据。事件监控器不能用于在实例级收集监控数据。

  创建事件监控器

  您可在 Control Center 中(从 Event Monitors 菜单中选择 Create Event Monitor)直接创建事件监控器,也可通过执行 CREATE EVENT MONITOR SQL 语句创建。此语句的基本语法是:

  CREATE EVENT MONITOR [Name]

  FOR [DATABASE | BUFFERPOOLS | TABLESPACES | TABLES | DEADLOCKS |

  CONNECTIONS |

  STATEMENTS |

  TRANSACTIONS , ...]

  WRITE TO [TABLE [GroupName] (TABLE [TableName]) | PIPE [PipeName] | FILE [DirectoryName]]

  [MANUALSTART | AUTOSTART]

  其中:

  Name 表示指派给所创建的事件监控器的名称。

  EventCondition 表示一个条件,用于确定事件监控器为哪些 CONNECTION、STATEMENT 或 TRASACTION 收集数据。

  GroupName 表示目标表为之定义的逻辑数据组(关于此参数可用的恰当值,请参见表 3)。

  TableName 表示为所有事件监控数据将写入的数据库表指派的名称。

  PipeName 表示为所有事件监控数据将写入的命名管道指派的名称。

  DirectoryName 表示包含被写入的事件监控数据的一个或多个文件的目录被指派的名称。

  假设您希望创建一个事件监控器,捕获所有应用程序级计数器的值,并在每次一个应用程序终止与数据库的连接时将其写入名为 CONN_DATA 的数据库表。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

  CREATE EVENT MONITOR CONN_EVENTS FOR CONNECTIONS WRITE TO TABLE CONN (TABLE CONN_DATA)

  再假设您希望创建一个事件监控器,为缓冲池和表空间事件捕获监控数据,并将收集到的所有数据写入名为 /export/home/bpts_data 的目录。为此,执行 CREATE EVENT MONITOR 语句,方法如下:

  CREATE EVENT MONITOR BPTS_EVENTS FOR BUFFERPOOLS, TABLESPACES WRITE TO FILE '/export/home/BPTS_DATA'

  可以看到,在创建事件监控器时,您必须指定将导致事件监控器被激活的事件类型,还要指定写入收集到的所有数据的位置。

  事件监控器的输出可写入一个或多个数据库表、一个或多个外部文件或命名管道中。表和管道事件监控器将事件直接记录到指定的表或命名管道中。另一方面,文件事件监控器将事件记录到一系列以 8 个字符编号的文件中,此类文件的扩展名为 .evt(例如,00000000.evt、00000001.evt 等等)。存储在这些文件中的数据可作为存储在单独文件中的单独数据流处理,尽管数据实际上被分割为多个小部分(数据流的开始部分是可在名为 00000000.evt 的文件中找到的第一个字节,而数据流的末尾是所创建的最后一个文件中的最后一个字节)。

  若您指定,事件监控器的输出将存储在数据库表中,则在 CREATE EVENT MONITOR 语句执行时,所有目标表都将自动创建。(若出于某些原因,表创建失败,将生成一个错误代码,且 CREATE EVENT MONITOR 语句失败。)但若您指定,事件监控器的输出将写入一个或多个外部文件或命名管道中,则指定的输出目录或命名管道必须已经存在,DB2 Database Manager 实例的所有者必须能够在事件监控器被激活时对其执行写入操作。此外,若使用了命名管道,监控命名管道的应用程序必须正在运行,且在事件监控器激活之前,必须已有一个打开的管道可进行读取操作。


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3