После установки PostgreSQL создаваемые ИБ будут размещаться в каталоге по умолчанию. Как правило необходимо предусмотреть размещение БД на другом диске.
Например целесообразно разместить рабочие ИБ, индексы или отдельные таблицы на более быстром SSD, а тестовые ИБ или редко используемые таблицы на менее быстрых дисках.
Задача
Имеется сервер с ОС Debian 9, на сервере установлен PostgreSQL 9.6. К серверу есть доступ через SSH и pgAdmin.
Организовать возможность расположения БД на другом диске, в каталоге /mnt/POINT_01/pg_base/, и перенести ИБ alt_production в этот каталог.
Решение
Для определения расположения файлов на дисках в PostgreSQL есть понятие Табличное пространство(TABLSEPACE). Разные табличные пространства можно размещать как на разных, так и на одном диске, хотя в последнем смысла не так много.
По умолчанию создается табличное пространство pg_default, у меня для версии 9.6 размещен в каталоге /var/lib/postgresql/9.6/main/base/.
Создание табличного пространства
Для создания табличного пространства необходимо заранее создать каталог в котором оно будет храниться, пользоватеть от которого запущена служба сервера PostgreSQL должен быть владельцем, катлог должен быть пустым.
По условию задачи табличное пространство необходимо разместить в каталоге /mnt/POINT_01/pg_base/, создаем его и пользователя postgres сделаем владельцем
# mkdir /mnt/POINT_01/pg_base # chown -R postgres:postgres /mnt/POINT_01/pg_base
Для дальнейших действий необходимо подключиться к сервру через pgAdmin или воспользоаться оболочкой psql. В pgAdmin можно выполнять команды графически так и запросами, в psql только запросами. Буду описывать графический вариант, а затем запрос, кторая выполнит теже действия.
Теперь создадим новое табличное пространство, назовем его point_01, в pgAdmin разворачиваем ветку Табличные пространства.
В ветке по нажатию ПКМ откроется меню, выбираем пункт Новый tablespace, в появившейся форме указываем название и местонахождение, и нажимаем кнопку OK. В ветке появится созданное тобличное пространство.
Запрос:
CREATE TABLESPACE point_01 LOCATION '/mnt/DEPOT_01/pg_base'
Перенос БД в другое табличное пространтсво
В ветке БД кликаем ПКМ по нужной ИБ, переходим в свойства на закладу Определение и выбираем необходимое табличное простарнство, и нажимаем кнопку OK.
После некоторого ожидания диалог закроется, база перенесена в другое табличное пространство.
Запрос:
ALTER DATABASE alt_production SET TABLESPACE point_01
Если c БД были установлены соединения, то выведется сообщение об шибке, например:
ОШИБКА: база данных "alt_production " занята другими пользователями DETAIL: Эта база данных используется ещё в 1 сеансе. ********** Ошибка ********** ОШИБКА: база данных "alt_production " занята другими пользователями SQL-состояние: 55006 Подробности: Эта база данных используется ещё в 1 сеансе.
Для завершения всех соединений с БД необходимо выполнить запрос описанный ниже и повторить перенос:
SELECT pg_terminate_backend (pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'alt_production ';
Источники: postgrespro.ru, unix.freegeek.ru