在Centos 7上使用自定义PGDATA安装Postgresql 9.3

11

我正在尝试在Centos 7上设置Postgresql 9.3服务器(通过yum安装)在自定义目录中运行,我的情况是在启动时挂载一个加密分区(/custom_container/database)。由于某种原因,Postgresql不像手册中描述的那样正常工作,并在服务启动时发生错误。

注意:它不想接受我设置的PGDATA环境变量,当运行时出现问题。

su - postgres -c '/usr/pgsql-9.3/bin/initdb'

假设 PGDATA 目录的所有者是 postgres:postgres,则群集将在默认目录 /var/lib/pgsql/9.3/data/ 内初始化。

唯一改变这种情况的方式就是使用

su - postgres -c '/usr/pgsql-9.3/bin/initdb --pgdata=$PGDATA'

我正在使用自定义容器,需要初始化内部目录。我无法弄清楚这一点,因为文档中说PGDATA变量采用默认值。

问题:运行时出现

service postgresql-9.3 start

我在日志中遇到了一个错误

postgresql-9.3.service - PostgreSQL 9.3 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-9.3.service; disabled)
Active: failed (Result: exit-code) since Mon 2014-11-10 15:24:15 CET; 1s ago
Process: 2785 ExecStartPre=/usr/pgsql-9.3/bin/postgresql93-check-db-dir ${PGDATA} (code=exited, status=1/FAILURE)

Nov 10 15:24:15 CentOS-70-64-minimal systemd[1]: Starting PostgreSQL 9.3 database server...
Nov 10 15:24:15 CentOS-70-64-minimal postgresql93-check-db-dir[2785]: "/var/lib/pgsql/9.3/data/" is missing or empty.
Nov 10 15:24:15 CentOS-70-64-minimal postgresql93-check-db-dir[2785]: Use "/usr/pgsql-9.3/bin/postgresql93-setup initdb" to initialize t...ster.
Nov 10 15:24:15 CentOS-70-64-minimal postgresql93-check-db-dir[2785]: See %{_pkgdocdir}/README.rpm-dist for more information.
Nov 10 15:24:15 CentOS-70-64-minimal systemd[1]: postgresql-9.3.service: control process exited, code=exited status=1
Nov 10 15:24:15 CentOS-70-64-minimal systemd[1]: Failed to start PostgreSQL 9.3 database server.
Nov 10 15:24:15 CentOS-70-64-minimal systemd[1]: Unit postgresql-9.3.service entered failed state.
这意味着即使集群在新的$PGDATA目录(/custom_container/database)中初始化,Postgresql仍会在/var/lib/pgsql/9.3/data/中查找集群。有人之前遇到过这个Postgresql问题吗?我是忘了某些配置选项还是问题来自于Postgresql安装本身?谢谢您提前!

尝试运行 echo $PGDATA,结果是否显示了正确的路径? - Bagus Trihatmaja
是的,它显示/custom_container/database。 - Vitaly Stanchits
尝试使用 pg_ctl -D $PGDATA start & 命令并查看是否有效。 - Bagus Trihatmaja
这很有趣。su - postgres -c '/usr/pgsql-9.3/bin/pg_ctl -D $PGDATA start' 服务器正在启动 [root@CentOS-70-64-minimal database]# postgres无法访问服务器配置文件“/var/lib/pgsql/9.3/data/postgresql.conf”:没有这样的文件或目录 - Vitaly Stanchits
su - postgres -c 'echo $PGDATA' /var/lib/pgsql/9.3/data - Vitaly Stanchits
换句话说,PGDATA 没有为用户 postgres 设置,而只为用户 root 设置了! - Vitaly Stanchits
5个回答

6
似乎真正的问题在于设置环境变量,我在以下主题中解决了该问题:Centos 7 environment variables for Postgres service。问题在于自定义的 /etc/systemd/system/postgresql-9.3.service 中设置的 PGDATA 变量,应该从 /usr/lib/systemd/system/postgresql-9.3.service 的内容创建,后者使用默认的 PGDATA 变量。请注意保留 HTML 标记。

1
不错!而且也适用于其他版本!我想知道是否可以使用替代的初始化方法来初始化数据库,例如 postgresql95-setup。不确定这两种方法有什么区别,但除了运行其他内容之外,postgresql95-setup 在内部运行 initdb。然而,我无法弄清楚如何将 -D 开关传递给它,例如:usr/pgsql-9.5/bin/postgresql95-setup initdb -D <otherdir> 引发错误:systemctl: invalid option -- 'D' - msciwoj

5
您需要在/etc/systemd/system/中创建一个自定义的postgresql.service文件,该文件覆盖了默认的PGDATA环境变量。您的自定义服务文件可以.include默认的postgresql服务文件,这样您只需要添加想要更改的内容。这样一来,升级仍然可以修改/改进默认服务文件中的内容,而您的更改则得以保留。
以下是我在Centos 7上刚刚完成的操作:
cat <<END >/etc/systemd/system/postgresql.service
.include /lib/systemd/system/postgresql.service
[Service]
Environment=PGDATA=/mnt/postgres/data ## <== SET THIS TO YOUR WANTED $PGDATA
END

systemctl daemon-reload

systemctl restart postgresql.service

验证 :

ps -ax | grep [p]ostgres

更新:

您可以使用systemd内置的方法,而不是手动创建文件并添加.include行:

systemctl edit postgresql.service

这将打开您的默认编辑器并将更改保存到/etc/systemd/system/postgresql.service.d/override.conf

3

试一下这个:

 ## Login with postgres user
 su - postgres
 export PGDATA=/your_path/data
 pg_ctl -D $PGDATA start &

好的,在登录并手动设置变量后,这个可以工作。但是在再次登录后,PGDATA会被重置。有没有一种方法可以永久保存它? - Vitaly Stanchits
谢谢,现在我可以手动启动Postgres了。但是由于某些原因,service postgresql-9.3 start 仍然会寻找默认目录,并产生与之前相同的错误。是否有任何需要特别设置的内容,以便让Postgres作为服务运行? - Vitaly Stanchits
以下是一些好的阅读资源:postgresql更改默认数据目录 - Bagus Trihatmaja
看起来问题是服务功能本身:http://unix.stackexchange.com/questions/44370/how-to-make-unix-service-see-environment-variables "service strips all environment variables but TERM, PATH and LANG which is a good thing" 所以我需要为pgsql数据库创建一个定制的服务。 - Vitaly Stanchits
啊,是的,你可以修改PostgreSQL服务(先备份)。祝你好运! - Bagus Trihatmaja

3

我认为最符合CentOS 7的做法是复制服务文件:

sudo cp /usr/lib/systemd/system/postgresql-9.6.service /etc/systemd/system/postgresql-9.6.service

然后编辑文件 /etc/systemd/system/postgresql-9.6.service

# Location of database directory
Environment=PGDATA=/mnt/volume/var/lib/pgsql/9.6/data/

接下来执行命令 sudo systemctl start postgresql-9.6,然后进行验证:

# sudo ps -ax | grep postmaster
32100 ?        Ss     0:00 /usr/pgsql-9.6/bin/postmaster -D /mnt/volume/var/lib/pgsql/9.6/data/

0
尝试编辑文件 /etc/init.d/postgresql-9.3: PGDATA=/your/custom/path

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接