Как правильно перенести папку с базами PostgreSQL (Postgres Pro) на другой диск в Ubuntu?

Системный администратор IT и автоматизация бизнеса
← На главную

Часто системные администраторы сталкиваются с необходимостью освободить место на системном разделе сервера и перенести базы данных СУБД на другой, более емкий жесткий диск. Разберем типичную ситуацию на примере Postgres Pro для 1С в операционной системе Ubuntu.

Проанализируем частую ошибку: попытка перенести только подкаталог base и подменить его символической ссылкой (симлинком). Пользователи выполняют команды переноса, создают симлинк вида ln -s /mnt/data /var/lib/pgpro/1c-10/data/base, но при запуске службы получают ошибку:


systemd[1]: Starting Postgres Pro 10 database server...
check-db-dir[7567]: "/var/lib/pgpro/1c-10/data" is missing or empty.
check-db-dir[7567]: Use "/opt/pgpro/1c-10/bin/pg-setup initdb" to initialize the database
systemd[1]: postgrespro-1c-10.service: Control process exited, code=exited status=1

Разберем по шагам, почему так происходит и как выполнить перенос данных корректно и безопасно, не нарушив работу сервера 1С.

Отказ от симлинков и перенос всего каталога Data

Создание симлинков на отдельные внутренние папки кластера (например, base) — это плохая практика, которая часто приводит к ошибкам прав доступа и нарушению целостности. Как справедливо замечено в обсуждении проблемы, переносить нужно целиком всю директорию data (определяется переменной PGDATA).

Рассмотрим подробный алгоритм правильного переноса директории кластера баз данных на новый диск.

Шаг 1. Остановка службы PostgreSQL

Перед любыми файловыми операциями с базами данных критически важно полностью остановить службу СУБД, чтобы избежать потери данных из-за незавершенных транзакций.

sudo systemctl stop postgrespro-1c-10.service

Убедимся, что процесс успешно остановлен, проверив статус службы.

Шаг 2. Безопасное копирование данных (Rsync вместо MV)

Вместо стандартных утилит перемещения или копирования настоятельно рекомендуем использовать rsync с флагом архивирования. Это гарантированно сохранит владельцев файлов, скрытые права доступа и внутренние метаданные.

sudo rsync -av /var/lib/pgpro/1c-10/data/ /mnt/data/

Дождемся окончания синхронизации. Оригинальную папку пока не удаляем — она послужит резервной копией на случай непредвиденных обстоятельств.

Шаг 3. Настройка правильных прав доступа

Обратим внимание на крайне опасный совет, который иногда встречается на форумах: назначить права 755 на папку с базами. Никогда так не делайте! СУБД PostgreSQL откажется запускаться в целях безопасности, если директория PGDATA доступна для чтения кому-либо, кроме ее прямого владельца.

Установим строгие права 700 и назначим владельцем системного пользователя postgres:


sudo chown -R postgres:postgres /mnt/data
sudo chmod 700 /mnt/data

Шаг 4. Настройка системы инициализации systemd

Поскольку в современных версиях Ubuntu используется система systemd, правка старых скриптов инициализации (типа /etc/init.d/) не принесет результата. Нам необходимо переопределить путь к PGDATA для самой службы.

Выполним команду редактирования конфигурации службы:

sudo systemctl edit postgrespro-1c-10.service

В открывшемся файле (override.conf) пропишем новые параметры окружения:


[Service]
Environment=PGDATA=/mnt/data

В качестве альтернативы можно не трогать службу, а изменить параметр data_directory непосредственно в файле postgresql.conf, указав там новый путь.

Шаг 5. Настройка AppArmor (Важный нюанс для Ubuntu)

Выясним частую скрытую причину, по которой Postgres не запускается по новому пути. Подсистема безопасности AppArmor строго контролирует доступ системных служб. Если перенести базы в нестандартную директорию (например, /mnt/data), AppArmor заблокирует к ним доступ.

Для решения проблемы необходимо отредактировать профиль AppArmor. Откроем конфигурацию локальных путей:

sudo nano /etc/apparmor.d/tunables/alias

Добавим туда алиас (псевдоним), чтобы AppArmor воспринимал новый путь как старый:

alias /var/lib/pgpro/1c-10/data/ -> /mnt/data/,

После этого обязательно перезапустим службу AppArmor:

sudo systemctl restart apparmor

Шаг 6. Автоматическое монтирование диска

Если /mnt/data — это точка монтирования отдельного жесткого диска, убедимся, что он прописан для автоматического монтирования в файле /etc/fstab по его UUID. Иначе после первой же перезагрузки сервера раздел не смонтируется, папка окажется пустой, и служба вновь выдаст ошибку is missing or empty.

Шаг 7. Запуск и проверка работы

Перезагрузим конфигурацию systemd, чтобы применить все изменения, и запустим нашу СУБД:


sudo systemctl daemon-reload
sudo systemctl start postgrespro-1c-10.service
sudo systemctl status postgrespro-1c-10.service

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

Альтернативное решение: Использование табличных пространств (Tablespaces)

Посмотрим на более изящный, встроенный в PostgreSQL механизм распределения данных, если вам нужно перенести не весь кластер, а только одну тяжелую базу данных 1С. Это механизм табличных пространств.

Вместо физического переноса системной папки data, можно создать папку на новом диске, назначить ей владельца postgres и выполнить SQL-запрос для объявления нового пространства:

CREATE TABLESPACE hdd2 LOCATION '/mnt/data/tablespace_1c';

После этого нужную базу можно целиком перенести на новый диск специальной командой в консоли СУБД:

ALTER DATABASE name_base_1c SET TABLESPACE hdd2;

Таким образом, мы выяснили, что перенос баз данных PostgreSQL — процесс, требующий комплексного подхода: от правильного копирования файлов и назначения прав до настройки подсистем безопасности ОС Ubuntu и конфигурации systemd.

← На главную