PG如何实现跨大版本升级
数据库进行升级,是一个再正常不过的功能,比如功能的需要,遇到BUG,安全漏洞等等,具体升级包含子版本升级,主版本升级。如果用过ORACLE的朋友,一定知道,在ORACLE中,如果要实现大版本的升级,比如从11g,升级到19c,一般使用的dbua来完成,并且标准的升级,一定会有数据库停机时间,小版本的升级,如19.3,升级到19.24 ,使用OPATCH 工具来完成,一样需要停数据库。
那对于PG,一样也存在升级,如果是小版本升级,比如12.0 升级到12.19 ,直接使用二进制文件替换即可,如果是大版本升级,一般使用 pg_upgrade来完成,当然,如果时间允许,也可以使用pg_dumpall也行。只是时间要长一些。
关于PG_UPGRADE的使用,可以参见官方文档:PostgreSQL: Documentation: 16: pg_upgrade
部分截图如下:



PG_UPGRADE 的用法:
pg_upgrade -b oldbindir [-B newbindir] -d oldconfigdir -D newconfigdir [option...]
目前pg_upgrade 支持从 9.2.x 到目前最新的版本,甚至BETA版本。
下面我们以一个升级案例来说明:
目录
1.升级环境
2.源码安装新版本16.3
3.关闭源和目标数据库
4.执行升级检查
5.正式升级
6.修改环境变量
7.修改初始参数
8.启动PG并调整PG_UPGRADE要求的脚本
9.结果验证
10、联系我们
1.升级环境
源版本:pg 12.0
PGHOME=/u01/app/postgres/product/12.0/dbhome_1
PGDATA=/u01/app/postgres/product/pgdata_12
PORT=5432
目标版本:pg 16.3
PGHOME=/u01/app/postgres/product/16.3/dbhome_1
PGDATA=/u01/app/postgres/product/pgdata
PORT=5432
操作系统:OpenEuler 24.03
sztechdb=# select * from version();
version
-----------------------------------------------------------------------------------------------------------
PostgreSQL 12.0 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 12.3.1 (openEuler 12.3.1-30.oe2403), 64-bit
(1 row)








2.源码安装新版本16.3
这个步骤,可以参见前面的文档:https://blog.csdn.net/cqsztech/article/details/140748640
如果源端有额外的插件,需要安装
这里安装,只需要到 initdb即可,不需要打开
postgres@openeuler2403 bin]$ ./initdb --pgdata=/u01/app/postgres/pgdata -U postgres
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "zh_CN.UTF-8".
The default database encoding has accordingly been set to "UTF8".
initdb: could not find suitable text search configuration for locale "zh_CN.UTF-8"
The default text search configuration will be set to "simple".
Data page checksums are disabled.
fixing permissions on existing directory /u01/app/postgres/pgdata ... ok
creating subdirectories ... ok
selecting dynamic shared memory implementation ... posix
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting default time zone ... Asia/Shanghai
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok
initdb: warning: enabling "trust" authentication for local connections
initdb: hint: You can change this by editing pg_hba.conf or using the option -A, or --auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
pg_ctl -D /u01/app/postgres/pgdata -l logfile start

3.关闭源和目标数据库
把源和目标数据库都关闭。
[postgres@openeuler2403 pgdata_12]$ pg_ctl stop
waiting for server to shut down.... done
server stopped
4.执行升级检查
是否能升级,正式升级之前,可以先检查一下,有点试升级的味道。
注意,执行PG_UPGRADE命令,需要在高版本的环境下运行
先看看pg_upgrade 的用法:
[postgres@openeuler2403 bin]$ pg_upgrade -c --old-datadir=/u01/app/postgres/pgdata_12 \
> --new-datadir=/u01/app/postgres/pgdata \
> --old-bindir=/u01/app/postgres/product/12.0/dbhome_1/bin \
> --new-bindir=/u01/app/postgres/product/16.3/dbhome_1/bin

查看丢失的库是什么
[postgres@openeuler2403 pgdata_12]$ cat /u01/app/postgres/pgdata/pg_upgrade_output.d/20240801T164259.299/loadable_libraries.txt
could not load library "$libdir/pgcrypto": ERROR: could not access file "$libdir/pgcrypto": ûĿ¼
In database: postgres
--暂时源端去掉这个插件
postgres=# drop extension pgcrypto;
DROP EXTENSION

