Chapter 24. Мониторинг использования диска

Table of Contents
24.1. Определение использования диска
24.2. Ошибка переполнения диска

Данная глава обсуждает как отслеживать использование диска СУБД PostgreSQL.

24.1. Определение использования диска

Каждая таблица имеет первичный дисковый файл кучи, в котором хранится большая часть данных. Если таблица имеет какие-либо колонки с потенциально широкими значениями, то существует также TOAST файл, ассоциированный с этой таблицей, который используется для хранения значений, которые слишком широки, чтобы комфортабельно размещаться в главной таблице (см. Section 49.2). На каждую TOAST таблицу, если она существует, будет существовать один индекс. Также там могут быть и индексы, ассоциированные с базовой таблицей. Каждая таблица и индекс хранятся в отдельном дисковом файле — возможно более чем в одном файле, если размер этого файла превышает один гинабайт. Преобразования имён для этих файлов, описываются в Section 49.1.

Вы можете мониторить дисковое пространство в трёх местах: через psql используя информацию от VACUUM, через psql используя инструменты в contrib/dbsize и через командную строку, используя инструмент в contrib/oid2name. Используя psql после недавнего применения команд VACUUM или ANALYZE, вы можете выполнить такой запрос, чтобы увидеть сколько дискового пространства использует какая-либо таблица:

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

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

Каждая страница обычно равна 8kb. (Помните, что relpages обновляется только командами VACUUM, ANALYZE, и несколькими DDL командами, такими как CREATE INDEX). Значение relfilenode представляет интерес, если вы хотите напрямую анализировать дисковый файл таблицы.

Чтобы посмотреть пространство, используемое TOAST таблицами, используйте следующий запрос:

SELECT relname, relpages
    FROM pg_class,
         (SELECT reltoastrelid FROM pg_class
          WHERE relname = 'customer') ss
    WHERE oid = ss.reltoastrelid
       OR oid = (SELECT reltoastidxid FROM pg_class
                 WHERE oid = ss.reltoastrelid)
     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.

Вы также можете использовать contrib/oid2name чтобы посмотреть использование дискового пространтсва. См. примеры в файле README.oid2name, в указанном каталоге. Они включают сценарий, который показывает использование диска для каждой базы данных.