在 CentOS 7 中哪里设置 PGOPTS 变量

在 CentOS 7 中哪里设置 PGOPTS 变量

我正在使用 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.

相关内容