再次检查,OK。

5.正式升级
[postgres@openeuler2403 bin]$ pg_upgrade --old-datadir=/u01/app/postgres/pgdata_12 \
> --new-datadir=/u01/app/postgres/pgdata \
> --old-bindir=/u01/app/postgres/product/12.0/dbhome_1/bin \
> --new-bindir=/u01/app/postgres/product/16.3/dbhome_1/bin
Performing Consistency Checks
-----------------------------
Checking cluster versions ok
Checking database user is the install user ok
Checking database connection settings ok
Checking for prepared transactions ok
Checking for system-defined composite types in user tables ok
Checking for reg* data types in user tables ok
Checking for contrib/isn with bigint-passing mismatch ok
Checking for incompatible "aclitem" data type in user tables ok
Checking for user-defined encoding conversions ok
Checking for user-defined postfix operators ok
Checking for incompatible polymorphic functions ok
Creating dump of global objects ok
Creating dump of database schemas
ok
Checking for presence of required libraries ok
Checking database user is the install user ok
Checking for prepared transactions ok
Checking for new cluster tablespace directories ok
If pg_upgrade fails after this point, you must re-initdb the
new cluster before continuing.
Performing Upgrade
------------------
Setting locale and encoding for new cluster ok
Analyzing all rows in the new cluster ok
Freezing all rows in the new cluster ok
Deleting files from new pg_xact ok
Copying old pg_xact to new server ok
Setting oldest XID for new cluster ok
Setting next transaction ID and epoch for new cluster ok
Deleting files from new pg_multixact/offsets ok
Copying old pg_multixact/offsets to new server ok
Deleting files from new pg_multixact/members ok
Copying old pg_multixact/members to new server ok
Setting next multixact ID and offset for new cluster ok
Resetting WAL archives ok
Setting frozenxid and minmxid counters in new cluster ok
Restoring global objects in the new cluster ok
Restoring database schemas in the new cluster
ok
Copying user relation files
ok
Setting next OID for new cluster ok
Sync data directory to disk ok
Creating script to delete old cluster ok
Checking for extension updates notice
Your installation contains extensions that should be updated
with the ALTER EXTENSION command. The file
update_extensions.sql
when executed by psql by the database superuser will update
these extensions.
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
/u01/app/postgres/product/16.3/dbhome_1/bin/vacuumdb --all --analyze-in-stages
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
[postgres@openeuler2403 bin]$
6.修改环境变量
[postgres@openeuler2403 bin]$ cat ~/.bash_profile
# Source /root/.bashrc if user has one
[ -f ~/.bashrc ] && . ~/.bashrc
export PGPORT=5432
export PGDATA=/u01/app/postgres/pgdata
export PGHOME=/u01/app/postgres/product/16.3/dbhome_1
export LD_LIBRARY_PATH=$PGHOME/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH:.
export PGHOST=$PGDATA
export PGUSER=postgres
export PGDATABASE=postgres
export PGCLIENTENCODING=GBK
7.修改初始参数
cat >> $PGDATA/postgresql.conf << "EOF"
listen_addresses = '*'
port=5432
unix_socket_directories='/u01/app/postgres/pgdata'
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%a.log'
log_truncate_on_rotation = on
max_connections = 500
shared_buffers = 2GB
EOF
cat >> $PGDATA/pg_hba.conf << "EOF"
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 md5
EOF
8.启动PG并调整PG_UPGRADE要求的脚本
--插件更新
[postgres@openeuler2403 pgdata]$ psql -f /u01/app/postgres/product/16.3/dbhome_1/bin/update_extensions.sql
You are now connected to database "postgres" as user "postgres".
ALTER EXTENSION
ALTER EXTENSION
ALTER EXTENSION
--收集统计信息
[postgres@openeuler2403 pgdata]$ /u01/app/postgres/product/16.3/dbhome_1/bin/vacuumdb --all --analyze-in-stages
vacuumdb: processing database "postgres": Generating minimal optimizer statistics (1 target)
vacuumdb: processing database "sztechdb": Generating minimal optimizer statistics (1 target)
vacuumdb: processing database "template1": Generating minimal optimizer statistics (1 target)
vacuumdb: processing database "postgres": Generating medium optimizer statistics (10 targets)
vacuumdb: processing database "sztechdb": Generating medium optimizer statistics (10 targets)
vacuumdb: processing database "template1": Generating medium optimizer statistics (10 targets)
vacuumdb: processing database "postgres": Generating default (full) optimizer statistics
vacuumdb: processing database "sztechdb": Generating default (full) optimizer statistics
vacuumdb: processing database "template1": Generating default (full) optimizer statistics
--删除老版本的文件
[postgres@openeuler2403 pgdata]$ cat /u01/app/postgres/product/16.3/dbhome_1/bin/delete_old_cluster.sh
#!/bin/sh
rm -rf '/u01/app/postgres/pgdata_12'
rm -rf '/data/pgdata/PG_12_201909212'
[postgres@openeuler2403 pgdata]$ /u01/app/postgres/product/16.3/dbhome_1/bin/delete_old_cluster.sh
[postgres@openeuler2403 pgdata]$ ls -ltr /u01/app/postgres/
总计 8
drwxrwxr-x. 4 postgres postgres 30 7月31日 17:53 product
drwxr-xr-x. 2 postgres postgres 4096 7月31日 19:17 archive_log
drwx------. 21 postgres postgres 4096 8月 1日 17:36 pgdata
[postgres@openeuler2403 pgdata]$ ls -ltr /data/pgdata/
总计 8
drwx------ 3 postgres postgres 4096 8月 1日 09:23 PG_16_202307071_bak
drwx------ 3 postgres postgres 4096 8月 1日 17:27 PG_16_202307071
9.结果验证





