Перемещение каталога данных PostgreSQL

Объём БД постоянно увеличивается, и со временем она переполняет пространство файловой системы. Кроме того, если база данных находится на одном разделе с остальной операционной системой, это может привести к конфликтам доступа к устройствам ввода/вывода.

RAID, сетевые блочные хранилища и другие устройства предоставляют избыточность данных и другие полезные функции. Вы можете добавить больше места и оптимизировать производительность системы, а также воспользоваться другими функциями хранения. Этот мануал поможет вам переместить каталог данных PostgreSQL в новое место.

Требования

  • Виртуальный сервер и пользователь с доступом к sudo, (мы используем Ubuntu 22.04, настроенный по этому мануалу).
  • Сервер PostgreSQL (чтобы установить PostgreSQL, следуйте этому руководству).

Этот мануал покажет, как переместить данные в блочное хранилище, смонтированное в mnt/volume-nyc1-01. Это поможет вам переместить каталог данных в новое расположение независимо от того, какое хранилище вы используете.

1: Перемещение каталога данных PostgreSQL

Давайте подготовимся к перемещению каталога данных PostgreSQL. Для этого нужно уточнить его текущее расположение. Откройте интерактивную сессию PostgreSQL; флаг -u postgres откроет сессию пользователя postgres.

sudo -u postgres psql

Когда строка откроется, запросите текущий каталог данных:

SHOW data_directory;

Вы увидите такой вывод:

       data_directory
-----------------------------
 /var/lib/postgresql/14/main
(1 row)

Данный вывод подтверждает, что PostgreSQL использует стандартный каталог данных по умолчанию, /var/lib/postgresql/14/main. Это и есть каталог, который нужно переместить. Чтобы закрыть сессию, введите \q.

\q

Отключите PostgreSQL, прежде чем вносить изменения в каталог данных, чтобы обеспечить их целостность:

sudo systemctl stop postgresql

Утилита systemctl не отображает вывод некоторых команд управления сервисами. Чтобы убедиться в том, что сервер БД отключен, запросите его состояние:

sudo systemctl status postgresql

В выводе вы увидите, что в данный момент ваша копия PostgreSQL находится в состоянии inactive (dead):

postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor>
     Active: inactive (dead) since Thu 2022-06-30 18:46:35 UTC; 27s ago
    Process: 4588 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 4588 (code=exited, status=0/SUCCESS)
        CPU: 1ms

Итак, сервер остановлен, теперь скопируйте текущий каталог данных в новое расположение с помощью rsync. Флаг –a сохраняет привилегии и другие свойства каталога, а –v отображает подробный вывод.

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

Примечание: Убедитесь, что в конце названия каталога нет слеша (система может добавить его автоматически, если у вас включена эта функция). Если такой слеш есть, rsync будет сбрасывать содержимое каталога в точку монтирования, а не в сам каталог.

Каталог, указывающий версию (14), не является строго необходимым. В то же время вам не помешает его иметь, если вы хотите следовать соглашениям проекта и особенно если у вас есть необходимость в будущем использовать несколько версий PostgreSQL.

sudo rsync -av /var/lib/postgresql /mnt/volume_nyc1_01

Переименуйте текущую папку, добавив расширение .bak. Оставьте расширение до тех пор, пока не убедитесь, что данные перемещены успешно. Это поможет не спутать одноименные файлы в новом и старом расположении в процессе работы.

sudo mv /var/lib/postgresql/10/main /var/lib/postgresql/10/main.bak

2: Настройка нового каталога данных

Согласно файлу /etc/postgresql/14/main/postgresql.conf, по умолчанию data_directory находится в /var/lib/postgresql/14/main. Откройте этот файл:

sudo nano /etc/postgresql/14/main/postgresql.conf

Найдите строку, начинающуюся с data_directory, и укажите путь к новому каталогу. В контексте этого руководства обновленная директива будет записана так:

. . .
data_directory = '/mnt/volume_nyc1_01/postgresql/14/main'
. . .

Сохраните и закройте файл (CTRL + X, Y, Enter). Мы сделали все, что нужно для настройки PostgreSQL и поддержки нового каталога данных. Теперь пора запустить сервис PostgreSQL и убедиться, что он использует новый каталог.

3: Перезапуск PostgreSQL

Изменив директиву data-directory в каталоге postgresql.conf, вы должны запустить сервер PostgreSQL.

sudo systemctl start postgresql

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

sudo systemctl status postgresql

Если сервис работает правильно, в выводе будет сказано active (exited):

postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor>
     Active: active (exited) since Thu 2022-06-30 18:50:18 UTC; 3s ago
    Process: 4852 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 4852 (code=exited, status=0/SUCCESS)
        CPU: 1ms

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

sudo -u postgres psql

Снова запросите каталог данных:

SHOW data_directory;

Вы получите следующий результат:

             data_directory
----------------------------------------
 /mnt/volume_nyc1_01/postgresql/14/main
(1 row)

Как видите, PostgreSQL использует новое расположение данных. Также вам необходимо убедиться в том, что БД полностью работает, а вы можете взаимодействовать с данными. После проверки целостности данных вы можете удалить резервную копию каталога данных:

sudo rm -Rf /var/lib/postgresql/14/main.bak

Заключение

Теперь вы знаете, как переместить каталог данных PostgreSQL в новое расположение. В данном руководстве в качестве нового места использовалось блочное хранилище, однако эти инструкции подходят для настройки любого устройства независимо от технологии, на которой оно основано.

Читайте также: 5 вариантов настройки сервера для обслуживания веб-приложения

Tags: ,

Добавить комментарий