1. 程式人生 > >閱讀PostgreSQL中的系統目錄

閱讀PostgreSQL中的系統目錄

PostgreSQL系統目錄是一個包含表和檢視的模式,其中包含有關資料庫內所有其他物件的元資料等。這對於資料庫管理員對資料庫進行管理有很大的幫助。

PostgreSQL將有關資料庫和叢集的元資料資訊儲存在“pg_catalog”模式中。但是請注意,除非遇到絕對緊急情況,否則不應該修改。

接下來主要概述一下系統目錄,並選擇常用的幾個系統目錄簡單介紹如何閱讀然後提取出對我們有用的資訊。其他系統表的相關資訊請參考PostgreSQL的官方文件。

pg_database

通常,資料庫資訊儲存在pg_database中。例如查詢pg_database中資料庫名為postgres的資料庫資訊,可能會得到類似如下的結果:

postgres=# SELECT oid,* FROM pg_database WHERE datname = 'postgres';
-[ RECORD 1 ]-+------------
oid           | 12330
datname       | postgres
datdba        | 10
encoding      | 6
datcollate    | en_US.UTF-8
datctype      | en_US.UTF-8
datistemplate | f
datallowconn  | t
datconnlimit  | -1
datlastsysoid | 12329
datfrozenxid  | 548
datminmxid    | 1
dattablespace | 1663
datacl    

查詢結果中,需要注意以下幾列的資訊:

1) oid - 物件識別符號。

2) datname - 資料庫的名稱。

3) datdba - 資料庫的所有者。

4) encoding - 資料庫的字元編碼。

5) datconnlimit - 資料庫上允許的最大併發連線數。

6) dattablespace - 此資料庫的預設表空間。

pg_stat_database

通常,統計資訊儲存在pg_stat_database中。例如查詢pg_stat_database中資料庫名為postgres的資料庫資訊,可能會得到類似如下的結果:

postgres=# SELECT * FROM pg_stat_database WHERE datname = 'postgres';
-[ RECORD 1 ]--+------------------------------
datid          | 12330
datname        | postgres
numbackends    | 1
xact_commit    | 277
xact_rollback  | 1
blks_read      | 262
blks_hit       | 11251
tup_returned   | 155045
tup_fetched    | 3408
tup_inserted   | 0
tup_updated    | 0
tup_deleted    | 0
conflicts      | 0
temp_files     | 0
temp_bytes     | 0
deadlocks      | 0
blk_read_time  | 0
blk_write_time | 0
stats_reset    | 2018-11-01 14:34:56.462662+08

這個統計表可以幫助我們獲得有用的資料。此表中的每一行都包含每個資料庫的實時資料,如果希望監視更改,可以定期匯出以便隨時進行跟蹤。

查詢結果中,需要注意以下資訊:

1)事務資訊可以在xact_commit列和xact_rollback列中找到,它們分別包含資料庫已提交和回滾的事務數。

2)有關是否從磁碟或記憶體中檢索資料的資訊儲存在blks_read列和blks_hit列中。blks_read列顯示此資料庫從磁碟讀取的塊數,而blks_hit列顯示在PostgreSQL的緩衝區快取中找到的塊數(由shared_buffers引數表示)。

3)有幾列涉及元組的資訊。tup_returned列表示資料庫中返回的行數。tup_fetched列表示資料庫中提取的行數。tup_inserted、tup_updated和tup_deleted這幾列,分別代表在這個資料庫中插入、更新和刪除的元組數。

4)如果備用伺服器出了問題,則conflicts列可以作為一種跟蹤由於與備用資料庫處於“恢復模式”而衝突被取消的查詢數量的方法。如果不是的話,則可以忽略此列。

5)temp_files列跟蹤建立的檔案的數量,temp_bytes列跟蹤所有使用的臨時檔案的總大小。

6)deadlocks列跟蹤死鎖發生的次數。由於死鎖可能會導致查詢錯誤,因此最好跟蹤此情況並確保應用程式不會因此出現執行錯誤。

7)blk_read_time列和blk_write_time列跟蹤資料庫中後端讀取和寫入資料所花費的總毫秒數。

8)stats_reset列僅顯示上次重置此行中的統計資訊時的時間戳(帶時區)。

pg_stat_bgwriter

查詢pg_stat_bgwriter中的資訊,可以得到類似如下的結果:

