【问题标题】:Create multiple Postgres instances on same machine在同一台机器上创建多个 Postgres 实例
【发布时间】:2016-06-16 13:51:19
【问题描述】:

为了测试流复制,我想在同一台机器上创建第二个 Postgres 实例。这个想法是,如果可以在测试服务器上完成,那么在两台生产服务器上设置它应该是微不足道的。

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

我正在使用 Postgres 9.3,Postgres 帮助页面说要在 postgres 命令行上指定配置文件。我不太确定这意味着什么。我是否应该安装一些客户端才能正常工作?谢谢。

【问题讨论】:

  • 只需运行initdb 将其指向不同的数据目录(并指定不同的端口)
  • initdb 是否能够使用自定义配置文件创建数据库集群?看来我只能指定数据的存储位置了。
  • initdb 创建配置文件(在数据目录中)

标签: postgresql


【解决方案1】:

我假设您可以使用 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 中保持不变。

【讨论】:

  • 如果你想使用不同的配置文件位置,你可以根据documentation在-o字符串中指定。 -o "config_file=/path/to/my/postgresql.conf" 之类的东西(未经测试!)
【解决方案2】:

在基于 Debian 的发行版上,您可以使用 pg_createcluster 而不是 initdb

$ pg_createcluster -u [user] -g [group] -d /path/to/data -l /path/to/log -p 5433

另外pg_ctlclusterpg_ctl 的替代品。

【讨论】:

    【解决方案3】:

    在 PostgreSQL 9.5 上创建新服务器实例的步骤

    1. 在命令提示符下运行:

      initdb -D Instance_Directory_path -U username -W
      

      (提示输入密码)

    2. 一旦创建了新的实例目录。以管理员身份运行命令提示符

      pg_ctl register -N service_name -D Instance_Directory_path -o "-p port_no"
      
    3. 服务注册后,启动服务器

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

    【讨论】:

    • pg_ctl register 仅在 windows 上。
    【解决方案4】:

    在 CentOS 中完成其他答案。

    运行之后

    $ initdb -D /path/to/newdb
    

    您必须至少更改 port 配置选项,并且可能在配置文件 postgresql.conf 中更改 listen_addresses

    您可能希望新实例在系统启动时自动运行(例如在关机的情况下),而不是立即启动这个新实例,这已在之前的答案中进行了解释。为此,由于 CentOS 没有 pg_ctl register 选项(仅适用于 Windows),您必须创建一个新的服务文件并注册它,以便 systemctl 或服务可以自动启动它。

    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 
    

    【讨论】:

      猜你喜欢
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-03
      相关资源
      最近更新 更多