Табличные пространства PostgreSQL

Табличные пространства (tablespace) позволяют хранить данные Использование и настройка PostgreSQL на разных устройствах.

В табличном пространстве могут находиться постоянные (таблицы, индексы и toast- таблицы) и временные объекты. Toast- таблицы при перемещении таблицы - перемещаются автоматически. Индексы могут находиться в отдельных табличных пространствах и их нужно перемещать явно.

Задача. На HDD перестало хватать места под базу данных. Было принято решение добавить дополнительный HDD и перенести на него хранение одной таблицы cdr_old нашей базы данных.

Решение. Создаётся новое табличное пространство и в него переносится таблица cdr_old вместе с её индексами.

  1. Создадим новую (обязательную пустую) директорию на новом HDD. Права на директорию должны принадлежать пользователю, которому принадлежит сервер PostgreSQL.
    mkdir -p /var/log/VAR/LIB/psql/tspace_old_cdr
    chown -R postgres:postgres /var/log/VAR/LIB/psql/
  2. Создание табличного пространства tspace_old_cdr.
    CREATE TABLESPACE tablespace_name [ OWNER user_name ] LOCATION 'directory'

    tablespace_name - имя создаваемого табличного пространства. Имя не может начинаться с pg_ , такие имена зарезервированы для системных табличных пространств. user_name - имя пользователя владельца. directory - каталог, который будет использоваться для табличного пространства. В нашем случае команда примет вид:

    CREATE TABLESPACE tspace_old_cdr LOCATION '/var/log/VAR/LIB/psql/tspace_old_cdr';
  3. Перемещение таблицы cdr_old в новое табличное пространство. Перемещение табличных пространств означает простое (блочное) копирование данных на новое место HDD. Чем больше таблица, тем больше времени займет копирование. На время копирования таблица полностью блокируется (ACCESSEXCLUSIVELOCK).
    ALTER TABLE cdr_old SET TABLESPACE tspace_old_cdr;

    Перемещение индекса таблицы в новое табличное пространство.

    ALTER INDEX i_cdr_out SET TABLESPACE tspace_old_cdr;

    После окончания копирования, при помощи ключа \d, можно посмотреть в каком табличном пространстве находится таблица и ее индексы. Вывод команды ниже показывает, что сама таблица cdr_old и её индекс i_cdr_out находятся в одном табличном пространстве tspace_old_cdr, а три других индекса в табличном пространстве по умолчанию.

    # \d cdr_old
    ...
    Indexes:
        "cdr_new_pk" PRIMARY KEY, btree (id)
        "i_cdr_in" btree (begin_time, src_peer_id, cause_local)
        "i_cdr_out" btree (begin_time, dst_peer_id, cause_local), tablespace "tspace_old_cdr"
        "i_cdr_pairs" btree (begin_time)
    Tablespace: "tspace_old_cdr"
PQ VPS сервера в 28+ странах.