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