postgres=# SELECT * FROM pg_stat_bgwriter;
-[ RECORD 1 ]---------+------------------------------
checkpoints_timed     | 23
checkpoints_req       | 0
checkpoint_write_time | 0
checkpoint_sync_time  | 0
buffers_checkpoint    | 0
buffers_clean         | 0
maxwritten_clean      | 0
buffers_backend       | 0
buffers_backend_fsync | 0
buffers_alloc         | 291
stats_reset           | 2018-11-01 14:34:54.810804+08

查詢結果中,需要注意以下資訊:

1)有四列資訊用於跟蹤檢查點:

checkpoints_timed列和checkpoints_req列顯示已發生的計劃檢查點數(定時)和請求的檢查點數(也稱為強制檢查點)。

checkpoint_write_time列和checkpoint_sync_time列記錄檢查點程序寫入和同步到磁碟所花費的總時間(以毫秒為單位)。

2)buffers_checkpoint列中的資訊是檢查點寫入磁碟的緩衝區總數。

3)buffers_clean列表示後臺程序寫入磁碟的緩衝區數。

4)maxwritten_clean列表示後臺寫入程序在每次執行時達到重新整理的最大頁數的次數(使用bgwriter_lru_maxpages引數控制)。

5)buffers_backend列表示後端必須自身,而不是後臺寫入程序或檢查點寫的緩衝區數量,buffers_backend_fsync列表示後端必須執行自身的fsync呼叫的次數,buffers_alloc列則顯示通常已分配的緩衝區數量。

pg_stat_activity

查詢時會顯示有關資料庫當前連線的資訊,例如可能會得到類似如下的結果:

postgres=# SELECT * FROM pg_stat_activity;
-[ RECORD 3 ]----+---------------------------------
datid            | 12330
datname          | postgres
pid              | 2021
usesysid         | 10
usename          | postgres
application_name | psql
client_addr      | 
client_hostname  | 
client_port      | -1
backend_start    | 2018-11-08 15:56:11.293063+08
xact_start       | 2018-11-08 16:07:54.817688+08
query_start      | 2018-11-08 16:07:54.817688+08
state_change     | 2018-11-08 16:07:54.817691+08
wait_event_type  | 
wait_event       | 
state            | active
backend_xid      | 
backend_xmin     | 876
query            | SELECT * FROM pg_stat_activity ;
backend_type     | client backend

查詢結果中,需要注意以下資訊:

1)datname列表示實際連線到的資料庫,pid列表示資料庫主機自身連線的程序ID,usesysid列和usename列表示連線的資料庫使用者。

2)有四個時間戳列顯示了特定事件何時開始:backend_start列是實際建立連線的時間,xact_start列是當前事務開始的時間(如果客戶端沒有開啟事務,則為null),query_start列是當前或最近的查詢啟動的時間,state_change列是連線狀態最後一次更改的時間。

3)如果一個查詢正在等待另一個查詢釋放鎖,則wait_event_type列會包含有關它的等待事件型別的一些資訊,並且wait_event列將顯示等待事件的名稱。

4)state列顯示當前連線所處的狀態,例如活動,空閒,在事務中空閒,query列將顯示正在執行或最近執行的實際查詢。

pg_locks

查詢時會顯示有關資料庫當前連線的資訊,以及對錶的鎖的資訊。例如查詢時可能會得到類似如下結果:

postgres=# SELECT * FROM pg_locks;
-[ RECORD 1 ]------+----------------
locktype           | relation
database           | 12330
relation           | 11577
page               | 
tuple              | 
virtualxid         | 
transactionid      | 
classid            | 
objid              | 
objsubid           | 
virtualtransaction | 3/23
pid                | 2021
mode               | AccessShareLock
granted            | t
fastpath           | t
-[ RECORD 2 ]------+----------------
locktype           | virtualxid
database           | 
relation           | 
page               | 
tuple              | 
virtualxid         | 3/23
transactionid      | 
classid            | 
objid              | 
objsubid           | 
virtualtransaction | 3/23
pid                | 2021
mode               | ExclusiveLock
granted            | t
fastpath           | t

查詢結果中,需要注意以下資訊:

1)最重要的列是pid列,它匹配來自pg_stat_activity的pid。

2)relation列匹配來自pg_class的OID。

3)mode列顯示持有的鎖模式的名稱。

4)granted列來說明是否已經對鎖進行授權。

 

 

By Kalath