数据库监控是一项重要的活动,若将其作为日常活动来执行,将连续提供数据库系统健康状况的反馈信息。正由于数据库监控是数据库管理的完整组成部分,DB2 9 提供了一种称为数据库系统监控器的监控实用工具。尽管其名称 “数据库系统监控器” 似乎表示仅提供了一种监控工具,但实际上,数据库系统监控器由两种不同的工具组成,可用于捕获和返回系统监控信息:一个快照监控器 和一个或多个事件监控器。快照监控器允许您捕获特定时间点的数据库状态图,而事件监控器在特定数据库事件发生时捕获并记录数据。这两种工具所收集的数据均存储在称为监控元素(或数据元素)的实体中。所使用的各监控元素通过惟一的名称标识,且均设计用于容纳特定类型的信息。以下类型的元素用于存储监控数据:
- 计数器(Counter)。计数器保存活动或事件已发生的次数。在监控器的整个生命周期中,计数器值逐渐增加;通常,计数器监控元素是可重置的。为某个数据库执行的 SQL 语句总数就是计数器元素的一个示例。
- 计量器(Gauge)。计量器保存在特定时间点发生的活动或事件的次数。与计数器值不同,计量器值可增加,也可减少,计量器在给定时间点的值通常取决于数据库活动的级别。当前连接到某个数据库的应用程序数量就是计量器元素的一个示例。
- 水位标(Watermark)。水位标表示自监控开始以来观测到的最高(最大)或最低(最小)值。更新操作所影响的最大行数就是水位标元素的一个示例。
- 信息(Information)。顾名思义,信息元素提供所执行的全部监控活动的引用类型细节。信息元素的示例包括缓冲池名称、数据库名称和别名、路径详细信息等。
- 时间戳(Timestamp)。时间戳表示活动或事件发生的日期和时间。时间戳值以 1970 年 1 月 1 日后流逝的秒和微秒数形式提供。与数据库的第一个连接的建立日期和时间就是一个时间戳元素的示例。
- 时间(Time)。时间元素保存执行一个活动或事件所花费的时间。时间值以自活动或事件开始以后流逝的秒和微秒数形式提供,有些时间元素是可重置的。执行一次排序操作所花费的时间就是一个时间元素的示例。
数据库系统监控器可利用上述元素的任意组合来捕获监控数据,一旦收集完成,即可使用一些方法为快照监控器和事件监控器展示所用各元素中存储的数据,您可以选择将收集到的所有数据存储在文件或数据库表中,在屏幕上查看,或使用定制应用程序进行处理。(数据库系统监控器使用自我描述的数据流将监控数据返回给客户机应用程序。使用快照监控应用程序,您可调用恰当的快照 API,捕获快照,然后处理所返回的数据流;使用事件监控应用程序,您可准备好通过文件或指定管道接收所生成的数据,激活适当的事件监控器,并在接收到数据流时对其加以处理。)
快照监控器
快照监控器设计用于收集 DB2 UDB 实例及其控制的数据库在特定时间点(换言之,就是在捕获到快照时)的相关状态信息。快照对于确定一个数据库系统的状态非常有用,若按固定时间间隔捕获,则可提供能用于观测发展趋势并识别潜在问题领域的宝贵信息。要捕获快照,可在 DB2 Command Line Processor(CLP)中执行 GET SNAPSHOT 命令,方法是在查询中使用恰当的快照表函数或在 C、C++ 应用程序中使用快照监控器 API。此外,还可根据具体需求打造快照,以便返回特定类型的监控数据值(例如,可将一个快照配置为仅返回与缓冲池相关的信息)。
快照监控器开关
通常情况下,收集系统监控数据需要额外的处理开销。例如,为了计算 SQL 语句的执行时间,DB2 Database Manager 必须调用操作系统,获取 SQL 语句执行之前和之后的时间戳。此类系统调用的成本高昂。使用系统监控器的另外一个副作用就是所消耗的内存量大大增加 —— DB2 Database Manager 要使用内存来存储为系统监控器所追踪的各监控元素收集的数据。
为帮助最小化与收集系统监控信息相关的开销,可使用一组称为快照监控器开关 的开关,控制在捕获快照时收集哪些信息,通过这些快照监控器开关的设置方式来确定所收集的信息类型与数量。各快照监控器开关都有两种设置:ON 和 OFF。将一个快照监控器开关设置为 OFF 时,受此开关控制的元素的监控信息不予收集。若开关设置为 ON,则情况恰好相反。(切记,有大量监控信息不受开关控制,无论快照监控器开关如何设置,这些信息总是会被收集。)表 1 列出了可用的快照监控器开关,还给出了各开关设置为 ON 时所收集的信息类型的描述。
表 1. 快照监控器开关
监控器组 |
监控器开关 |
DBM 配置参数 |
所提供的信息 |
缓冲池 |
BUFFERPOOL |
dft_mon_bufferpool |
缓冲池活动的数量(换言之,即所执行的读取和写入操作的数量,以及各次读/写操作所用时间)。 |
锁 |
LOCK |
dft_mon_lock |
具有的锁数量,以及遇到的死锁循环数量。 |
排序 |
SORT |
dft_mon_sort |
所执行的排序操作数量、使用的堆数量、遇到的溢出数、排序性能。 |
SQL 语句 |
STATEMENT |
dft_mon_stmt |
SQL 语句处理开始时间、SQL 语句处理结束时间、SQL 语句标识。 |
表 |
TABLE |
dft_mon_table |
所执行的表活动数量,例如读取的行数、写入的行数等。 |
时间戳 |
TIMESTAMP |
dft_mon_timestamp |
时间和时间戳信息。 |
事务 |
UOW |
dft_mon_uow |
事务开始时间、事务结束时间以及事务的完成状态。 |
默认情况下,表 1 中的所有开关均设置为 OFF,TIMESTAMP 开关是个例外,其默认设置为 ON,并在一个实例初次启动时初始化。
查看当前快照监控器开关设置
前面已经提到,在捕获快照时,所收集的信息类型和数量在某种程度上是可以控制的 —— 通过设置快照监控器开关实现。在您捕获快照之前,应了解哪些快照监控器开关已打开,而哪些快照监控器开关依然是关闭的,这一点非常重要。如何才能了解各可用快照监控器开关的当前设置呢?最简单的方法就是在 DB2 Command Line Processor(CLP)中执行 GET MONITOR SWITCHES 命令。此命令的基本语法是:
GET MONITOR SWITCHES
其中的 PartitonNum 标识要为其获取并显示可用快照监控器开关状态的数据库分区(在多分区数据库环境中)。
注意:尖括号(< >)中的参数是可选的;方括号([ ])中的参数或选项是必需的;而逗号后接省略号(...)则表示之前的参数可重复使用多次。
如果您希望为单分区数据库获取并显示快照监控器开关状态,可执行 GET MONITOR SWITCHES 命令,方式如下:
GET MONITOR SWITCHES
在 Command Line Processor 中执行此命令时,您应看到形式如下的输出结果。
GET MONITOR SWITCHES 命令的输出
Monitor Recording Switches
Switch list for db partition number 0
Buffer Pool Activity Information (BUFFERPOOL) = OFF
Lock Information (LOCK) = OFF
Sorting Information (SORT) = OFF
SQL Statement Information (STATEMENT) = OFF
Table Activity Information (TABLE) = OFF
Take Timestamp Information (TIMESTAMP) = ON 06-12-2006 10:30:00.028810
Unit of Work Information (UOW) = OFF
观察上述输出后,您会立即注意到 TIMESTAMP 快照监控器开关已打开,而其他所有开关均为关闭。紧接于 TIMESTAMP 监控器开关状态之后的时间戳值可以告诉您 TIMESTAMP 监控器开关被打开的准确日期和时间(本例中为 2006 年 6 月 12 日上午 10:30)。
更改快照监控器开关的状态
了解哪些快照监控器开关被设置为 ON、哪些快照监控器开关被设置为 OFF 之后,您可能会发现,在开始监控过程之前,有必要更改一个或多个开关的设置。快照监控器开关设置可在实例级更改,方法是通过 UPDATE DATABASE MANAGER CONFIGURATION 命令修改适当的 DB2 Database Manager 配置参数(参见表 1)。
另一方面,快照监控器开关设置也可在应用程序级更改,方法是执行 UPDATE MONITOR SWITCHES 命令。此命令的基本语法是:
UPDATE MONITOR SWITCHES USING [[SwitchID] ON | OFF ,...]
其中的 SwitchID 表示要为之更改状态的一个或多个快照监控器开关。此参数可包含以下任意或全部值:BUFFERPOOL、LOCK、SORT、STATEMENT、TABLE、TIMESTAMP 以及 UOW。
如果您希望在应用程序级将 LOCK 快照监控器开关的状态更改为 ON,可执行 UPDATE MONITOR SWITCHES 命令,如下所示:
UPDATE MONITOR SWITCHES USING LOCKS ON
类似地,如果您希望将 BUFFERPOOL 快照监控器开关设置为 OFF,也可执行一条 UPDATE MONITOR SWITCHES 命令,如下所示:
UPDATE MONITOR SWITCHES USING BUFFERPOOL OFF
在实例级设置快照监控器开关(使用 UPDATE DATABASE MANAGER CONFIGURATION 命令)将影响到受此实例控制的所有数据库(也就是说,所有与该实例控制的一个数据库建立了连接的应用程序都将继承实例配置中的开关设置)。此外,在实例级做出的快照监控器开关设置在实例重启后依然保留。
在应用程序级设置快照监控器开关(使用 UPDATE MONITOR SWITCHES 命令)仅影响到与这一个应用程序交互的数据库。此外,开关设置仅在此应用程序的生命周期内持续。
捕获快照监控数据
只要数据库被激活或与数据库的连接建立起来,快照监控器立即开始收集监控数据。但在所收集到的任何数据能够被查看之前,必须捕获快照(快照实际上就是一张关于所用监控元素在特定时间点的形式的图片)。可通过在应用程序中嵌入 db2GetSnapshot() API 捕获快照,也可通过执行 GET SNAPSHOT 命令捕获。此命令的基本语法是:
GET SNAPSHOT FOR
[DATABASE MANAGER | DB MANAGER | DBM] |
ALL DATABASES |
ALL APPLICATIONS |
ALL BUFFERPOOLS |
ALL REMOTE_DATABASES |
ALL REMOTE_APPLICATIONS |
ALL ON [DatabaseAlias] |
DATABASE ON [DatabaseAlias] |
APPLICATIONS ON [DatabaseAlias] |
TABLES ON [DatabaseAlias] |
TABLESPACES ON [DatabaseAlias] |
LOCKS ON [DatabaseAlias] |
BUFFERPOOLS ON [DatabaseAlias] |
DYNAMIC SQL ON [DatabaseAlias]
其中的 DatabaseAlias 表示将为其收集快照监控器信息的那个数据库被指派的别名。
在捕获快照时,如果您希望其中仅包含在与 PAYROLL 数据库交互的应用程序所拥有的锁上收集的数据,可通过执行以下命令来实现:
GET SNAPSHOT FOR LOCKS ON PAYROLL
此命令产生的输出结果应与以下示例类似。(务必牢记,这只是一个简单的示例。实际的监控环境往往会生成大批数据。)
GET SNAPSHOT 命令输出示例
Database Lock Snapshot
Database name = PAYROLL
Database path = C:\DB2\NODE0000\SQL00002\
Input database alias = PAYROLL
Locks held = 2
Applications currently connected = 1
Agents currently waiting on locks = 0
Snapshot timestamp = 06-12-2004 08:39:40.750316
Application handle = 8
Application ID = *LOCAL.DB2.00E286133931
Sequence number = 0001
Application name = db2bp.exe
CONNECT Authorization ID = DB2ADMIN
Application status = UOW Waiting
Status change time = Not Collected
Application code page = 1252
Locks held = 2
Total wait time (ms) = Not Collected
List Of Locks
Lock Name = 0x94928D848F9F949E7B89505241
Lock Attributes = 0x00000000
Release Flags = 0x40000000
Lock Count = 1
Hold Count = 0
Lock Object Name = 0
Object Type = Internal P Lock
Mode = S
Lock Name = 0x96A09A989DA09A7D8E8A6C7441
Lock Attributes = 0x00000000
Release Flags = 0x40000000
Lock Count = 1
Hold Count = 0
Lock Object Name = 0
Object Type = Internal P Lock
Mode = S
如您所见,GET SNAPSHOT 命令可用于捕获几种不同类型的监控数据,包括:
- DB2 Database Manager 实例数据
- 受一个实例控制的所有活动数据库的数据库数据
- 应用程序数据
- 缓冲池活动数据
- 表空间数据
- 表数据
- 锁数据(关于具有的所有锁的信息)
- 动态 SQL 数据(SQL 语句缓存器在某个时间点所具有的 SQL 语句的相关信息)
或许您已注意到,可用快照监控器开关与捕获快照时可收集的监控数据的各种类型之间有着直接关系。若将特定快照监控器开关关闭,再捕获与此开关相关的监控元素的快照,则所捕获到的监控数据将不包含任何值。(在前面的数据中,所列出的部分值为 Not Collected,这正是因为其对应的快照监控器开关已关闭。此外,若在捕获快照时未获得任何锁,则 Locks held 的值将为 0, List of Locks 信息则根本不会出现。)
使用 SQL 捕获快照监控数据
在 DB2 UDB 的较早版本中,捕获快照监控数据的惟一途径就是执行 GET SNAPSHOT 命令或在应用程序中调用其相应的 API。在 DB2 UDB V8.1 中,引入了通过构建查询捕获快照监控数据的能力。这种方法依赖于 20 个特殊快照监控器表函数,在 V9.1 中,这些函数的作用已被弱化。现在,可使用一组全新的 SQL 例程来访问特殊管理视图中存储的数据,通过这种方法来获取快照监控数据。表 2 介绍了这些例程和视图。
表 2. 快照管理 SQL 例程和视图
管理视图 |
例程 |
描述 |
APPLICATIONS |
N/A |
这一管理视图包括连接的数据库应用程序的相关信息。 |
APPL_PERFORMANCE |
N/A |
这一管理视图包含选定行与各应用程序读取行数的比率。 |
BP_HITRATIO |
N/A |
这一管理视图包含缓冲池的命中率,包括总体、数据和索引。 |
BP_READ_IO |
N/A |
这一管理视图包含缓冲池的读取性能信息。 |
BP_WRITE_IO |
N/A |
这一管理视图包含缓冲池的写入性能信息。 |
CONTAINER_UTILIZATION |
N/A |
这一管理视图包含表空间容器和利用率的相关信息。 |
LOCKS_HELD |
N/A |
这一管理视图包含当前具有的锁的相关信息。 |
LOCKWAITS |
N/A |
这一管理视图包含等待授权的锁的信息。 |
LOG_UTILIZATION |
N/A |
这一管理视图包含关于当前连接的数据库的日志利用情况的信息。 |
LONG_RUNNING_SQL |
N/A |
这一管理视图包含当前连接的数据库中运行时间最长的 SQL 语句的相关信息。 |
QUERY_PREP_COST |
N/A |
这一管理视图包含一个 SQL 语句列表,以及关于各语句准备所需时间的信息。 |
N/A |
SNAP_WRITE_FILE |
此过程将系统快照数据写入实例目录的 tmp 子目录中的一个文件。 |
SNAPAGENT |
SNAP_GET_AGENT |
该管理视图和表函数返回应用程序快照的代理信息,特别是 agent 逻辑数据组。 |
SNAPAGENT_MEMORY_POOL |
SNAP_GET_AGENT_MEMORY_POOL |
该管理视图和表函数返回代理级的内存使用信息。 |
SNAPAPPL |
SNAP_GET_APPL |
该管理视图和表函数返回应用程序快照的应用程序信息,特别是 appl 逻辑数据组。 |
SNAPAPPL_INFO |
SNAP_GET_APPL_INFO |
该管理视图和表函数返回应用程序快照的应用程序信息,特别是 appl_info 逻辑数据组。 |
SNAPBP |
SNAP_GET_BP |
该管理视图和表函数返回缓冲池快照的缓冲池信息,特别是 bufferpool 逻辑数据组。 |
SNAPBP_PART |
SNAP_GET_BP_PART |
该管理视图和表函数返回缓冲池快照的缓冲池信息,特别是 bufferpool_nodeinfo 逻辑数据组。 |
SNAPCONTAINER |
SNAP_GET_CONTAINER_V91 |
该管理视图和表函数返回 tablespace_container 逻辑数据组的表空间快照信息。 |
SNAPDB |
SNAP_GET_DB_V91 |
该管理视图和表函数返回数据库(dbase)和数据库存储(db_storaeg_group)逻辑分组的快照信息。 |
SNAPDB_MEMORY_POOL |
SNAP_GET_DB_MEMORY_POOL |
该管理视图和表函数返回数据库级内存使用情况的信息,仅用于 UNIX(R) 平台。 |
SNAPDBM |
SNAP_GET_DMB |
该管理视图和表函数返回快照监控器 DB2 数据库管理器(dbm)逻辑分组信息。 |
SNAPDBM_MEMORY_POOL |
SNAP_GET_DBM_MEMORY_POOL |
该管理视图和表函数返回数据库管理器级的内存使用情况信息。 |
SNAPDETAILLOG |
SNAP_GET_DETAILLOG_V91 |
该管理视图和表函数返回 detail_log 逻辑数据组的快照信息。 |
SNAPDYN_SQL |
SNAP_GET_DYN_SQL_V91 |
该管理视图和表函数返回 dynsql 逻辑数据组的快照信息。 |
SNAPFCM |
SNAP_GET_FCM |
该管理视图和表函数返回数据库管理器快照的快速通信管理器(FCM)相关信息,特别是 fcm 逻辑数据组。 |
SNAPFCM_PART |
SNAP_GET_FCM_PART |
该管理视图和表函数返回数据库管理器快照的快速通信管理器(FCM)相关信息,特别是 fcm_node 逻辑数据组。 |
SNAPHADR |
SNAP_GET_HADR |
该管理视图和表函数返回数据库快照的高可用性灾难恢复信息,特别是 hadr 逻辑数据组。 |
SNAPLOCK |
SNAP_GET_LOCK |
该管理视图和表函数返回关于锁的快照信息,特别是 lock 逻辑数据组。 |
SNAPLOCKWAIT |
SNAP_GET_LOCKWAIT |
该管理视图和表函数返回管理锁等待的快照信息,特别是 lockwait 逻辑数据组。 |
SNAPSTMT |
SNAP_GET_STMT |
该管理视图和表函数返回应用程序快照的语句信息。 |
SNAPSTORAGE_PATHS |
SNAP_GET_STORAGE_PATHS |
该管理视图和表函数从 db_storage_group 逻辑数据组中为数据库返回一个自动存储路径列表,特别还包括各存储路径的文件系统信息。 |
SNAPSUBSECTION |
SNAP_GET_SUBSECTION |
该管理视图和表函数返回关于应用程序子段的信息,也就是子段逻辑监控分组。 |
SNAPSWITCHES |
SNAP_GET_SWITCHES |
该管理视图和表函数返回关于数据库快照开关状态的信息。 |
SNAPTAB |
SNAP_GET_TAB_V91 |
该管理视图和表函数返回 table 逻辑数据组中的快照信息。 |
SNAPTAB_REORG |
SNAP_GET_TAB_REORG |
该管理视图和表函数返回表重组信息。 |
SNAPTBSP |
SNAP_GET_TBSP_V91 |
该管理视图和表函数返回 tablespace 逻辑数据组的快照信息。 |
SNAPTBSP_PART |
SNAP_GET_TBSP_PART_V91 |
该管理视图和表函数返回 tablespace_nodeinfo 逻辑数据组的快照信息。 |
SNAPTBSP_QUIESCER |
SNAP_GET_TBSP_QUIESCER |
该管理视图和表函数返回表空间快照的 quiescer 信息。 |
SNAPTBSP_RANGE |
SNAP_GET_TBSP_RANGE |
该管理视图和表函数返回一个 range 快照的信息。 |
SNAPUTIL |
SNAP_GET_UTIL |
该管理视图和表函数返回 utility_info 逻辑数据组在实用工具方面的快照信息。 |
SNAPUTIL_PROGRESS |
SNAP_GET_UTIL_PROGRESS |
该管理视图和表函数返回关于实用工具进展的信息,特别是 progress 逻辑数据组。 |
TBSP_UTILIZATION |
N/A |
这一管理视图中包含表空间配置和利用率信息。 |
TOP_DYNAMIC_SQL |
N/A |
这一管理视图中包含可按执行次数、平均执行时间、排序次数或各语句分类排序的顶级动态 SQL 语句。 |
举例来说,如果您希望为当前连接的数据库获取锁信息,可执行类似于下面这样的查询:
SELECT AGENT_ID, LOCK_OBJECT_TYPE, LOCK_MODE, LOCK_STATUS
FROM SYSIBMADM.SNAPLOCK
SNAP_GET_LOCK 表函数返回与 SNAPLOCK 管理视图相同的信息,但允许您为特定数据库或特定数据库分区(而非当前连接的数据库)上的特定数据库检索信息。使用 SNAP_GET_LOCK 表函数的查询形式如下:
SELECT AGENT_ID, LOCK_OBJECT_TYPE, LOCK_MODE, LOCK_STATUS
FROM TABLE(SNAP_GET_LOCK('',-1)) AS T
在使用 SNAP_GET_LOCKWAIT 表函数时,SNAP_GET_LOCK 表函数提供的信息与 GET SNAPSHOT FOR LOCKS ON [DatabaseAlias] 命令相同。
重置快照监控器计数器
上文已经介绍过,监控元素用于存储数据的一种元素就是计数器,计数器持续保存活动或事件发生的总次数。计数器值在监控器的整个生命周期中是逐渐增加的。那么计数开始的准确时间是什么?典型情况下,打开快照监控器开关或建立数据库连接时,计数便立即开始(若使用的是实例级监控,则计数在应用程序第一次建立起与该实例控制的数据库的连接时开始)。但有时您可能希望将所有计数器重置为 0,而且不想先关闭快照监控器开关,之后再打开,也不希望终止并重新建立数据库连接。目前,将所有快照监控器计数器迅速重置为 0 的最简便的方法就是执行 RESET MONITOR 命令。此命令的基本语法是:
RESET MONITOR ALL
或
RESET MONITOR FOR [DATABASE | DB] [DatabaseAlias]
其中 DatabaseAlias 表示将为之重置快照监控器计数器的数据库的别名。
如果您希望将一个实例所控制的所有数据库的快照监控器计数器均重置为 0,可以连接到该实例,然后执行一条 RESET MONITOR 命令,如下所示:
RESET MONITOR ALL
另一方面,如果您只希望将与 SAMPLE 数据库相关的快照监控器计数器重置为 0,也可以通过执行 RESET MONITOR 命令实现,如下所示:
RESET MONITOR FOR DATABASE SAMPLE
这里有一个需注意的重点,对于一个由快照监控器开关控制的特殊监控组,您不能使用 RESET MONITOR 命令选择性地为其重置计数器。要执行此类操作,您必须关闭恰当的监控器开关,然后再打开,或者终止并重新建立数据库连接。