Postgresql inplace数据库升级

时间:2016-02-28 12:06:39

标签: database postgresql upgrade

我正在尝试找到一种移动postgresql的最快方法 数据库v9.1.20从一台服务器到另一台服务器 与postgres v9.3.10。

情景如下:

运行Ubuntu 12.04的生产服务器 postgresql 9.1.20,数据库大小appox 250g

我们尝试重新定位的目标服务器是 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提供的转储 由于版本不兼容。

我读过很多关于如何提供inplace数据库的文章 升级,但似乎他们都指的是升级 SAME服务器。

所以我的问题 - 如何升级生成的数据库备份 由服务器上的pg_basebackup提供,而不是之前的 postgresql服务二进制文件安装?

感谢。

1 个答案:

答案 0 :(得分: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
    

    这将允许备用数据库捕获复制期间在主服务器上提交的更改。

  5. 两个数据库都在运行(同步),检查是否可以升级:

    /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
    
  6. 如果通过升级检查,则必须停止主控。现在是停机期。提升备用掌握。

    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