Назад | Перейти на главную страницу

PostgreSQL не запускается после перемещения каталога данных на Centos 7

Я установил PostgreSQL 9.3 на Centos 7. После установки я смог запустить системную службу и войти в psql. Я хочу переместить папку PGDATA в другой раздел, поэтому я попробовал несколько вещей, чтобы изменить DATADIR.

Я скопировал /var/lib/pgsql/data папку в /postgresdata/data, затем создал символическую ссылку:

systemctl stop postgresql
cp -rp /var/lib/pgsql/data /postgresdata/data
mv /var/lib/pgsql/data /var/lib/pgsql/data.old
ln -s /postgresdata/data /var/lib/pgsql/data
systemctl start postgresql

Папка /postgresdata/ установлен на 700 и владелец postgres.

Это приводит к следующей ошибке:

Не удалось выполнить задание postgresql.service, поскольку процесс управления завершился с кодом ошибки. См. "Systemctl status postgresql.service" и "journalctl -xe" для подробностей.

Я также попробовал два других метода, оба привели к той же ошибке:

Способ 1. Измените postgresql.conf

data_directory = '/postgresdata/data'

Метод 2: Измените настройки системной службы:

vim /usr/lib/systemd/system/postgresql.service

Затем измените:

# Environment=PGDATA=/var/lib/pgsql/data
Environment=PGDATA=/postgresdata/data

Оба приводят к одной и той же ошибке.

Когда я бегу journalctl -xe Я получаю это:

-- Unit postgresql.service has begun starting up.
apr 25 15:08:03 srv001 pg_ctl[15517]: FATAL:  could not open file "/postgresdata/data/PG_VERSION": Permission denied
apr 25 15:08:04 srv001 systemd[1]: postgresql.service: control process exited, code=exited status=1
apr 25 15:08:04 srv001 pg_ctl[15517]: pg_ctl: could not start server
apr 25 15:08:04 srv001 pg_ctl[15517]: Examine the log output.
apr 25 15:08:04 srv001 systemd[1]: Failed to start PostgreSQL database server.
-- Subject: Unit postgresql.service has failed
-- Defined-By: systemd
-- Unit postgresql.service has failed.

Смотря на /postgresdata/data/PG_VERSION Проблем с правами не вижу. Кажется, они идентичны оригиналу.

Как я могу переместить папку данных для PostgreSQL на Centos 7?

Проще всего смонтировать новый диск в /var/lib/pgsql и избавь себя от множества проблем. Таким образом, вам не нужно беспокоиться об изменении политик SELinux или о чем-либо подобном.


Если вы настаиваете на размещении каталога данных PostgreSQL в неожиданном месте, вы можете заставить SELinux работать правильно, установив новый контекст файла для новой структуры каталогов, который эквивалентен существующему. Например:

semanage fcontext --add --equal /var/lib/pgsql /postgresdata

Это вызывает контексты безопасности под /postgresdata применяться, как если бы они находились под /var/lib/pgsql. Затем вы можете исправить контексты любых существующих файлов с помощью restorecon:

restorecon -rv /postgresdata

Знайте, что люди не собираюсь понять, почему вы это сделали. Это включает в себя любых администраторов, которые посмотрят на этот сервер в будущем, включая себя. Нет необходимости использовать нестандартный каталог просто потому, что вы используете новый диск. Просто установите новое хранилище в /var/lib/pgsql.

Файлы и каталоги должны быть соответственно помечены. Вы можете посмотреть текущие ярлыки с помощью ls -Z.

Контексты файлов, необходимые для PostgreSQL, можно определить с помощью semanage fcontext --list | grep ^/var/lib/pgsql.

Вам необходимо адаптировать политику для правильной маркировки файлов. Так что вам придется установить это с помощью semanage fcontext -a -t <type> <path-pattern> для каждого шаблона, указанного в выходных данных приведенной выше команды.

Сделав это, вам просто нужно позвонить restorecon -Rv /postgresdata чтобы SElinux переименовал файлы в соответствии с только что созданными обновленными шаблонами файлового контекста.

После этого ваш экземпляр PostgreSQL должен запуститься снова.

Разрешения упомянутого файла PG_VERSION должны быть аналогичны этому: (с пользовательскими и групповыми postgres)

-rw------- 1 postgres postgres

А также не забудьте разрешить доступ не только к / postgresdata /, но и к / postgresdata / data!

возможно, попробуйте использовать chown с -R (рекурсивный вариант).

Другой проблемой может быть «другой раздел», если вы используете другую файловую систему, например, NTFS для перемещения данных между мультизагрузочными системами, вы столкнетесь с такими проблемами с разрешениями, особенно потому, что бит разрешения исполняемого файла не поддерживается NTFS. То же самое, конечно, касается других FS, отличных от UNIX, таких как fat ect.

Лучше всего, если вы сделаете копию всей папки с помощью rsync с параметром arcive "-a или --archive", который пытается сохранить исходные разрешения и символические ссылки и т. д. тот же самый. конечно, только если это возможно в целевой файловой системе ...

для pg9.6 по методу 2 вам необходимо запустить initdb после изменения настройки каталога

/usr/pgsql-9.6/bin/postgresql96-setup initdb