27.6. Мониторинг использования диска#
27.6. Мониторинг использования диска #
Этот раздел обсуждает, как контролировать использование диска в системе баз данных Tantor SE.
27.6.1. Определение использования диска #
Каждая таблица имеет основной файл на диске, где хранится большая часть данных. Если в таблице есть столбцы с потенциально широкими значениями, то может быть также файл TOAST, связанный с таблицей, который используется для хранения значений, слишком широких, чтобы удобно разместиться в основной таблице (см. Раздел 65.2). На таблице TOAST, если она присутствует, будет один действительный индекс. Также могут быть индексы, связанные с основной таблицей. Каждая таблица и индекс хранятся в отдельном файле на диске — возможно, более чем в одном файле, если файл превышает один гигабайт. Конвенции именования для этих файлов описаны в Раздел 65.1.
Вы можете контролировать дисковое пространство тремя способами: используя SQL-функции, перечисленные в Таблица 9.100, используя модуль 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
27.6.2. Ошибка "Недостаточно места на диске" #
Наиболее важной задачей мониторинга диска для администратора базы данных является обеспечение того, чтобы диск не заполнился. Заполненный диск данных не приведет к повреждению данных, но может помешать выполнению полезной деятельности. Если диск, содержащий файлы WAL, заполнится, может произойти паника сервера базы данных и последующее завершение работы.
Если вы не можете освободить дополнительное место на диске, удаляя другие вещи, вы можете переместить некоторые файлы базы данных на другие файловые системы, используя таблицы пространств. См. Раздел 22.6 для получения дополнительной информации об этом.
Подсказка
Некоторые файловые системы работают плохо, когда они почти заполнены, поэтому не ждите, пока диск полностью заполнится, чтобы принять меры.
Если ваша система поддерживает квоты на дисковое пространство для каждого пользователя, то база данных будет естественным образом подчиняться любой квоте, установленной для пользователя, от имени которого работает сервер. Превышение квоты будет иметь такие же негативные последствия, как и полное исчерпание дискового пространства.