我正在使用 Postgresql 10,在安装数据库后我将其放置PGOPTS="-i"
在这个文件中/etc/sysconfig/pgsql/postgresql
,以便 Postgresql 可以在所有接口上监听。
当我使用 CentOS 6 时,这个功能有效,并且 postgresql 使用-i
命令行中的选项启动。
但是,我需要将数据库迁移到 CentOS 7,而 postgresql(现在它开始使用postmaster
而不是postgres
)没有使用该选项启动。
我知道在 EL7 中systemd
使用,并且可能无法读取 sysconfig 目录中的文件。但是,我在哪里可以设置此变量?
我也正在考虑将此变量设置为新文件。由于我使用的是 Ansible,因此需要有一个具有此配置的新文件。这意味着我不想编辑现有文件(例如postgres.conf
放置在数据库安装目录中的文件)。只有在没有其他选项可以在某处设置 PGOPTS 变量时才会这样做。
我努力了:
/usr/lib/systemd/system/postgresql.service.d/postgresql.conf
组内包含以下内容[Service]
:Environment=PGOPTS=-i
。我可以看到目录已被读取(并且其他变量也被读取 - 例如 PGDATA - 但它没有读取 PGOPTS 或者至少 postmaster 进程没有使用该选项启动);为了这个目的,我也尝试过设置它,但/usr/lib/systemd/system/postgresql.service
没有成功;/etc/conf.d/postgresql
但是,正如我在某处读到的那样,它不再使用了;/etc/profile.d/postgresql.sh
设置和导出变量;~postgres/.bash-profile
设置和导出变量;
答案1
使用 systemd 是正确的选择环境=设置。(另一方面,服务启动过程不涉及任何事物例如用户 shell 和交互式登录,所以“配置文件”绝对不相关。)
但问题是 PostgreSQL 守护进程不使用并且从未使用过此环境变量。实际软件中没有任何东西可以将 $PGOPTS 的内容神奇地附加到守护进程的命令行中。
据说魔法曾经在古老的启动脚本(/etc/rc.d/init.d/postgresql
在 systemd 之前由 RedHat/CentOS 使用)——它实际上并不用作“环境”变量,而是作为“postgres”命令行中的直接替换:
111 # 如果文件存在,则覆盖 /etc/sysconfig/pgsql 中的默认值 112 [ -f /etc/sysconfig/pgsql/$ {名称} ] && . /etc/sysconfig/pgsql/$ {名称} 113 ... 178 回显 -n "$PSQL_START" 179 $SU -l postgres -c "$PGENGINE/postmaster -p '$PGPORT' -D '$PGDATA'${PGOPTS}&" >> "$PGLOG" 2>&1 </dev/null 180 睡觉 2
那么-i
如果不添加到 $PGOPTS,该在哪里添加命令行选项呢?当然,直接将其添加到“postgres”命令行。完整的命令行在执行开始=对于 systemd 的 postgresql.service;你可以看到它仍然保留一些替换,但您也可以直接添加自定义选项:
ExecStart=/usr/pgsql-11/bin/postmaster -D ${PGDATA}
将其更改为:
ExecStart=/usr/pgsql-11/bin/postmaster -D ${PGDATA} -i
注意:不要编辑 /usr/lib 中的 systemd 单元;而是将单元文件复制到 /etc/systemd/system 并编辑您的副本,这样您的更改就不会在软件包升级期间丢失。
postmaster(1) 手册页说:
DESCRIPTION
postmaster is a deprecated alias of postgres.