Часто системные администраторы сталкиваются с необходимостью освободить место на системном разделе сервера и перенести базы данных СУБД на другой, более емкий жесткий диск. Разберем типичную ситуацию на примере 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С.
Создание симлинков на отдельные внутренние папки кластера (например, base) — это плохая практика, которая часто приводит к ошибкам прав доступа и нарушению целостности. Как справедливо замечено в обсуждении проблемы, переносить нужно целиком всю директорию data (определяется переменной PGDATA).
Рассмотрим подробный алгоритм правильного переноса директории кластера баз данных на новый диск.
Перед любыми файловыми операциями с базами данных критически важно полностью остановить службу СУБД, чтобы избежать потери данных из-за незавершенных транзакций.
sudo systemctl stop postgrespro-1c-10.service
Убедимся, что процесс успешно остановлен, проверив статус службы.
Вместо стандартных утилит перемещения или копирования настоятельно рекомендуем использовать rsync с флагом архивирования. Это гарантированно сохранит владельцев файлов, скрытые права доступа и внутренние метаданные.
sudo rsync -av /var/lib/pgpro/1c-10/data/ /mnt/data/
Дождемся окончания синхронизации. Оригинальную папку пока не удаляем — она послужит резервной копией на случай непредвиденных обстоятельств.
Обратим внимание на крайне опасный совет, который иногда встречается на форумах: назначить права 755 на папку с базами. Никогда так не делайте! СУБД PostgreSQL откажется запускаться в целях безопасности, если директория PGDATA доступна для чтения кому-либо, кроме ее прямого владельца.
Установим строгие права 700 и назначим владельцем системного пользователя postgres:
sudo chown -R postgres:postgres /mnt/data
sudo chmod 700 /mnt/data
Поскольку в современных версиях Ubuntu используется система systemd, правка старых скриптов инициализации (типа /etc/init.d/) не принесет результата. Нам необходимо переопределить путь к PGDATA для самой службы.
Выполним команду редактирования конфигурации службы:
sudo systemctl edit postgrespro-1c-10.service
В открывшемся файле (override.conf) пропишем новые параметры окружения:
[Service]
Environment=PGDATA=/mnt/data
В качестве альтернативы можно не трогать службу, а изменить параметр data_directory непосредственно в файле postgresql.conf, указав там новый путь.
Выясним частую скрытую причину, по которой 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
Если /mnt/data — это точка монтирования отдельного жесткого диска, убедимся, что он прописан для автоматического монтирования в файле /etc/fstab по его UUID. Иначе после первой же перезагрузки сервера раздел не смонтируется, папка окажется пустой, и служба вновь выдаст ошибку is missing or empty.
Перезагрузим конфигурацию systemd, чтобы применить все изменения, и запустим нашу СУБД:
sudo systemctl daemon-reload
sudo systemctl start postgrespro-1c-10.service
sudo systemctl status postgrespro-1c-10.service
Если статус активен и нет ошибок, базы данных успешно работают с нового диска. Только после тщательного тестирования работоспособности баз 1С можно удалять старый каталог данных для освобождения места.
Посмотрим на более изящный, встроенный в PostgreSQL механизм распределения данных, если вам нужно перенести не весь кластер, а только одну тяжелую базу данных 1С. Это механизм табличных пространств.
Вместо физического переноса системной папки data, можно создать папку на новом диске, назначить ей владельца postgres и выполнить SQL-запрос для объявления нового пространства:
CREATE TABLESPACE hdd2 LOCATION '/mnt/data/tablespace_1c';
После этого нужную базу можно целиком перенести на новый диск специальной командой в консоли СУБД:
ALTER DATABASE name_base_1c SET TABLESPACE hdd2;
Таким образом, мы выяснили, что перенос баз данных PostgreSQL — процесс, требующий комплексного подхода: от правильного копирования файлов и назначения прав до настройки подсистем безопасности ОС Ubuntu и конфигурации systemd.