一個資料庫管理員常常想知道,"現在系統正在幹什麼呢?". 本章討論如何回答這個問題.
有一些工具可以用來監控資料庫的活動以及分析性能. 本章大部分內容是用於描述 PostgreSQL 的 統計收集器(statistics collector), 但我們也不能忽視普通的 Unix 監控程式,比如 ps 和 top.同樣,一旦我們找出了一個性能惡劣的查詢,那麼 我們可能還要用 PostgreSQL 的 EXPLAIN 命令進一步分析. PostgreSQL 7.3 使用者手冊 裡討論了 EXPLAIN 和其它用於理解獨立查詢的行為的方法.
在大多數平台上,PostgreSQL 修改 ps 輸出的命令標題,這樣我們就很容易找出某個 伺服器程序.一個簡單的顯示如下
$ ps auxww | grep ^postgres postgres 960 0.0 1.1 6104 1480 pts/1 SN 13:17 0:00 postmaster -i postgres 963 0.0 1.1 7084 1472 pts/1 SN 13:17 0:00 postgres: stats buffer process postgres 965 0.0 1.1 6152 1512 pts/1 SN 13:17 0:00 postgres: stats collector process postgres 998 0.0 2.3 6532 2992 pts/1 SN 13:18 0:00 postgres: tgl runbug 127.0.0.1 idle postgres 1003 0.0 2.4 6532 3128 pts/1 SN 13:19 0:00 postgres: tgl regression [local] SELECT waiting postgres 1016 0.1 2.4 6532 3080 pts/1 SN 13:19 0:00 postgres: tgl regression [local] idle in transaction
(調用 ps 的方法因不同的平台而略有不同, 顯示出來的細節也有一些區別.這個範例來自一個最近的 Linux 系統.) 這裡顯示出來的第一個程序時 postmaster,主服務程序. 給它顯示的命令參數和運行它的時候給它的是一樣的. 下面兩個程序實現統計收集器,我們將在下一節裡詳細描述它. (如果你設定了系統不啟動統計收集器,那麼它們不會出現.) 剩下的程序每個都是一個伺服器程序,每個處理一個客戶的連結. 每個這樣的程序都用下面的形式設定其命令行顯示︰
postgres: user database host activity
在該客戶端連結的生命期中,使用者,資料庫,和連結源主機項都保持不變, 膽識活躍性命令會變化.活躍性可以是 idle (也就是說, 等待客戶端的命令),idle in transaction (在一個BEGIN 塊裡等待使用者),或者一個命令類型名,比如 SELECT. 同樣,如果伺服器目前正在等待一個其它伺服器程序持有的鎖的時候, 會在資訊後面附加 waiting.在上面的範例中,我們可以 推出︰程序 1003 正在等待 1016完成其事務,這樣才能施放一些鎖或者其它 什麼東西.
小知識: Solaris 需要特別的處理. 你必需使用 /usr/ucb/ps,而不是 /bin/ps.你還必需使用兩個 w 標志,而不是一個.另外,你最初調用 postmaster 是用到的命令行在 ps 狀態顯示中必需比每個後端顯示的短.如果沒做到這三件事, 那麼 ps 為每個後端輸出的將是最初的 postmaster 的命令行.