在同一台机器上创建多个Postgres实例

33
为了测试流复制,我想在同一台机器上创建第二个Postgres实例。这样做的想法是,如果可以在测试服务器上完成,则应该很容易在两个生产服务器上设置。

这些实例应该使用不同的配置文件和不同的数据目录。我尝试按照此处的说明http://ubuntuforums.org/showthread.php?t=1431697,但我还没有弄清楚如何让Postgres使用不同的配置文件。如果我复制init脚本,则这些脚本只是同一个Postgres实例的别名。

我正在使用Postgres 9.3,Postgres帮助页面上说要在postgres命令行上指定配置文件。我真的不知道这是什么意思。我应该安装一些客户端才能使其工作吗?谢谢。


1
只需运行 initdb 命令并将其指向不同的数据目录(并指定不同的端口)。 - user330315
“initdb” 能否使用自定义配置文件创建数据库集群?似乎我只能指定数据存储的位置。 - npCompleteNoob
1
initdb 在数据目录中创建配置文件。 - user330315
4个回答

42

我认为你可以熟练使用PostgreSQL实用工具。

创建集群

$ initdb -D /path/to/datadb1
$ initdb -D /path/to/datadb2

运行实例

$ pg_ctl -D /path/to/datadb1 -o "-p 5433" -l /path/to/logdb1 start
$ pg_ctl -D /path/to/datadb2 -o "-p 5434" -l /path/to/logdb2 start

测试流式复制

现在你有两个在端口5433和5434上运行的实例。它们的配置文件存储在由initdb指定的数据目录中。调整它们以进行流式复制。
您的默认安装保持在端口5432上不变。


1
如果您想使用不同的配置文件位置,可以根据文档在-o字符串中指定。例如:-o "config_file=/path/to/my/postgresql.conf"(未经测试!) - cachique
谢谢!在这个过程中我做了一点改变:在-o后发送的参数会传递给postgres服务器,因此您可以通过命令行标志设置端口,而postgresql.conf会接收到这些更改但不是显式地,您可能需要在之后更改文件。我认为最好的做法是先修改它,然后启动服务器并设置那个配置文件。(在下一个评论中,我将留下命令) - zaratustra689
所以,在执行 initdb -D /path/to/datadb1 后,我修改了 /path/to/datadb1/postgresql.conf 文件中的参数 data_directoryhba_fileident_filelisten_addressesport(其中一些是可选的),并使用以下命令启动了服务器: pg_ctl -D /path/to/datadb1/ -o "-c config_file=/path/to/datadb1/postgresql.conf" -l /path/to/logdb1.log start - zaratustra689

8
在基于Debian的发行版中,您可以使用pg_createcluster代替initdb:
$ pg_createcluster -u [user] -g [group] -d /path/to/data -l /path/to/log -p 5433

此外,pg_ctlclusterpg_ctl的另一种选择。

8
创建 PostgreSQL 9.5 新服务器实例的步骤如下:
  1. On command prompt run:

    initdb -D Instance_Directory_path -U username -W
    

    (prompts for password)

  2. Once the new Instance Directory is created. Run command prompt as Administrator

    pg_ctl register -N service_name -D Instance_Directory_path -o "-p port_no"
    
  3. After the service is registered, start server

    pg_ctl start -D Instance_Directory_path -o "-p port_no"
    

3
pg_ctl register 只适用于 Windows 系统。 - Grim

1
为了补充其他答案,以下内容适用于CentOS 6和7版本。运行类似以下命令后:
$ initdb -D /path/to/newdb

您需要更改配置文件postgresql.conf中的至少port配置选项和可能的listen_addresses
与其立即启动这个新实例(在之前的答案中已经解释过),也许你希望新实例在系统启动时自动运行(例如,在关机后)。为了做到这一点,由于CentOS没有pg_ctl register选项(仅适用于Windows),您需要创建一个新的服务文件并注册它,以便systemctl或service可以自动启动它。
  • Centos 6
请按照以下命令获取服务的初始化文件:
[root@machine ~]# service postgresql-9.6 edit
Usage: /etc/init.d/postgresql-9.6 {start|stop|status|restart|upgrade|condrestart|try-restart|reload|force-reload|initdb|promote}
[root@machine ~]# cd /etc/init.d          # Now we know where service file is
[root@machine init.d]# cp -p postgresql-9.6 postgresql-9.6_5433
[root@machine init.d]# vi postgresql-9.6_5433

现在,您可以更改PGDATA目录为新实例所在的目录。如果您使用的是早于9.4版本的Postgresql(在本答案发布时不应该这样做),您还需要更改PGPORT为新实例正在侦听的值。
新服务的名称由您决定。我通常采用原始服务名称并在末尾添加端口号。
现在,您只需要注册新服务:
[root@machine init.d]# chkconfig postgresql-9.6_5433 on        # service registered!
[root@machine init.d]# service postgresql-9.6_5433 start
Iniciando servicios postgresql-9.6_5433:                   [  OK  ]
[root@machine init.d]# service postgresql-9.6_5433 status
Se está ejecutando postgresql-9.6_5433 (pid  120993)...
  • CentOS 7

在CentOS 7中,控制机器上运行的服务不再使用service命令,而是使用systemctl命令,相应的命令和路径也有所改变。但是流程基本相同:创建新的服务文件,用新的位置/端口进行编辑,注册并启动服务:

[root@localhost ~]# locate postgresql.service
/etc/systemd/system/multi-user.target.wants/postgresql.service
/usr/lib/systemd/system/postgresql.service
[root@localhost ~]# cd /usr/lib/systemd/system
[root@localhost ~]# cp -p postgresql.service postgresql_5433.service
[root@localhost ~]# vi postgresql_5433.service
# Change PGDATA and maybe PGPORT if PG version <9.4
[root@localhost ~]# systemctl enable postgresql_5433.service
[root@localhost ~]# systemctl start postgresql_5433.service
[root@localhost ~]# systemctl list-unit-files | grep postgres
postgresql.service                                 enabled 
postgresql_5433.service                            enabled 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接