數據庫監控是一項重要的活動,若將其作為日常活動來執行,將連續提供數據庫系統健康狀況的反饋信息。正由于數據庫監控是數據庫管理的完整組成部分,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 命令選擇性地為其重置計數器。要執行此類操作,您必須關閉恰當的監控器開關,然后再打開,或者終止并重新建立數據庫連接。