PG的小版本升级是十分简单的,小版本的升级是为了修复一些bug缺陷,或者安全性上的问题,对主版本PG上的功能是没有任何影响的。
大致升级流程分为如下3步:
- Shutdown the PostgreSQL database server
- Install the updated binaries
- Restart your PostgreSQL database server
我们这次的测试案例是 PG 从15.2 升级达到 15.3的版本。 数据库架构是3节点的主从复制模式。
我们可以先从standby DB开始升级, 然后做主从切换, 类似于 ORACLE 的 rolling patch 滚动升级
1)下载PG15.3 的版本 https://www.postgresql.org/ftp/source/v15.3/
INFRA [postgres@wqdcsrv3352 postgreSQL]# wget https://ftp.postgresql.org/pub/source/v15.3/postgresql-15.3.tar.gz
复制
2)解压软件包
INFRA [postgres@wqdcsrv3353 postgreSQL]# tar -xvf postgresql-15.3.tar.gz
复制
3)我们首先在从库上进行安装 当前版本是15.2 , 关闭数据库
INFRA [postgres@wqdcsrv3353 postgreSQL]# pg_config | grep VERSION
VERSION = PostgreSQL 15.2
INFRA [postgres@wqdcsrv3353 postgreSQL]# /opt/product/pg15.2/bin/pg_ctl stop -D /data/postgreSQL/2031/data
waiting for server to shut down.... done
server stopped
复制
4)执行 config, make, make install 等源码编译的命令
这里需要注意的是 config 需要和 上一次 PG 版本15.2 config的时候 保持参数一致, 我们可以从 pg_config 中查看上次的参数
由于是测试环境,我们只加了 --prefix
INFRA [postgres@wqdcsrv3353 postgreSQL]# pg_config |grep CONFIGURE
CONFIGURE = '--prefix=/opt/product/pg15.2'
复制
我们在新的源码15.3 目录下,尝试 config 一下
INFRA [postgres@wqdcsrv3353 postgresql-15.3]# ./configure --prefix=/opt/product/pg15.2
...
...
config.status: creating src/Makefile.global
config.status: creating src/include/pg_config.h
config.status: creating src/include/pg_config_ext.h
config.status: creating src/interfaces/ecpg/include/ecpg_config.h
config.status: linking src/backend/port/tas/dummy.s to src/backend/port/tas.s
config.status: linking src/backend/port/posix_sema.c to src/backend/port/pg_sema.c
config.status: linking src/backend/port/sysv_shmem.c to src/backend/port/pg_shmem.c
config.status: linking src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking src/makefiles/Makefile.linux to src/Makefile.port
复制
如果没有任何报错, 我们下来执行 make world , 加上 -j8 指定8个多线程加快速度
INFRA [postgres@wqdcsrv3353 postgresql-15.3]# make world -j8
...
...
make[2]: Leaving directory `/opt/postgreSQL/postgresql-15.3/contrib/postgres_fdw'
make[1]: Leaving directory `/opt/postgreSQL/postgresql-15.3/contrib'
复制
如果没有任何报错,我们继续: make install-world -j8
INFRA [postgres@wqdcsrv3353 postgresql-15.3]# make install-world -j8
...
...
make[2]: Leaving directory `/opt/postgreSQL/postgresql-15.3/contrib/unaccent'
make[1]: Leaving directory `/opt/postgreSQL/postgresql-15.3/contrib'
复制
至此软件升级完毕,我们来查询一下升级后软件的版本:
INFRA [postgres@wqdcsrv3353 postgresql-15.3]# pg_config | grep VERSION
VERSION = PostgreSQL 15.3
复制
5)我们启动一下 standby 的数据库
INFRA [postgres@wqdcsrv3353 ~]# /opt/product/pg15.2/bin/pg_ctl start -D /data/postgreSQL/2031/data
waiting for server to start....2023-06-13 21:20:43.428 CST [124625] LOG: pgaudit extension initialized
2023-06-13 21:20:43.744 CST [124625] LOG: redirecting log output to logging collector process
2023-06-13 21:20:43.744 CST [124625] HINT: Future log output will appear in directory "log".
done
server started
postgres=# select version();
version
-------------------------------------------------------------------------------------------------------------
PostgreSQL 15.3 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44.0.3), 64-bit
(1 row)
复制
如果你安装了一些插件的话, 也需要验证一下
postgres=# \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
pg_cron | 1.5 | pg_catalog | Job scheduler for PostgreSQL
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
db_pay=# \dx
List of installed extensions
Name | Version | Schema | Description
------------+---------+------------+------------------------------------------------------
pg_partman | 4.7.3 | partman | Extension to manage partitioned tables by time or ID
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
复制
小版本升级对于WAL 的 stream replication 是没有任何影响的, 我们可以上主库查看一下数据复制的延时情况:数据同步没有任何影响
postgres@[local:/tmp]:2031=#1802 select * from pg_stat_replication;
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backe
nd_xmin | state | sent_lsn | write_lsn | flush_lsn | replay_lsn | write_lag | flush_lag | replay_lag | sync_p
riority | sync_state | reply_time
--------+----------+---------+------------------+--------------+-----------------+-------------+-------------------------------+------
--------+-----------+------------+------------+------------+------------+-----------------+-----------------+-----------------+-------
--------+------------+-------------------------------
102048 | 16384 | repmgr | pg149 | 10.67.39.149 | | 46292 | 2023-06-01 23:38:30.360812+08 |
| streaming | 2/6A41FEA0 | 2/6A41FEA0 | 2/6A41FEA0 | 2/6A41FEA0 | 00:00:00.000381 | 00:00:00.000848 | 00:00:00.000849 |
0 | async | 2023-06-13 21:25:11.631555+08
130320 | 16384 | repmgr | pg49 | 10.67.39.49 | | 46616 | 2023-06-13 21:23:12.987314+08 |
| streaming | 2/6A41FEA0 | 2/6A41FEA0 | 2/6A41FEA0 | 2/6A41FEA0 | 00:00:00.00032 | 00:00:00.000686 | 00:00:00.000791 |
0 | async | 2023-06-13 21:26:46.16188+08
102072 | 16384 | repmgr | pgdr | 10.67.200.38 | | 31244 | 2023-06-01 23:38:30.819694+08 |
| streaming | 2/6A41FEA0 | 2/6A41FEA0 | 2/6A41FEA0 | 2/6A41FEA0 | 00:00:00.000408 | 00:00:00.000682 | 00:00:00.00085 |
0 | async | 2023-06-13 21:31:50.135243+08
(3 rows)
复制
至此我们从库算是升级完了, 我们只需要做一个主从切换,把这个升级到15.3版本的升级为主库, 我们继续从库就可以了:
REPMGR 的主从切换一个命令就可以完成了:
INFRA [postgres@wqdcsrv3353 log]# repmgr -f /data/postgreSQL/2031/repmgr/repmgr.conf standby switchover --siblings-follow
...
...
NOTICE: STANDBY SWITCHOVER has completed successfully
复制
接下来的在从库上步骤就重复 (2)-(5)了。
写到最后: 为什么要进行小版本的升级?
1)熟悉ORACLE的朋友们可以理解为PG的小版本升级为CPU 或者PSU的patch , 目的是 fix 一些提交的bug或者是修复一些安全漏洞。
PG 社区一般会同时发布多个大版本的对应的bug修复小版本。
可以点击Notes 进去查看具体的bug 修复内容: 看来PG15新加入的MERGR 语句相关的bug 修复还是不少的。。。
2)小版本的升级需不需要测试? 一般小版本的升级不会涉及到数据库功能上的改变, 理论上是不需要测试你的应用系统的。
像是云厂商RDS 的产品, 你在购买的时候,都会让你勾选是否进行从小版本的升级, 以及选择升级的时间维护窗口。
但是如果你的系统属于7*24 核心交易系统, 企业critical 那种的系统, 最好DBA还是搭建一套测试环境,给开发和业务人员进行全部功能点的测试。
Have a fun 🙂 !
评论

