前言
PostgreSQL 的版本号由主要版本号和次要版本号组成。例如,在 10.1
中,10
是主要版本,1
是次要版本。关于更多版本的规划,请参考 PostgreSQL 版本路线图。
版本号规则:
- PostgreSQL 10 及以后:版本号采用
X.Y
形式(如10.1
,11.2
),其中X
为主要版本,Y
为次要版本。 - PostgreSQL 10 之前:版本号采用
X.Y.Z
形式(如9.5.3
),其中X.Y
为主要版本(如9.5
),Z
为次要版本(如3
)。
升级规则:
- 次要版本升级(如 10.1 → 10.6,9.5.3 → 9.5.6) :数据存储格式保持不变,可直接替换可执行文件并重启(例如直接下载替换 /usr/local/pgsql/bin 下的 postgres 相关二进制文件)。
- 主要版本升级(如 9.5 → 9.6,10 → 11) :数据格式可能变化,通常需要数据导出/导入,但
pg_upgrade
可简化这一过程。
pg_upgrade
pg_upgrade
(原 pg_migrator
)用于快速升级 PostgreSQL 主要版本,避免传统数据导出/导入的繁琐操作。例如:
- 支持升级:
9.5.8 → 9.6.4
,10.7 → 11.2
- 不需要 pg_upgrade:
9.6.2 → 9.6.3
,10.1 → 10.2
(仅次要版本升级)
工作原理:
- 主要版本升级可能更改系统表结构,但通常不会改变数据存储格式。
pg_upgrade
通过创建新系统表并重用旧用户数据,实现高效升级。- 若未来版本彻底更改数据存储格式,则
pg_upgrade
可能无法支持该升级。
兼容性要求:
- 确保旧版与新版二进制兼容(如 32/64 位设置)。
- 扩展插件需自行检查是否兼容,
pg_upgrade
无法自动验证。
支持范围:
pg_upgrade
可用于 PostgreSQL 8.4 及以上版本,包括 beta 版本。
升级流程
真实生产环境 pgsql 9.3 版本升级到 pgsql 10 升级操作流程记录。
安装新版本并初始化
$ #/usr/pgsql-10/bin/postgresql-10-setup initdb
停止旧版本的数据库
$ kill -INT `head -1 /var/lib/pgsql/9.3/data/postmaster.pid`
切换至postgres用户
$ su - postgres
pg_upgrade 检查数据库兼容性
$ /usr/pgsql-10/bin/pg_upgrade \
-b /usr/pgsql-9.3/bin/ \
-B /usr/pgsql-10/bin/ \
-d /var/lib/pgsql/9.3/data/ \
-D /var/lib/pgsql/10/data/ \
-k -c
如果检查失败,会看到 Failure 或 Warning 相关信息,可能的错误包括:
- 数据类型不兼容
- 外部插件或扩展不兼容
- 索引、表、用户权限问题
- 不同 PostgreSQL 版本间的 OID 变化
如果 pg_upgrade 检查没有报错(检查项 ok),就可以继续执行实际升级命令。
pg_upgrade参数说明:
-b
旧的 PostgreSQL 可执行目录;
-B
新的 PostgreSQL 可执行目录;
-d
旧的数据库集群配置目录;
-D
新的数据库集群配置目录;
-c
仅检查集群,不要更改任何数据
-k
使用硬链接而不是将文件复制到新集群
pg_upgrade 执行升级
$ /usr/pgsql-10/bin/pg_upgrade \
-b /usr/pgsql-9.3/bin/ \
-B /usr/pgsql-10/bin/ \
-d /var/lib/pgsql/9.3/data/ \
-D /var/lib/pgsql/10/data/
升级完毕退出 postgres 用户
$ exit
调整配置文件
如果 pg_hba.conf
、postgresql.conf
或 postgresql.auto.conf
进行了修改,请手动调整新版本的配置。
启动新版本数据库
$ systemctl enable postgresql-10.service
$ systemctl start postgresql-10.service
# 或重启服务
# systemctl restart postgresql-10.service
检查 PostgreSQL 版本
$ psql --version
总结
通过本文中的详细步骤,可以轻松实现 PostgreSQL 的主要版本升级,利用 pg_upgrade
工具,无需手动导出和导入数据,大大简化了升级过程。
在进行生产环境的 PostgreSQL 升级时,确保平稳过渡是至关重要的。升级过程中可能会出现许多潜在问题,因此建议通过搭建测试环境来模拟升级过程,并在确认一切正常后再执行生产环境的升级!
希望这篇文章对你有帮助!如果你有任何疑问,欢迎在评论区留言,我们一起探讨更多 PostgreSQL 使用技巧!