Табличные пространства
Эта страница переведена при помощи нейросети GigaChat.
Табличные пространства в PostgreSQL позволяют администраторам задавать физические места на файловой системе, предназначенные для хранения файлов объектов базы данных. После создания табличного пространства его можно указывать по имени при создании объектов базы данных.
Благодаря табличным пространствам администратор получает возможность контролировать физическую структуру хранения данных PostgreSQL. Это полезно в двух ключевых сценариях:
-
Решение проблемы нехватки места: Если раздел диска, на котором расположен кластер, исчерпался и расширить его невозможно, можно создать табличное пространство на другом разделе и временно хранить в нем данные до момента реорганизации системы.
-
Оптимизация производительности: Используя знание особенностей эксплуатации объектов базы данных, администратор может целенаправленно распределять объекты по устройствам разного класса. Например, часто используемый индекс можно разместить на быстродействующем SSD-диске, а архивные данные, редко востребованные и неважные для скорости работы, переместить на бюджетный HDD-массив.
Хотя табличные пространства физически расположены вне основного каталога данных PostgreSQL, они остаются неотъемлемыми компонентами кластера и не могут рассматриваться как самостоятельные наборы файлов. Табличные пространства зависят от метаданных, хранящихся в главном каталоге данных, поэтому их нельзя переносить в другой кластер или резервировать отдельно. Потеря табличного пространства (удаление файлов, отказ дисков и прочее) может сделать всю базу данных недоступной или вообще нерабочей. Хранение табличного пространства на временных файловых системах, таких как RAM-диски, угрожает общей устойчивости кластера.
Чтобы создать табличное пространство, используйте команду CREATE TABLESPACE. Пример использования:
CREATE TABLESPACE fastspace LOCATION '/ssd1/postgresql/data';
Каталог, предназначенный для табличного пространства, должен существовать, быть пустым и принадлежать пользователю операционной системы PostgreSQL. Впоследствии все объекты, созданные в этом табличном пространстве, будут располагаться в файлах под указанным каталогом. Каталог не должен находиться на съемных или временных накопителях, так как потеря табличного пространства сделает кластер неработоспособным.
Нет особой пользы в создании множества табличных пространств на одной логической файловой системе, так как нельзя управлять физическим расположением отдельных файлов в ее пределах. Впрочем, PostgreSQL не накладывает подобных ограничений и фактически не осведомлен о границе файловых систем на машине. Система просто сохраняет файлы в тех каталогах, которые были указаны.
Создание табличного пространства требует прав суперпользователя базы данных, но после этого обычным пользователям можно разрешить его использование, предоставив им привилегию CREATE
.
Отдельные таблицы, индексы и даже целые базы данных могут быть размещены в определенных табличных пространствах. Для этого пользователь с привилегией CREATE
должен указать имя необходимого табличного пространства при создании объекта. Например, следующая команда создает таблицу в табличном пространстве space1
:
CREATE TABLE foo(i int) TABLESPACE space1;
В качестве альтернативы используйте параметр default_tablespace:
SET default_tablespace = space1;
CREATE TABLE foo(i int);
Если параметр default_tablespace
установлен на ненулевое значение, он автоматически добавляет параметр TABLESPACE
в команды CREATE TABLE
и CREATE INDEX
, если они явно не содержат собственного оператора TABLESPACE
.
Также имеется параметр temp_tablespaces, управляющий размещением временных таблиц, индексов и временных файлов, используемых, например, для сортировки крупных объемов данных. Этот параметр может содержать список имен табличных пространств, что позволяет равномерно распределить нагрузку между несколькими табличными пространствами: при каждом создании временного объекта из списка выбирается случайный элемент.
Табличное пространство, ассоциированное с базой данных, используется для хранения системных каталогов этой базы данных. Оно также применяется по умолчанию для размещения таблиц, индексов и временных файлов, если не указан параметр TABLESPACE
и отсутствуют указания из default_tablespace
или temp_tablespaces
. Если база данных создается без указания табличного пространства, она наследует пространство от шаблона, из которого была скопирована.
При инициализации кластера автоматически создаются два табличных пространства: pg_global
предназначено только для общих системных каталогов, а pg_default
— пространство по умолчанию для баз данных template1
и template0
(следовательно, оно же используется и для других баз данных, если явно не указано иное).
Любая база данных может использовать созданное табличное пространство, если пользователь обладает необходимыми привилегиями. Удалить табличное пространство можно только после того, как из него будут удалены все объекты во всех базах данных.
Для удаления пустого табличного пространства используйте команду DROP TABLESPACE.
Получить список существующих табличных пространств можно, проверив системный каталог pg_tablespace
, например:
SELECT spcname FROM pg_tablespace;
Метакоманда программы psql также позволяет просматривать список существующих табличных пространств.
В каталоге $PGDATA/pg_tblspc
содержатся символические ссылки на внешние табличные пространства, зарегистрированные в кластере. Теоретически, хотя это и не рекомендуется, можно вручную изменить размещение табличных пространств, перенаправив эти ссылки. Крайне важно не производить такие манипуляции, когда сервер работает. Обратите внимание, что в PostgreSQL версии 9.1 и старше потребуется обновление системного каталога pg_tablespace
, если меняется местоположение табличного пространства. В противном случае инструмент pg_dump
продолжит сохранять старую информацию о расположении.