postgres大版本升级实践
摘要
postgres发展迅猛,目前已经到了19版本了,但公司的版本还停留在9.2版本,同时公司应网信办的要求,需要修复postgres的漏洞,只能升级版本,以下是对postgres V9.2版本,数据库的容量12T,升级至postgres V12.22版本的实践,记录一下升级的流程,遇到的问题,怎么解决的。
整体流程
- 兼容性测试,这里主要包括版本之间的兼容性问题,比如数据类型,内存表,扩展等等。
- 性能测试,需要同业务一起,在新版本中发起请求,可以发现性能的问题。
- 抓包整理业务方。
- 确定升级时间,通知到各个业务方。
- pg_upgrade升级。
- 回退(本文不涉及到回退),该步骤尤其重要,文章结尾说了一些思路。
遇到的问题
pg_upgrade --check,这个过程会检查一下和新版本的兼容,遇到问题就解决问题
部署上的问题
1.pg_config先看看老的版本编译的参数,在pg_configure时使用老版本的编译参数
2.注意一些编译参数的变化,比如老版本编译使用-with-ossp-uuid,高版本使用-with-uuid=ossp
3.注意wal-segment的大小,老版本使用pg_configure $PGDATA|grep -i wal 查看以下,如果新的版本不一致,使用新版本的pg_resetwal --wal-segsize=64 $PDNEWDATA
4.老版本查看部署的用户,部署postgres时会创建linux用户,一般都是postgres,但是还是注意一下,可以查看部署的用户,通过select * from pg_roles where oid=10;
5.扩展问题,老版本使用了orafce扩展,在部署pgv12时,扩展的版本不兼容,也需要升级。
6.uuid扩展问题,在安装的lib下缺少libuuid.so.16,使用root用户yum安装一个,在创建一个软链ln -s /usr/local/lib/libuuid.so.16.0.22 /data/pg12/lib/libuuid.so.16
7.unknown数据类型的字段,这个需要看看是否在使用,在使用的表则需要改类型,没有使用则删除。
升级上的问题
1.在link过程中,遇到orafce扩展的函数不存在,这里没什么好方法,要么对依赖的函数改造,要么将所有依赖orafce的函数视图在升级前删掉,升级之后在创建。
比如strcat替换string_agg,unnest改造为表
升级后的问题
1.old_snapshot_threshold参数设置问题,该参数在老版本设置的1h,导致加工程序启动负载一直居高不下,后面设置为-1解决了。
写在最后
我们的库12T比较大使用的link方式,大概也就不到2分钟就完成了,如果是copy那不知道要多久了。
为什么没有回退步骤,原因是我们这个库的数据是可以补的,即使高版本有问题,解决不了,我们也可回退到低版本。
回退很重要,目前我们没有什么好方法,广大的网友可以支支招。
