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?

0
задан 25 April 2017 в 16:17
5 ответов

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

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

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

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

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

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

0
ответ дан 4 December 2019 в 11:43

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

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

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

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

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

0
ответ дан 4 December 2019 в 11:43

Проще всего смонтировать новый диск в / 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 .

4
ответ дан 4 December 2019 в 11:43

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

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

0
ответ дан 21 May 2020 в 08:58

Я оказался на этой странице, потому что столкнулся с подобной ситуацией. И я благодарю @Andreas Рогге в предыдущем посте за решение.

Действительно, все, что мне нужно было сделать, это restorecon -Rv /var/lib/pgsql/data, чтобы заставить SElinux перемаркировать файлы в соответствии с обновленными шаблонами filecontext. С ls -Zя мог видеть, что они были неправильными. У меня была оригинальная папка данных, хранящаяся в стороне, чтобы сравнить.

Я переместил postgres data dir. Ну, на самом деле я скопировал его в другую временную папку, потому что мне нужно было перенести текущую файловую систему из ext2 в xfs. (Каталог данных представляет собой отдельную смонтированную файловую систему) Поэтому я использовал tar-копию для временной файловой системы, tar обычно сохраняет все характеристики файла, но, очевидно, не для меток selinux. Я инициализировал файловую систему как xfs и с помощью tar-архива скопировал весь каталог данных обратно в это повторно смонтированное расположение. Но тогда постгрес не захотел начинать, несмотря на то, что /var/lib/pgsql/data был доступен и заполнен, вывод journalctl -xe показал ошибку "/var/lib/pgsql/data" отсутствует или пуст. Зная об Андреасе, я смог проверить с помощью ls -Z, что этикетки были неправильными. Необходимо восстановить из:

unconfined_u:object_r:unlabeled_t:s0 Кому unconfined_u:object_r:postgresql_db_t:s0

, который restorecon -Rv /var/lib/pgsql/dataрешен!

Поэтому, если кто-то когда-нибудь окажется здесь после поиска в Google «postgres не запускается после перемещения папки данных, с ошибкой «/var/lib/pgsql/data» отсутствует или пуст в journalctl -xe output», я надеюсь, что это поможет им быстро восстановиться с этими знаниями.

0
ответ дан 20 January 2022 в 13:43

Теги

Похожие вопросы