2016-02-28 47 views
0

我试图找到一个最快的方式将postgresql 数据库v9.1.20从一台服务器移动到另一台服务器 与postgres v9.3.10。Postgresql就地数据库升级

方案如下:

生产服务器上运行Ubuntu 12.04 的PostgreSQL 9.1.20,数据库大小appox250克

目标服务器,我们正试图重新定位上是 的Ubuntu 14.04 postgresq 9.3.10。

我们正在试图与 尝试的第一个尝试是从旧服务器转储数据库(pg_dump)和新服务器(pg_restore)上还原 它。

它工作得很好,但我们花了 搬迁时间大约为4小时(pg_dump需要3个小时 和pg_restore的需要1个小时(网络链接1G, SSD磁盘两台服务器上)。

总停机时间在4小时内是不能接受的。

下一次尝试是使用pg_basebackup代替 pg_dump,该方法减少了备用时间可达40分钟 代替3-小时,这是可以接受的。

但是由于版本不兼容,我们无法使用由pg_basebackup 提供的转储。

我已经阅读了很多关于如何提供就地数据库 升级的文章,但似乎他们都指的是在同级服务器上升级 。

所以我的问题 - 我该如何升级由pg_basebackup在服务器上产生 数据库备份,而无需以前 发球的PostgreSQL安装的二进制文件?

谢谢。

+0

你尝试管'pg_dump'的直接输出成'psql'?像'pg_dump -h host1 dbname | psql -h host2 dbname'顺便说一句:为什么你不升级到更新的版本,如9.4或9.5? –

+0

您可以将旧版本(二进制文件+数据)的(二进制)副本发送到新机器(编译并)在那里安装新版本,并在新机器上执行--link(“in-place”)升级。 http://www.postgresql.org/docs/9.5/static/pgupgrade.html [当然,以干运行开始。旧的安装仍在旧机器上运行] – wildplasser

回答

0

您可以使用repmgrpg_upgrade执行升级,停机时间最短(几分钟)。

  1. 在master(postgresql 9.1)上启用流式复制。数据库重启是必需的

    hot_standby = on 
    wal_keep_segments = 4000 # must be hight enough for standby to catch up 
    
  2. 在备用服务器上安装PostgreSQL 9.1和9.3。在两台服务器上安装repmgr 2.0。因为repmgr 3.x版本适用于PostgreSQL 9.3或更高版本。

  3. 同步主和备用服务器:

    repmgr -D /var/lib/postgresql/9.1/main -p 5432 -d repmgr -U repmgr --verbose standby clone -h psql01a.example.net --fast-checkpoint 
    

    下边pg_basebackup应该被使用。所以这个方法与你所描述的方法非常相似。

  4. 一旦克隆完成后你就可以开始注册待机:

    repmgr -f /etc/repmgr.conf standby register 
    service postgresql start 
    

    这将使待机赶上复制期间犯下的主变化。如果你通过升级,你必须停止主检查

    /usr/lib/postgresql/9.3/bin/pg_upgrade --check \ 
        --old-datadir=/var/lib/postgresql/9.1/main \ 
        --new-datadir=/var/lib/postgresql/9.3/main \ 
        --old-bindir=/usr/lib/postgresql/9.1/bin \ 
        --new-bindir=/usr/lib/postgresql/9.3/bin -v 
    
  5. 随着运行(同步)两个数据库中检查是否升级是可能的。现在停机时间到了。提升待机状态。

    postgres#: repmgr standby promote 
    service postgresql start 
    # if everything looks ok, just stop the server 
    service postgresql stop 
    

    最快的升级方法是使用链接:

    /usr/lib/postgresql/9.3/bin/pg_upgrade --link \ 
        --old-datadir=/var/lib/postgresql/9.1/main \ 
        --new-datadir=/var/lib/postgresql/9.3/main \ 
        --old-bindir=/usr/lib/postgresql/9.1/bin \ 
        --new-bindir=/usr/lib/postgresql/9.3/bin 
    

    即使有200GB数据升级不会超过几分钟的时间(通常小于一分钟)长。当事情向南时,很难恢复更改(但我们仍然有功能主服务器)。升级完成后,启动新的服务器。确认一切正常,然后你可以安全地删除旧的群集:

    ./delete_old_cluster.sh