CentOS下升级PostgreSQL

之前系统是PostgreSQL9.3,看到最近发布的9.4功能还不错,据说对JSONB的支持要强过MongoDB,于是想升级尝一下鲜。

1. 升级前的准备

备份数据这个就不多说了,任何版本升级还是有风险的,所以建议先备份一下数据。

另外对于大型数据库的升级还需要额外的谨慎,对于一个百G级别以上数据库升级的话,可能会耗费较长的时间以及需要足够多的额外存储空间(升级过程中可能会触及数据的copying操作)。本人测试的数据库目前也就700MB的级别。

2.  安装新的PG版本

我们需要下载安装系统对应版本的Repository,具体可以参见官网:http://yum.postgresql.org/ ,目前最新的版本是 9.4.1

wget http://yum.postgresql.org/9.4/redhat/rhel-7-x86_64/pgdg-centos94-9.4-1.noarch.rpm 
rpm -ivh ./pgdg-centos94-9.4-1.noarch.rpm

然后我们谨慎起见,最好查验一下当前系统已安装的版本,和即将安装更新的版本是否符合预期。

查验当前系统安装的版本:

rpm -qa | grep postgre
postgresql93-9.3.6-2PGDG.rhel7.x86_64
postgresql93-devel-9.3.6-2PGDG.rhel7.x86_64
postgresql93-libs-9.3.6-2PGDG.rhel7.x86_64
postgresql93-contrib-9.3.6-2PGDG.rhel7.x86_64
postgresql93-server-9.3.6-2PGDG.rhel7.x86_64

然后再查验一下可升级的版本

yum list postgres* | grep 94 
postgresql94.x86_64 9.4.1-1PGDG.rhel7 pgdg94
postgresql94-contrib.x86_64 9.4.1-1PGDG.rhel7 pgdg94
postgresql94-debuginfo.x86_64 9.4.1-1PGDG.rhel7 pgdg94
postgresql94-devel.x86_64 9.4.1-1PGDG.rhel7 pgdg94
postgresql94-docs.x86_64 9.4.1-1PGDG.rhel7 pgdg94
postgresql94-jdbc.noarch 9.3.1101-2.rhel7 pgdg94
postgresql94-jdbc-javadoc.noarch 9.3.1101-2.rhel7 pgdg94
postgresql94-libs.x86_64 9.4.1-1PGDG.rhel7 pgdg94
postgresql94-odbc.x86_64 09.03.0300-1PGDG.rhel7 pgdg94
postgresql94-odbc-debuginfo.x86_64 09.03.0300-1PGDG.rhel7 pgdg94 
postgresql94-plperl.x86_64 9.4.1-1PGDG.rhel7 pgdg94
postgresql94-plpython.x86_64 9.4.1-1PGDG.rhel7 pgdg94
postgresql94-pltcl.x86_64 9.4.1-1PGDG.rhel7 pgdg94
postgresql94-python.x86_64 4.1.1-1PGDG.rhel7 pgdg94
postgresql94-python-debuginfo.x86_64 4.1.1-1PGDG.rhel7 pgdg94 postgresql94-server.x86_64 9.4.1-1PGDG.rhel7 pgdg94 postgresql94-test.x86_64 9.4.1-1PGDG.rhel7 pgdg94

如果都没有问题的话,接下来就可以安装新的版本了,我只安装了我需要的包。

yum install postgresql94 postgresql94-devel postgresql94-libs postgresql94-contrib postgresql94-server

因为我有安装postgis, 所以还需要再安装一个支持9.4版本的postgis

yum install postgis2_94

3. 开始升级

首先我们需要初始化9.4版本的数据库

/usr/pgsql-9.4/bin/postgresql94-setup initdb

停止旧版9.3的服务

service postgresql-9.3 stop

使用pg_upgrade将9.3升级至9.4, pg_upgrade的主要涉及到的参数说明如下:

-b old postgresql binary directory -B new postgresql binary directory -d old postgresql data directory -D new postgresql data directory

开始执行升级命令:

su postgres #pg_upgrade 不能使用root用户执行 
mkdir /var/lib/pgsql/upgrade; 
cd /var/lig/pgsql/upgrade #这一步就是为了给postgres用户找一个记录升级日志的地方,如果当前目录没有写的权限,会报错 
/usr/pgsql-9.4/bin/pg_upgrade -v -b /usr/pgsql-9.3/bin/ -B /usr/pgsql-9.4/bin/ -d /var/lib/pgsql/9.3/data/ -D /var/lib/pgsql/9.4/data/

如果顺利的话,就可以看到类似的结果(我只摘录了最后一段),我的测试环境拥有一个700MB的数据库,实际升级完成速度很快。

Upgrade Complete ---------------- Optimizer statistics are not transferred by pg_upgrade so, once you start the new server, consider running: analyze_new_cluster.sh Running this script will delete the old cluster's data files: delete_old_cluster.sh

4. 升级后的一些配置

复制 pg_hba.conf 文件

cp /var/lib/pgsql/9.3/data/pg_hba.conf /var/lib/pgsql/9.4/data/pg_hba.conf

同步postgresql.conf配置,这个文件不建议直接用老版本的直接覆盖,因为新版可能会有新的配置项出现。

diff /var/lib/pgsql/9.3/data/postgresql.conf /var/lib/pgsql/9.4/data/postgresql.conf

接下来就可以启动9.4的服务了

service postgresql-9.4 start

5. 升级完成后的一些工作

优化升级后的数据库,这个需要使用postgres用户来执行, 当然这个不是必须的,可以根据实际情况来决定:

su postgres cd /var/lib/pgsql/upgrade/ ./analyze_new_cluster.sh

如果确认新的版本服务正常的话,我们就可以把旧的版本删除了。

删除旧版本的目录:

cd /var/lib/pgsql/upgrade/ #就是之前执行pg_upgrade的那个临时目录 ./delete_old_cluster.sh

删除旧的包(相关依赖这些版本的包也会一同被删除,这个需要小心确认一下):

yum remove postgresql93-9.3.6 postgresql93-devel-9.3.6 postgresql93-libs-9.3.6 postgresql93-contrib-9.3.6 postgresql93-server-9.3.6

最后,如果希望开机能自动启动服务的话还要设置一下

chkconfig postgresql-9.4 on