PostgreSQL 利用pg_upgrade升级版本
参考:http://www.postgresql.org/docs/current/static/pgupgrade.html
- 概述
从低版本升级到 新版本,有几种可选的方案。一是使用pg_dump/pg_restore,该方法比较耗时,也即是停机时间比较长,特别是大数据量下,但是 稳定且易于操作。二是和MySQL那样利用复制的方式,停机时间短,但操作相对复杂。第三种就是利用pg_upgrade,重建系统表,相对停机时间较短。
- pg_upgrade
1. 语法
pg_upgrade -b oldbindir -B newbindir -d olddatadir -D newdatadir [option...]
2. 原理
根据官方文档介绍,PostgreSQL 每次升级主要体现在系统表的改变,对于数据文件的格式基本不做改动,因此利用这个特性,只要重建所有系统表,复用原有数据文件,即可完成升级。对于 8.4.X后的每一次大版本升级都适用。需要注意的是,即便如此,该方法也有一定的限制,在官方文档的NOTE部分有详细说明。
- 升级步骤
1. 编辑postgresql.conf,修改旧数据库端口为5433
2. 安装新版PostgreSQL
3. 停止新旧数据库服务
sudo service postgresql stop
4. 验证兼容性
/usr/lib/postgresql/9.4/bin/pg_upgrade --old-datadir=/var/lib/postgresql/9.3/main/ --new-datadir=/var/lib/postgresql/9.4/main/ --old-bindir=/usr/lib/postgresql/9.3/bin/ --new-bindir=/usr/lib/postgresql/9.4/bin -p5433 -P5432 -o"-c config_file=/etc/postgresql/9.3/main/postgresql.conf" -O"-c config_file=/etc/postgresql/9.4/main/postgresql.conf" -c
5. 升级
/usr/lib/postgresql/9.4/bin/pg_upgrade --old-datadir=/var/lib/postgresql/9.3/main/ --new-datadir=/var/lib/postgresql/9.4/main/ --old-bindir=/usr/lib/postgresql/9.3/bin/ --new-bindir=/usr/lib/postgresql/9.4/bin -p5433 -P5432 -o"-c config_file=/etc/postgresql/9.3/main/postgresql.conf" -O"-c config_file=/etc/postgresql/9.4/main/postgresql.conf"
6. 执行脚本重建统计信息,删除旧数据库(可选)
./analyze_new_cluster.sh ./delete_old_cluster.sh