PostgreSQL数据库版本升级
一、升级策略
数据库升级分为两种,一种是小版本迭代升级,另一种是大版本升级。小版本升级很简单,你只需要简单地在服务器关闭时替换可执行文件并重启服务器,数据目录则保持不变,次要升级就这么简单。
对于PostgreSQL的大版本发行, 内部数据存储格式常被改变,这使升级复杂化。传统的把数据移动到新主版本的方法是先转储然后重新载入到数据库,不过这可能会很慢,所以使用 一种更快的方式pg_upgrade。
二、小版本升级
本次以PostgreSQL14.6升级到14.12为例,升级到过程中确认是否有扩展插件、数据库块大小尤其要注意–with编译时需要包含的特定功能或库。
2.1 版本确认
[postgres@jdcloud ~]$ postgres -V
postgres (PostgreSQL) 14.6
2.2 备份源库集簇
pg_dumpall仅支持导出全库数据
pg_dump支持指定所要备份的对象:可以单独备份表、schema或者database。
pg_dumpall -U postgres -f /postgresql/dball_data.sql
2.3 安装信息
查看已经编译的pg当时编译的编译选项, 可以使用 pg_config,这个工具特别有用于开发者和管理员,因为它能提供关于PostgreSQL如何编译、安装路径、编译时使用的选项以及库文件位置等信息。
某些环境可能是RPM包安装,确认好安装的数据目录。
[postgres@jdcloud ~]$ pg_config
2.4 安装新版本
[postgres@jdcloud postgresql]$ mkdir -p pg1412
[postgres@jdcloud postgresql-14.12]$ ./configure --prefix=/postgresql/pg1412/
[postgres@jdcloud postgresql-14.12]$ make world && make install-world
2.5 关闭源库集簇
[postgres@jdcloud soft]$ pg_ctl stop -D /postgresql/pgdata/
2.6 环境变量修改
[postgres@jdcloud soft]$ vi .bash_profile
export PG_HOME=/postgresql/pg1412
[postgres@jdcloud soft]$ source .bash_profile
2.7 重启数据库集簇
因为修改了环境变量,此时重启数据即可,升级前后数据文件目录不变,此时确认版本升级OK。
[postgres@jdcloud soft]$ pg_ctl start -D /postgresql/pgdata
postgres=# select version();
三、大版本升级
本案例从14.12升级到16.6
3.1 版本及安装确认
[postgres@jdcloud]$ psql -V
psql (PostgreSQL) 14.12
[postgres@jdcloud]$ pg_config
3.2 安装新版本并初始化
[postgres@jdcloud postgresql]$ mkdir -p pg166
[postgres@jdcloud postgresql-16.6]$ ./configure --prefix=/postgresql/pg166
[postgres@jdcloud postgresql-16.6]$ make && make install
[postgres@jdcloud postgresql]$ mkdir -p pgdata16
[postgres@jdcloud postgresql]$ /postgresql/pg166/bin/initdb -D /postgresql/pgdata16
3.3 源库集簇备份
[postgres@jdcloud]$ pg_dumpall -U postgres -f /postgresql/dumpall_data.sql
备份之后关闭源库集簇
[postgres@jdcloud ]$ pg_ctl stop -D /postgresql/pgdata
3.4 版本兼容性检查
[postgres@jdcloud postgresql]$ /postgresql/pg166/bin/pg_upgrade --old-datadir /postgresql/pgdata --new-datadir /postgresql/pgdata16 --old-bindir /postgresql/pg1412/bin --new-bindir /postgresql/pg166/bin --check
检查结果都是OK状态。
3.5 升级数据库
[postgres@jdcloud soft]$ /postgresql/pg166/bin/pg_upgrade --old-datadir /postgresql/pgdata --new-datadir /postgresql/pgdata16 --old-bindir /postgresql/pg1412/bin --new-bindir /postgresql/pg166/bin
3.6 修改环境变量
[postgres@jdcloud pgdata16]$ vi ~/.pg166
export PG_HOME=/postgresql/pg166
export PGDATA=/postgresql/pgdata16
3.7 更换参数文件及白名单
更换postgresql.conf 、pg_hba.conf文件
3.8 重启数据库集簇
[postgres@jdcloud pgdata16]$ pg_ctl start -D /postgresql/pgdata16
3.9 收集统计信息
[postgres@jdcloud pgdata16]$ /postgresql/pg166/bin/vacuumdb --all --analyze-in-stages
3.10 删除源数据库集簇数据
[postgres@jdcloud soft]$ /postgresql/soft/delete_old_cluster.sh
# delete_old_cluster.sh生成于执行upgrade命令的当前路径下。