Chapter 24. 觀察磁盤使用情況

Table of Contents
24.1. 判斷磁盤的使用量
24.2. 磁盤滿導致的失效

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

24.1. 判斷磁盤的使用量

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

你可以從三個地方監視磁盤空間:從 psql 裡使用 VACUUM 的信息,從 psql 裡使用 contrib/dbsize 裡面的工具,以及在命令行上使用 contrib/oid2name 裡面的工具。如果 psql 和任何最近剛剛清理(或者分析過)的數據庫進行聯接, 那麼我們可以用查詢來查看任意表的磁盤使用:

SELECT relfilenode, relpages FROM pg_class WHERE relname = 'customer';

 relfilenode | relpages 
-------------+----------
       16806 |       60
(1 row)

每個頁通常都是 8 K字節。(記住,relpages只是由 VACUUMANALYZE 更新。)

要顯示 TOAST 的表使用的空間,我們可以使用一個類似下面這樣的查詢, 替換了relfilenode即可(由上面的查詢得出):

SELECT relname, relpages
    FROM pg_class
    WHERE relname = 'pg_toast_16806' OR relname = 'pg_toast_16806_index'
    ORDER BY relname;

       relname        | relpages 
----------------------+----------
 pg_toast_16806       |        0
 pg_toast_16806_index |        1

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

SELECT c2.relname, c2.relpages
    FROM pg_class c, pg_class c2, pg_index i
    WHERE c.relname = 'customer'
        AND c.oid = i.indrelid
        AND c2.oid = i.indexrelid
        ORDER BY c2.relname;

       relname        | relpages 
----------------------+----------
 customer_id_indexdex |       26

我們很容易用下面的信息找出最大的表和索引:

SELECT relname, relpages FROM pg_class ORDER BY relpages DESC;

       relname        | relpages 
----------------------+----------
 bigtable             |     3290
 customer             |     3144

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

你也可以使用 oid2name 顯示磁盤用量。參閱 該目錄中的 README.oid2name 獲取例子。它包括一個為每個 數據庫顯示磁盤用量的腳本。