![]()

到此,PG_UPGRADE 升级就完成了。
但感觉PG_UPGRADE还是有一些遗憾,
1.整个升级,都是命令行完成,没有图形界面,不太直观
2.升级过程中,数据文件路径要变化,不能就数据文件原地升级,也许是强迫症吧。
10、联系我们
如果你还想和我交流,可以按如下方式找到我们。
----------------------------------------------------------------------
微信群:水煮数据库
主要交流日常运维中用到的数据库相关问题,包含但不限于:ORACLE,PG,MYSQL,SQLSERVER,OB,TIDB,达梦,TDSQL,OPENGAUSS,人大金仓,GBASE等等,
加我微信:zq24803366,备注:水煮数据库, 我拉你入群。
----------------------------------------------------------------------
相关文章:
PG如何实现跨大版本升级
数据库进行升级,是一个再正常不过的功能,比如功能的需要,遇到BUG,安全漏洞等等,具体升级包含子版本升级,主版本升级。如果用过ORACLE的朋友,一定知道,在ORACLE中,如果要实…...
JDK 8 升级 17 及 springboot 2.x 升级 3.x 指南
JDK 8 升级 17 简介 从 JDK 8 升级到 JDK 17 的过程中,有几个主要的变化,特别是 Java Platform Module System (JPMS) 的引入,以及一些包路径的调整。以下是与 JDK 17 相关的一些重要变化: Java Platform Module System (JPMS) …...
基于java的人居环境整治管理系统(源码+lw+部署文档+讲解等)
前言 💗博主介绍:✌全网粉丝20W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻…...
深入了解Pip:Python包管理器的详细指南
目录 Pip简介Pip的安装与升级Pip的基本使用 安装包卸载包列出已安装的包查看包的信息 管理依赖 使用requirements.txt冻结当前环境的包 Pip进阶用法 安装特定版本的包使用代理安装包从本地文件安装包 创建和发布Python包 创建一个Python包编写setup.py文件发布到PyPI 常见问题…...
Corsearch 用 ClickHouse 替换 MySQL 进行内容和品牌保护
本文字数:3357;估计阅读时间:9 分钟 作者:ClickHouse Team 本文在公众号【ClickHouseInc】首发 Chase Richards 自 2011 年在初创公司 Marketly 担任工程负责人,直到 2020 年公司被收购。他现在是品牌保护公司 Corsear…...
常见的应急救援设备有哪些_鼎跃安全
在我们的生活中,应急事件的发生常常是突如其来的,它们对人民的生命财产安全构成重大威胁,同时也对社会稳定提出严峻挑战。在这样的紧急情况下,迅速开展有效的救援工作显得尤为重要。而在整个救援过程中,应急设备的使用…...
Vue 项目部署后首页白屏问题排查与解决
引言 在部署 Vue.js 项目时,有时会遇到首页加载后出现白屏的情况,这可能是由于多种原因造成的。本文将介绍一些常见的排查方法和解决方案,帮助开发者快速定位问题并解决。 1. 常见原因分析 首页白屏的问题可能由以下几个方面的原因导致&am…...
STM32 定时器移相任意角度和占空比,频率可调
由于使用了中断修改翻转的CCR值,对于频率超250K以上不太适用. void Motor1_Init(Motor MotorChValue) { GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;NVIC_InitTypeDef NVIC_Ini…...
C++ 与其他编程语言区别_C++11/14/17新特性总结
C11 decltype类型推导 decltype不依赖于初始化,根据表达式类推导类型 auto b :根据右边a的初始值来推导出变量的类型,然后将该初始值赋给bdecltype 则是根据a表达式来推导类型,变量的初始值与表达式的值无关表达式类型注意点&…...
玩转云服务:Google Cloud谷歌云永久免费云服务器「白嫖」 指南
前几天,和大家分享了: 玩转云服务:Oracle Cloud甲骨文永久免费云服务器注册及配置指南 相信很多同学都卡在了这一步: 可用性域 AD-1 中配置 VM.Standard.E2.1.Micro 的容量不足。请在其他可用性域中创建实例,或稍后…...
用18讲必看:宇哥亲划重点内容+核心题总结
25考研结束之后,张宇老师的风评可能会两极分化 其中一波把张宇老师奉为考研数学之神,吹捧「三向解题法」天下无敌。 另外一波对张宇老师的评价负面,在网上黑张宇老师! 为什么会这么说,因为张宇老师的新版36讲争议太…...
什么是安全生产痕迹化管理?如何做到生产过程中全程痕迹化管理?
安全生产痕迹化管理,简单来说,就是通过记录一些“信息”来确保安全工作的进展。这些方法包括记会议内容、写安全日记、拍照片、签字盖章、指纹识别、面部识别还有手机定位等。记录下来的文字、图片、数据和视频,就像一个个“脚印”࿰…...
VIsual Studio:为同一解决方案下多个项目分别指定不同的编译器
一、引言 如上图,我有一个解决方案【EtchDevice】,他包含两个(甚至更多个)子项目,分别是【DeviceRT】和【DeviceWin】,见名知意,我需要一个项目编译运行在RTOS上,譬如一个名叫INTime…...
Flat Ads资讯:Meta、Google、TikTok 7月产品政策速递
Flat Ads拥有全球媒介采买(MediaBuy)业务,为方便广告主及时了解大媒体最新政策,Flat Ads将整理大媒体产品更新月报,欢迎大家关注我们及时了解最新行业动向。 一、Meta 1、Reels 应用推广现可突出显示应用评分、点评和下载量 为了不断优化 Instagram 上的广告体验和广告表现,…...
嵌入式C++、ROS 、OpenCV、SLAM 算法和路径规划算法:自主导航的移动机器人流程设计(代码示例)
在当今科技迅速发展的背景下,嵌入式自主移动机器人以其广泛的应用前景和技术挑战吸引了越来越多的研究者和开发者。本文将详细介绍一个嵌入式自主移动机器人项目,涵盖其硬件与软件系统设计、代码实现及项目总结,并提供相关参考文献。 项目概…...
数据安全堡垒:SQL Server数据库备份验证与测试恢复全攻略
数据安全堡垒:SQL Server数据库备份验证与测试恢复全攻略 在数据库管理中,备份是确保数据安全的关键环节,但仅仅拥有备份是不够的,验证备份的有效性并能够从备份中成功恢复数据同样重要。SQL Server提供了一系列的工具和方法来执…...
嵌入式人工智能(40-基于树莓派4B的水滴传感器和火焰传感器)
虽然这两个传感器水火不容,我还是把他们放到一起了。本文是有线传感器的最后一个部分了。后面如果还有文章介绍有线传感器,也是补充学习其他内容不得已而为之。如果不是,就当我没说,哈哈。 1、水滴传感器 水滴传感器又称雨滴传感…...
EF访问PostgreSql,如何判断jsonb类型的数组是否包含某个数值
下面代码判断OpenUserIds(long[]类型的jsonb)字段,是否包含 8 basequery basequery.Where(m > Microsoft.EntityFrameworkCore.NpgsqlJsonDbFunctionsExtensions.JsonContains(EF.Functions, m.OpenUserIds, new long[] { 8 }));...
Qt 实战(8)控件 | 8.1、QComboBox
文章目录 一、QComboBox1、简介2、功能特性2.1、添加和移除项目2.2、设置和获取当前选中项2.3、模型/视图架构2.4、信号与槽 3、总结 前言: QComboBox 是 Qt 框架中一个非常实用的控件,它允许用户从一个下拉列表中选择一个项目。这个控件广泛应用于需要用…...
模拟算法概览
前言 LeetCode上的模拟算法题目主要考察通过直接模拟问题的实际操作和过程来解决问题。这类题目通常不需要高级的数据结构或复杂的算法,而是通过仔细的逻辑和清晰的步骤逐步解决。 适合解决的问题 模拟算法适合用来解决那些逻辑明确、步骤清晰且可以逐步执行的问…...
技术Leader的困境:为什么你越努力,团队越依赖你?
在软件测试领域,我们比任何角色都更懂“依赖”这个词。测试环境依赖稳定、测试数据依赖真实、测试用例依赖需求文档。但有一种依赖,最致命却也最容易被忽视——团队对你的依赖。很多从一线测试骨干晋升为测试Leader的人,都会陷入一个怪圈&…...
从波形到Mel谱图:机器学习音频特征提取的完整实践指南
1. 音频信号处理基础:从物理世界到数字信号 第一次接触音频信号处理时,我被那一串串看似随机的波形数据弄得一头雾水。直到后来才明白,这些数字背后其实对应着我们熟悉的物理现象——声音。声音的本质是空气压力的变化,就像水面泛…...
FPGA上做图像压缩,别从零造轮子!聊聊DCT那些开源IP核与设计技巧
FPGA图像压缩实战:DCT开源IP核选型与架构优化指南 在嵌入式视觉系统开发中,JPEG图像压缩是FPGA工程师经常遇到的需求场景。当项目周期紧张且资源有限时,明智的开发者会优先考虑利用经过验证的开源IP核,而非从零开始实现离散余弦变…...
IL-8 Inhibitor ;Ac-RRWWCR-NH₂
一、基础信息多肽名称:IL-8 Inhibitor(白介素 8 抑制剂肽) 修饰:N 端乙酰化 Ac-,C 端酰胺化 -NH₂ 三字母序列:Ac-Arg-Arg-Trp-Trp-Cys-Arg-NH₂ 单字母序列:Ac-RRWWCR-NH₂ 氨基酸数量…...
WarcraftHelper:魔兽争霸3兼容性修复终极解决方案
WarcraftHelper:魔兽争霸3兼容性修复终极解决方案 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为经典游戏魔兽争霸3在现代Windows系…...
从仿真波形到板卡调试:一次搞定Xilinx UltraScale+ FPGA DDR4读写测试全流程
从仿真波形到板卡调试:Xilinx UltraScale FPGA DDR4读写测试全流程实战指南 在FPGA系统设计中,DDR4内存接口的稳定性和性能往往是决定整个系统成败的关键因素。对于使用Xilinx UltraScale系列FPGA的工程师而言,从仿真验证到板卡调试的全流程掌…...
排查华为USG防火墙上不了网?先检查这5个配置点(附真实配置案例)
华为USG防火墙上网故障排查实战指南 当内网用户突然无法访问互联网时,作为运维人员往往会面临巨大的压力。华为USG防火墙作为企业网络的核心安全设备,其配置的每一个细节都可能成为网络连通性的关键。本文将从一个真实的故障排查案例出发,带您…...
前端状态管理:主流状态管理库对比与选型指南
前端状态管理:主流状态管理库对比与选型指南 前言 状态管理是前端开发中的核心问题。随着应用复杂度的增加,选择一个合适的状态管理库变得越来越重要。今天我就来给大家对比一下目前主流的状态管理库,帮助你做出最佳选择。 主流状态管理库概览…...
AI 文档工作流里,那道正在被悄然割裂的“思想透明度”
在 AI 辅助的知识库构建、产品规格编写或 Agent 提示工程里,一份长文档从草稿到最终交付的过程,正面临一场隐形断裂。创作者先在纯文本里苦苦打磨思路,AI 却直接吐出一份排版精美、图文并茂的 HTML——看起来分享效率拉满,实际却把…...
Steam游戏自动破解终极指南:3步实现DRM移除与离线游戏
Steam游戏自动破解终极指南:3步实现DRM移除与离线游戏 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack SteamAutoCrack是一款专业的Steam游戏自动破解工具,通过智…...
