暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

PG 的小版本如何升级

原创 大表哥 2023-06-14
1417

image.png
PG的小版本升级是十分简单的,小版本的升级是为了修复一些bug缺陷,或者安全性上的问题,对主版本PG上的功能是没有任何影响的。

大致升级流程分为如下3步:

  1. Shutdown the PostgreSQL database server
  2. Install the updated binaries
  3. 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修复小版本。

Image.png

可以点击Notes 进去查看具体的bug 修复内容: 看来PG15新加入的MERGR 语句相关的bug 修复还是不少的。。。

Image.png

2)小版本的升级需不需要测试? 一般小版本的升级不会涉及到数据库功能上的改变, 理论上是不需要测试你的应用系统的。
像是云厂商RDS 的产品, 你在购买的时候,都会让你勾选是否进行从小版本的升级, 以及选择升级的时间维护窗口。
但是如果你的系统属于7*24 核心交易系统, 企业critical 那种的系统, 最好DBA还是搭建一套测试环境,给开发和业务人员进行全部功能点的测试。

Have a fun 🙂 !

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论