PG 升级
PostgreSQL是活跃的社区,拥有庞大的用户群体,也是基本每年稳定更新一个大版本(或主版本,major),大版本主要是添加新功能或对现有功能的增强,每几个月会维护一个小版本(或次要版本,miner),小版本通常包括错误补丁,安全漏洞的修复或是对现有功能的改进。当用户有某种需求,比如要实现分区表的逻辑复制,13版本基本可以实现,此时就可以升级到对应的版本。
那对于大版本和小版本怎么升级呢?
小版本
通常小版本的升级只需要替换二进制文件即可。编译安装一个新版本的数据库(不需要初始化),启动的时候使用原来的数据目录
大版本
大版本的升级相对于小版本来说可能相对复杂一些,通常需要将整个数据库转储到一个新的数据目录,使用较新的二进制文件或者pg_update来初始化
1)pg_dumpall
/opt/pg13/bin/pg_dumpall > /backup/dumpall/dumpall.sql
/opt/pg13/bin/psql -p 7000 -f /backup/dumpall/dumpall.sql
注:
使用高版本的工具导入导出;
contrib文件中的扩展可以通过dumpall自动创建,而对于不属于contrib的扩展需要自行编译安装
2)pg_dump/pg_restore
注:
pg_dump需要对每个数据库单独导出;
在使用pg_dump导出,pg_restore恢复数据允许使用并行
3)pg_update
注:
升级前需要先关闭低版本数据库
执行
pg_upgrade进行升级时可以选择是否重新拷贝一份数据目录,-k | --link选项。默认不加,则会重新拷贝一份文件到新集簇;使用–link选项,使用硬链接来代替文件的拷贝,此时新旧集簇共用同一份数据目录,所以如果新集簇已经启动,此时再启动会报错:[postgres@node1 data6000]$ /opt/pg12/bin/pg_ctl start -D /soft/pg12/data6000 waiting for server to start....postgres: could not find the database system Expected to find it in the directory "/soft/pg12/data6000", but could not open file "/soft/pg12/data6000/global/pg_control": No such file or directory stopped waiting pg_ctl: could not start server Examine the log output.使用–link选项省去copy旧集簇的数据目录,相对更快
只能在兼容的版本数据库执行pg_upgrade升级
4)pglogical插件
pglogical是PostgreSQL支持的扩展模块,为PostgreSQL的数据库提供了逻辑流复制发布和订阅的功能,相较于原生PG的逻辑复制功能做了一些增强,比如说可以同步表、序列、索引等
跨版本升级可以通过逻辑复制把数据转储到新版本的数据库,具体的用法可以参考pglogical官网
小结
相对来说,pglogical+逻辑复制的这样一种方法停机时间相对较短,且支持跨平台迁移,使用范围比较灵活;pg_dump、pg_dumpall是逻辑备份与恢复的方式,停机时间取决于数据库的大小,由于需要对数据进行导入导出,所以对于中小型的数据库来说还是比较友好的;pg_upgrade相较于前面两种方法来说有一定的局限性,适用于本机的就地升级且两个数据库版本要兼容,升级方法相对于更便捷,只需要执行pg_upgrade命令即可
ps:昨天晚上本来要发的,电脑不工作死机了,拖到今天才发




