Chapter 12. 觀察硬碟使用情況

Table of Contents
12.1. 判斷硬碟的使用量
12.2. 硬碟滿導致的失效

本章討論如何觀察PostgreSQL資料庫系統的硬碟使用情況。 在目前的版本裡,資料庫管理員對硬碟儲存的布局沒有太多的 控制,因此本節主要是提示性的資訊,並且給你一些如何用操作 系統的工具管理硬碟儲存的概念。

12.1. 判斷硬碟的使用量

每個表都有一個主堆的硬碟文件,大多數資料都儲存在這裡。要儲存 長的欄位值,則另外還有一個TOAST文件與這個表相關聯, 其名字是基於該表的OID(實際上是pg_class.relfilenode), 以及一個在TOAST表上的索引。同時還可能有索引和這個 基表關聯。

你可以從三個地方監視硬碟空間:從 psql 裡使用 VACUUM 的資訊,從 psql 裡使用 contrib/dbsize,以及在命令行上使用 contrib/oid2name。如果 psql 和任何最近剛剛清理(或者分析過)的資料庫進行連結, 那麼我們可以用查詢來查看任意表的硬碟使用:

play=# SELECT relfilenode, relpages
play-# FROM pg_class
play-# WHERE relname = 'customer';
 relfilenode | relpages 
-------------+----------
       16806 |       60
(1 row)

每個頁面通常都是 8k 字節。(記住,relpages 只是由 VACUUMANALYZE 更新。)要顯示 TOAST 的表使用的空間,我們可以使用一個基於上面的堆 relfilenode 的查詢:

play=# SELECT relname, relpages
play-# FROM pg_class
play-# WHERE relname = 'pg_toast_16806' OR
play-#       relname = 'pg_toast_16806_index'
play-# ORDER BY relname;
       relname        | relpages 
----------------------+----------
 pg_toast_16806       |        0
 pg_toast_16806_index |        1

你也可以很容易地顯示索引的用量:

play=# SELECT c2.relname, c2.relpages
play-# FROM pg_class c, pg_class c2, pg_index i
play-# WHERE c.relname = 'customer' AND
play-#       c.oid = i.indrelid AND
play-#       c2.oid = i.indexrelid
play-# ORDER BY c2.relname;
       relname        | relpages 
----------------------+----------
 customer_id_indexdex |       26

我們很容易用 psql 找出最大的文件:

play=# SELECT relname, relpages
play-# FROM pg_class
play-# ORDER BY relpages DESC;
       relname        | relpages 
----------------------+----------
 bigtable             |     3290
 customer             |     3144

contrib/dbsize 向我們的資料庫裡裝載一些函數,這些函數 允許我們在 psql 裡找出一個表或者一個資料庫的大小,而且不用 VACUUM/ANALYZE

你也可以使用 oid2name 顯示硬碟用量。參閱 README.oid2name 獲取範例。它包括一個為每個 資料庫顯示硬碟用量的腳本。