Postgres 9.5 Upgrade

Postgres 9.5 Release

9.5 正式发布,推出如下几个新功能:Announcement

  • UPSERT(最期待)
  • Row Level Security
  • Big Data

升级兼容问题

将数据库升级到了 9.5.0 后,发现无法正常启动:

1
2
3
4
$ postgres -D /usr/local/var/postgres
# FATAL: database files are incompatible with server
# DETAIL: The data directory was initialized by PostgreSQL version 9.4, which is not compatible with this version 9.5.0.

Postgres 并不遵循 Semantic Versioning 规范,9.4 -> 9.5 是大版本变动,会有数据结构的变化。Postgres: Upgrading a PostgreSQL Cluster

Data Upgrade

因为数据结构变化,导致无法直接升级使用,就是看如何升级,考虑到使用场景,会有如下三种方案,数据目录删除重建,数据库备份还原,数据目录升级。

1. 重建数据目录

如果是开发机器,上面的数据不是很重要,可以选择删除数据目录,用新版重建。(OSX and Brew installed)

关停 pg

记得要先关停 pg,不然会自动创建目录,自动新建的目录有权限问题。

1
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
重建数据库目录并进行初始化
1
2
$ rm -rf /usr/local/var/postgres
$ initdb /usr/local/var/postgres
启用 pg
1
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist

2. 数据库备份还原

当然也可以通过备份(pg_dump),再还原(pg_)的方式,将 DB 数据进行升级。(这也是官方最推荐的做法。)

http://www.postgresql.org/docs/9.5/static/backup-dump.html

单数据库 SQL Dump
1
> pg_dump dbname > outfile
1
> psql dbname < infile
多数据库 Dump
1
> pg_dumpall > outfile
1
> psql -f infile postgres

3. 数据目录升级

通过 pg_upgrade 来对旧的数据库目录进行升级,但这个需要新旧版本同时存在。

那新版数据库目录呢?我们得自己去建立一个新目录,使用上文提到的 initdb 命令,并跟旧目录使用同一个名字。所以我们要先把旧版目录换个名字,再建立新目录。

1
2
$ mv /usr/local/var/postgres /usr/local/var/postgres_94
$ initdb -D /usr/local/var/postgres

当新目录创建好以后,准备工作就做完了。这时就可以使用 pg_upgrade 了。

1
2
3
$ pg_upgrade -b /usr/local/Cellar/postgresql/9.4.4/bin -B /usr/local/Cellar/postgresql/9.5.0/bin -d /usr/local/var/postgres_94 -D /usr/local/var/postgres -v
# -v 显示执行详细信息

REF::