我观察到 /etc/init.d/postgresql 在新版本 (postgresql-8.4.7) 中发生了重大变化。我之前使用的是 postgresql-8.1.23,如果集群不存在,/etc/init.d/postgresql start 会执行 initdb,但现在情况并非如此。我必须单独执行 initdb。
- 你知道为什么要这样改变吗?
- 你知道从哪个版本开始是这样吗?(我查看了发行说明,但没找到)
我面临的问题是,我有一个 CentOS 的 kickstart 安装,其中包括依赖 postgres 的软件包。因此,我在 %post 中执行 /sbin/chkconfig postgresql on。现在,由于默认情况下 initdb 未完成,我无法在启动时启动我的服务。
答案1
之所以进行此更改,是因为对于那些最终打算将数据库放入默认位置以外的其他位置的人来说,这是一种令人惊讶且不受欢迎的行为——这是一种非常常见的更改。旧版本将 initdb 步骤捆绑到启动中,这对他们来说是一个问题。较新的版本通过使其成为一个明确的步骤来避免这种情况。它仍然很容易,只是不是自动的,对于自定义目标的人来说可能会出错。我不确定打包者在哪个版本进行了此更改,但它是 8.2 或 8.3。已经存在很长时间了,现在不太可能恢复到原来的行为。
如果您想要以 kickstart 方式自动执行此操作,则需要一个脚本来设置尚未正确设置的情况。以下是您在启动时需要运行的代码类型:
PGDATA=/var/lib/pgsql/data
. /etc/sysconfig/pgsql/postgresql
if [ ! -f "$PGDATA/PG_VERSION" ] ; then
/sbin/service postgresql initdb
/sbin/service postgresql start
fi
您可以将其放入自己的初始化脚本中,或者您可以自定义/etc/rc.d/rc.local并将其包含在那里。这样编写,每次都会进行快速无害的检查。使用类似 firstboot init 脚本的脚本,运行一次后可能可以完全消除它。