什么是更改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这个脚本而不能完全理解它在五分钟内做了什么。
-
我并不感到奇怪,使用
psql
和SET
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