快照监视器
快照监视器概述
在数据库管理器级别,可以通过数据库管理器配置参数来设置监视器开关。
要查看所有用于开关设置的设置选项,使用get dbm cfg | grep DFT_MON命令。
[db2inst1@db22 Desktop]$ db2 get dbm cfg| grep DFT_MON
Buffer pool (DFT_MON_BUFPOOL) = OFF
Lock (DFT_MON_LOCK) = OFF
Sort (DFT_MON_SORT) = OFF
Statement (DFT_MON_STMT) = OFF
Table (DFT_MON_TABLE) = OFF
Timestamp (DFT_MON_TIMESTAMP) = ON
Unit of work (DFT_MON_UOW) = OFF
要启用或禁用数据库管理器级别的监视器开关设置,使用UPDATE DBM CFG
命令,并指定要修改的个别监视器开关。
例如,以下命令关闭了DFT_MON_TIMESTAMP监视器,来终止时间戳记监视器数据的收集:
db2 update dbm cfg using DFT_MON_TIMESTAMP off
每个连接至数据库的应用程序(会话)都有其自己的监视器开关集,这些监视器开关与数据库管理器和其他会话无关。应用程序(会话)在连接至数据库时,从数据库管理器上继承它们的监视器开关设置。要查看会话的所有监视器开关设置的设置选项,请使用 GET MONITOR SWITCHES
命令。您可以使用UPDATE MONITOR SWITCHES
命令来更改会话的监视器开关设置。
例如,以下命令打开LOCK监视器开关,从而启用SNAPSHOT_LOCK快照表函数所使用的监视器元素的收集:
db2 update monitor switches using LOCK on
SNAPSHOT Monitor(快照监视器)以计算器的形式提供累计信息。快照信息由一种特殊的数据结构提供,这种数据结构可以通过应用程序发出快照来检查。由监视数据结构返回的数据根据表9-1中所定义的开关来设置。这些开关可以在实例(DBM)级别或应用程序会话级别(UPDATE MONITOR SWITCHES)上打开或关闭。表9-1还包含执行快照时所提供的概要信息,以及由Snapshot Monitor提供的基本信息。
组别 | 所提供的信息 | 监视器开关 | DBM参数 |
---|---|---|---|
排序 | 所用堆的数目、溢出、性能排序 | SORT | DFT_MON_SORT |
锁定 | 保持锁定数目、死锁数目 | LOCK | DFT_MON_LOCK |
表 | 测量活动(读行、写行) | TABLE | DFT_MON_TABLE |
缓冲区 | 读和写的次数,所用时间 | BUFFERPOOL | DFT_MON_BUFFERPOOL |
工作单元 | 开始时间、结束时间、完成时间 | UOW | DFT_MON_UOW |
SQL语句 | 开始时间、停止时间、语句标识 | STATEMENT | DFT_MON_STMP |
在DBM(实例)配置参数中设置默认的开关值,将影响该实例中的所有数据库。而且每个与数据库相连接的session(会话)将继承在DBM配置中所设置的默认开关值。
1.查看监控开关设置
在某种程度上,由于快照监视器开关控制着当一个快照被打开时能够收集到的信息的类型和数量,因此,您应该在开始您的监视进程之前搞清楚哪些开关是打开的而哪些是关闭的。要获得这些信息,最简单的方法就是在CLP中执行GET MONITOR SWITCHES
命令。在多分区数据库环境下它的基本语法是:
GET MONITOR SWITCHES <AT DBPARTITIONNUM [PartitonNum] >```
[db2inst1@db22 Desktop]$ db2 get monitor switches
Monitor Recording Switches
Switch list for member 0 --数据库分区号为0的开关列表
Buffer Pool Activity Information (BUFFERPOOL) = OFF --缓冲池活动信息
Lock Information (LOCK) = OFF --锁定信息
Sorting Information (SORT) = OFF --排序信息
SQL Statement Information (STATEMENT) = OFF --SQL语句信息
Table Activity Information (TABLE) = OFF --表活动信息
Take Timestamp Information (TIMESTAMP) = ON 04/12/2017 10:25:18.576712 --获取时间戳记信息
Unit of Work Information (UOW) = OFF --工作单元信息
  从上面可以看到,TIMESTAMP这个快照监视器开关的状态是ON,而其他的都是OFF。在这个开关状态后面显示的是这个开关打开的精确的日期和时间。
####2.改变开关设置
UPDATE MONITOR SWITCHES USING [[SwitchID] ON | OFF, ... ]
####3.获取数据
  当数据库被激活或者与数据库的连接被建立时,快照显示器就会自动的开始收集监视数据。但是,在希望能够查看被监视的数据之前,您必须选取一个快照(快照看起来就像是那个时间点上的监视要素的映像)。您可以通过调用`db2GETSnapshot()` API或者执行`GET SNAPSHOT`命令来得到快照。例9-2指明了这个命令的基本语法,Database Alias用来说明需要做快照监视器信息的数据库别名。
  这两种方法收集的信息都存储于监视器要素中(有时被认为是数据要素),每个要素被设计成存储指定类型的信息。下面列出的是可利用的监视器要素:
1. **计数器**
  用来保存活动或者事件发生次数的累计值(例如,对于一个数据库已经执行的SQL语句的总次数)。计数器数值的增长贯穿监视器的生命周期;而在许多情况下,它有可能会被重置。
2. **计量值**
  表明一个项目的当前值(例如,当前连接到数据库的应用程序的数量)。
  与计数器不同的是,Gauges(计量)的值可以变高或者变低;它们在任一被测量点的实时值通常取决于数据库活动的级别。
3. **高水位值**
  表明一个指标在监视开始以后所能达到的最大值或最小值(例如,util_heap_sz使用的最大值)。
4. **信息要素**
  提供所有监视活动执行的细节信息(例如缓冲池名称、数据库名称和别名、详细路径等等)。
5. **时间戳**
  表明一个活动或者事件发生的日期和时间(例如第一次连接数据库建立的日期和时间)。
6. **时间要素**
  记录时间被花费于执行一个活动或时间的成本(例如:进行排序操作的时间花费)。时间要素的值会以从活动或事件开始所流逝的秒和微秒的数量形式来表现。一些时间要素可以被重置。
  使用`GET SNAPSHOT`命令可以要求一个快照。在我们检查Snapshot Monitor(快照监视器)的输出之前,使我们可以选择如何捕获快照信息。可以利用CLP界面去捕获数据库监视器快照。
  拍快照时,有可能定义一个相关领域。当需要数据库监视时,通常都有具体的需要。因此,对于特定的数据库,如果有一个与并发性(锁定)行为有关的问题,那么可以规定锁定级别。如果用户关心所有访问数据库的应用程序,那么就应当规定应用程序的级别。如果STATEMENT开关被打开并在数据库级别上拍了快照,那么就能捕获有关表的动态SQL语句的活动(INSERT/UPDATE/SELECT/DELETE)信息。还能捕获数据库内每个表的数据库活动信息。可以提供以下级别的快照:
- DBM(实例监视器)——捕获活动实例的信息
- Database(数据库)——捕获所有数据库或一个数据库的信息
- Application(应用程序)——捕获所有应用程序或单个应用程序的信息
- Table Space(表空间)——捕获数据库内各个表空间的信息
-Table(表)——捕获数据库内各个表的信息
- Lock(锁)——捕获使用数据库的应用程序持有的各种锁的信息
**例9-2** GET SNAPSHOT命令的语法
db2 get snapshot for dbm
db2 get snapshot for database on dbname
db2 get snapshot for bufferpools on dbname
db2 get snapshot for tables on dbname
db2 get snapshot for locks on dbname
db2 get snapshot for applications on dbname
db2 get snapshot for dynamic on dbname
**例9-3 数据库锁定快照**
[db2inst1@db22 Desktop]$ db2 update monitor switches using lock on --开启锁定监视
DB20000I The UPDATE MONITOR SWITCHES command completed successfully.
---数据库中做一些操作--
SAMPLE:select * from tb1
ID NAME
----------- --------------------
1 java
2 testincremental
3 incremental
4 now incre
5 no
6 test my
7 test forward
7 record(s) selected.
DB2INST1->SAMPLE:update name='uodate' where id=7
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0104N An unexpected token "update" was found following
"BEGIN-OF-STATEMENT". Expected tokens may include: "".
SQLSTATE=42601
DB2INST1->SAMPLE:update tb1 set name='njk' where id=7
DB20000I The SQL command completed successfully.
DB2INST1->SAMPLE:insert into tb1 values(8,'kl')
DB20000I The SQL command completed successfully.
DB2INST1->SAMPLE:delete from tb1 where id=6
DB20000I The SQL command completed successfully.
-------操作完成---
[db2inst1@db22 Desktop]$ db2 get snapshot for locks on sample
Database Lock Snapshot
Database name = SAMPLE
Database path = /home/db2inst1/db2inst1/NODE0000/SQL00001/MEMBER0000/ -----数据库路径
Input database alias = SAMPLE --输入数据库别名
Locks held = 0 --挂起的锁定
Applications currently connected = 1 --当前已连接的应用程序
Agents currently waiting on locks = 0 --当前正在等待锁的代理程序数
Snapshot timestamp = 04/12/2017 12:06:41.627770 --快照时间戳记
Application handle = 32 --应用程序句柄
Application ID = *LOCAL.DB2.170412040416 --应用程序标识
Sequence number = 00001 --序号
Application name = db2dbctrld --应用程序名
CONNECT Authorization ID = DB2INST1 --CONNECT 授权标识
Application status = Connect Completed --应用程序状态
Status change time = Not Collected --状态更改时间
Application code page = 1208 --应用程序代码页
Locks held = 0 --挂起的锁定
Total wait time (ms) = 0 --总计等待时间(毫秒)
Application handle = 31
Application ID = *LOCAL.DB2.170412040415
Sequence number = 00001
Application name = db2lused
CONNECT Authorization ID = DB2INST1
Application status = Connect Completed
Status change time = Not Collected
Application code page = 1208
Locks held = 0
Total wait time (ms) = 0
Application handle = 30
Application ID = *LOCAL.DB2.170412040414
Sequence number = 00001
Application name = db2wlmd
CONNECT Authorization ID = DB2INST1
Application status = Connect Completed
Status change time = Not Collected
Application code page = 1208
Locks held = 0
Total wait time (ms) = 0
Application handle = 36
Application ID = *LOCAL.DB2.170412040420
Sequence number = 00001
Application name = db2evml_DB2DETAILDEA
CONNECT Authorization ID = DB2INST1
Application status = Connect Completed
Status change time = Not Collected
Application code page = 1208
Locks held = 0
Total wait time (ms) = 0
Application handle = 29
Application ID = *LOCAL.DB2.170412040413
Sequence number = 00001
Application name = db2taskd
CONNECT Authorization ID = DB2INST1
Application status = Connect Completed
Status change time = Not Collected
Application code page = 1208
Locks held = 0
Total wait time (ms) = 0
Application handle = 28
Application ID = *LOCAL.DB2.170412040412
Sequence number = 00001
Application name = db2stmm
CONNECT Authorization ID = DB2INST1
Application status = Connect Completed
Status change time = Not Collected
Application code page = 1208
Locks held = 0
Total wait time (ms) = 0
Application handle = 34
Application ID = *LOCAL.DB2.170412040418
Sequence number = 00001
Application name = db2pcsd
CONNECT Authorization ID = DB2INST1
Application status = Connect Completed
Status change time = Not Collected
Application code page = 1208
Locks held = 0
Total wait time (ms) = 0
Application handle = 27
Application ID = *LOCAL.db2inst1.170412040406
Sequence number = 00007
Application name = db2bp
CONNECT Authorization ID = DB2INST1
Application status = UOW Waiting
Status change time = Not Collected
Application code page = 1208
Locks held = 0
Total wait time (ms) = 0
Application handle = 33
Application ID = *LOCAL.DB2.170412040417
Sequence number = 00001
Application name = db2fw0
CONNECT Authorization ID = DB2INST1
Application status = Connect Completed
Status change time = Not Collected
Application code page = 1208
Locks held = 0
Total wait time (ms) = 0
####4.重置计数器
  
RESET MONITOR ALL
RESET MONITOR FOR [DATABASE | DB] [Database Alias]
###利用表函数监控
  
**表9-2 部分表函数列表**
| 快照表函数 | 返回的信息 |
| --- | --- |
|SNAPSHOT_DBM|数据库管理器信息|
|SNAPSHOT_DATABASE|数据库信息,只有当至少有一个应用程序连接至数据库时,才会返回信息|
|SNAPSHOT_APPL|连接至分区上数据库的应用程序上有关锁等待的应用程序信息,包括累积计数器、状态信息和最近执行的SQL语句 |
|SNAPSHOT_APPL_INFO|
|SNAPSHOT_LOCKWAIT|
|SNAPSHOT_STATEMENT||
|SNAPSHOT_TABLE||
|SNAPSHOT_LOCK||
|SNAPSHOT_TBS||
|SNAPSHOT_BP||
||SNAPSHOT_DYN_SQL||
**快照监视器数据组织**
  所有的快照表函数都返回一张监视器数据表,其中的每一行代表一个正被监控的数据库对象实例,而每一列代表一个监视器元素(监视器元素代表数据库系统状态的特定属性)。
**捕获监视器数据快照**
  
**(1)连接至数据库**
db2 connect to sample
**(2)确定需要捕获的快照类型,以及需要监控的数据库和分区**
db2 update dbm cfg using DFT_MON_TABLE on
**(3)使用希望的快照表函数发出查询**
例如,以下是一个查询,它捕获有关当前已连接分区的SAMPLE数据库的表活动信息的快照:
db2 "select * from table (SNAPSHOT_TABLE('SAMPLE',-1)) as T"
快照表函数有两个输入参数:
- varchar(255):用于数据库名称,如果您输入NULL,那么就使用当前已连接的数据库名称
- smallint:用于分区号
###1.1.3性能管理视图
  使用这些管理视图可以获得与表函数和快照类似的监控数据
表9-3 部分管理视图
|视图名|模式名|描述|
| --- |---|---|
|APPLICATIONS|SYSIBMADM|
|APPL_PERFORMANCE|SYSIBMADM|
|BP_HITRATIO|SYSIBMADM|
|BP_READ_IO|SYSIBMADM|
|BP_WRITE_IO|SYSIBMADM|
|CONTAINER_UTILIZATION|SYSIBMADM|
|LONG_RUNNING_SQL|SYSIBMADM|
|SNAPAGENT_MEMORY_POOL /SNAP_GET_AGENT_MEMORY_POOL|SYSIBMADM|
|SNAPBP / SNAP_GET_BP_V95|SYSIBMADM|
#快照监视器案例