什么是更改PostgreSQLconfiguration的可靠方法,尤其是将其数据目录移动到脚本中?

我想要达到什么

为了将一些软件和PostgreSQL一起打包到docker容器中,我想把PostgreSQL的data_directory和所有其他的持久数据一起改成/srv

背景信息:

  • PostgreSQL刚刚使用apt-get
  • postgresql服务从来没有开始在这一点上
  • 我的目的是在没有惹麻烦的情况下移动/srv的持久数据。 我不在乎如何实现这一点,设置data_directory似乎最适合我。

关于问题的思考

  • 我可以使用sed来修改postgresql.conf ,例如像这样:

     $ sed -i 's#^\(data_directory\s*=\s*\).*$#\1/srv/postgresql/main#'\ /etc/postgresql/9.1/main/postgresql.conf 

    但是如果有更好的方法,我不太喜欢在configuration文件中使用脚本。 我发现一个相当大的perl脚本来修改PostgreSQLconfiguration文件 ,但是我有些害怕embedded这个脚本而不能完全理解它在五分钟内做了什么。

  • 我并不感到奇怪,使用psqlSET SQL命令在运行的系统中进行更改失败:

     postgres=# set data_directory to '/srv/postgresql/main'; ERROR: parameter "data_directory" cannot be changed without restarting the server 
  • 另一方面, pg_config只能打印信息而不能安装。

现在?

通常情况下,有设置选项的方便可靠的工具,PostgreSQL是否也有一个?

既然你提到了apt-get作为安装的方式,这意味着我们正在讨论Debian及其衍生产品的PostgreSQL。

在Debian中,PostgreSQL的数据位置是通过像这样创build一个集群来设置的:

 # pg_createcluster --datadir=/path/to/data [other options] version name 

其中版本是9.1的主要版本,并name您select的短名称来识别此群集。 它实际上将数据结构放在目录中,而不是仅仅改变postgresql.conf中的一行,这本身就是无用的。

当运行apt-get install postgresql或者一个意味着安装一个新的PG服务器的变种时,它会隐式地创build并启动一个名为main ,datadir为/usr/lib/postgresql/<version>/main

在创build另一个集群之前 ,您想要删除该集群使其只能运行一个集群,例如9.1:

 # pg_dropcluster --stop 9.1 main