PostgreSQL版本快速升级
写在前面
PostgreSQL9.5版本支持数据分片的功能,为以后做分布式考虑,准备将生产环境的9.1版本升级至9.5。中间需要做数据迁移。
在迁移操作中,为保证数据完整性,一般需要在数据库停止的情况下进行备份恢复操作,在数据量小的情况下,通过pg_dumpall的方式备份恢复也是很迅速的,但如果数据量大的情况,再使用这种方式将会耗去大量的时间,特别在生产环境中,长时间的停止使用数据库是非常致命的。
PostgreSQL提供了pg_upgrade的命令用于数据库版本的升级,使用link模式可以快速对数据进行迁移操作。
操作步骤:
1、安装新版本数据库
/PATH/TO/postgresql-9.5.1-1-linux-x64.run,根据提示进行数据库安装操作。
2、停止旧版本的数据库
/etc/init.d/postgresql-9.1 stop ,根据实际情况停止数据库运行
3、检查旧数据的区域支持格式
区域支持在初始化数据库时被指定,不可更改,因此需要将新的数据库的区域支持更改成与旧数据库一样,否则pg_upgrade操作会报错。
a、查看旧数据库的区域支持,主要是lc-collate,lc-ctype两个参数,进入数据库,使用\l,可以查看
b、使用initdb指定区域支持初始化新的数据库。
/PATH/TO/9.5/bin/initdb --lc-collate=zh_CN.utf8 --lc-ctype=zh_CN.utf8 --lc-messages=zh_CN.utf8 --lc-monetary=zh_CN.utf8 --lc-numeric=zh_CN.utf8 --lc-time=zh_CN.utf8 -D /PATH/newdata/
4、通过link mode 进行快速的数据库升级,要使用link模式需确保新旧数据目录在同一个文件系统底下
先介绍下pg_upgrade的几个常用参数:使用pg_upgrade --help可以查看详细参数配置
-d, --old-datadir=DATADIR 指定旧数据文件所在目录
-D, --new-datadir=DATADIR 指定新数据文件所在目录
-b, --old-bindir=BINDIR 指定旧版本可执行命令目录
-B, --new-bindir=BINDIR 指定新版本可执行命令目录
-k, --link 使用link模式进行更新(即使用硬链接的方式将新数据文件指向旧数据文件的真实存放位置,减去了copy的时间)
/PATH/TO/9.5/bin/pg_upgrade -d /PATH/TO/olddata -D /PATH/TO/newdata -b /PATH/TO/9.1/bin -B /PATH/TO/9.5/bin --link
若没报错,则完成。
5、启动新数据库
参考:
http://www.postgresql.org/docs/9.5/static/pgupgrade.html