在 Centos 7 上移动数据目录后 PostgreSQL 无法启动

SPR*_*BRN 1 postgresql postgresql-9.3 centos7

我已经在 Centos 7 上安装了 PostgreSQL 9.3。安装后我可以启动系统服务并登录到 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
Run Code Online (Sandbox Code Playgroud)

该文件夹/postgresdata/设置为 700,所有者为 postgres。

这会导致以下错误:

postgresql.service 的作业失败,因为控制进程退出并显示错误代码。有关详细信息,请参阅“systemctl status postgresql.service”和“journalctl -xe”。

我也尝试了其他两种方法,都导致相同的错误:

方法一:更改postgresql.conf

data_directory = '/postgresdata/data'
Run Code Online (Sandbox Code Playgroud)

方法二:更改系统服务设置:

vim /usr/lib/systemd/system/postgresql.service
Run Code Online (Sandbox Code Playgroud)

然后改变:

# Environment=PGDATA=/var/lib/pgsql/data
Environment=PGDATA=/postgresdata/data
Run Code Online (Sandbox Code Playgroud)

两者都会导致相同的错误。

当我跑步时,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.
Run Code Online (Sandbox Code Playgroud)

看着/postgresdata/data/PG_VERSION我看不到权利问题。它们看起来与原版相同。

如何在 Centos 7 上移动 PostgreSQL 的数据文件夹?

Mic*_*ton 5

最简单的方法是将您的新磁盘挂载到 并为您/var/lib/pgsql省去很多麻烦。这样您就不必担心更改 SELinux 策略或任何其他策略。


如果你坚持把 PostgreSQL 的数据目录放在一个意想不到的位置,你可以通过为新的目录结构设置一个新的文件上下文来使 SELinux 正常工作,它与现有的目录结构等效。例如:

semanage fcontext --add --equal /var/lib/pgsql /postgresdata
Run Code Online (Sandbox Code Playgroud)

这会导致安全上下文 under/postgresdata被应用,就好像它们在 下一样/var/lib/pgsql。然后,您可以使用以下命令修复任何现有文件的上下文restorecon

restorecon -rv /postgresdata
Run Code Online (Sandbox Code Playgroud)

请注意,人们不会理解您为什么这样做。这包括将来查看此服务器的所有管理员,包括您自己。没有必要仅仅因为您使用的是新磁盘而使用非标准目录。只需在/var/lib/pgsql.