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

В этой главе рассказывается, как отслеживать использование диска в СУБД QHB.

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

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

Отслеживать дисковое пространство можно тремя способами: с помощью функций SQL, перечисленных в таблице Функции для получения размеров объектов базы данных, с помощью модуля oid2name или проверяя системные каталоги вручную.Функции SQL являются самыми простыми в применении, так что, в целом, рекомендуется использовать их. В оставшейся части этого раздела рассказывается, как отслеживать дисковое пространство путем проверки системных каталогов.

Используя psql в недавно очищенной или проанализированной базе данных, можно создавать запросы, чтобы увидеть, насколько использует диск любая таблица:

SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'customer';

 pg_relation_filepath | relpages
----------------------+----------
 base/16384/16806     |       60
(1 row)

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

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

SELECT relname, relpages
FROM pg_class,
     (SELECT reltoastrelid
      FROM pg_class
      WHERE relname = 'customer') AS ss
WHERE oid = ss.reltoastrelid OR
      oid = (SELECT indexrelid
             FROM pg_index
             WHERE indrelid = 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_index |       26

С помощью этой информации легко найти самые большие таблицы и индексы:

SELECT relname, relpages
FROM pg_class
ORDER BY relpages DESC;

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

Ошибка переполнения диска

Самая важная задача мониторинга дисков для администратора базы данных — предотвратить их переполнение. Переполнение диска с данными не приведет к повреждению данных, но может помешать выполнению полезных действий. Если переполнится диск с файлами WAL, может возникнуть тревога сервера баз данных и последующее его отключение.

Если нет возможности освободить дополнительное место на диске, удалив другие объекты, можно переместить некоторые файлы базы данных в другие файловые системы, используя табличные пространства. Дополнительную информацию об этом см. в разделе Табличные пространства.

Совет
Некоторые файловые системы плохо работают, когда они почти заполнены, поэтому не ждите полного заполнения диска, чтобы принять необходимые меры.

Если ваша система поддерживает дисковые квоты для каждого пользователя, то на базу данных, естественно, будет распространяться любая квота, установленная для пользователя, от имени которого запущен сервер. Превышение этой квоты повлечет за собой те же негативные последствия, что и полное отсутствие места на диске.