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

В этой главе рассказывается, как отслеживать использование диска в системе баз данных QHB.

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

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

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

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

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 заполнится, может возникнуть паника сервера базы данных и последующее отключение.

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

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

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