暂无图片
pg 大版本升级 15.4 --16.0
最近更新:2023-09-25 11:43:07

一、 介绍

出于消除BUG、提升数据库性能、优化代码等不同原因,PG社区会定期更新数据库版本,最新版本为pg15,我们DBA在运维过程中也面临着数据库大版本升级这一切实的需求,目前PG大版本的升级方法主要有以下四种方式:

1.转储数据的方式(pg_dump或pg_dumpall导出数据,pg_restore或psql导入)

2.通过pg_upgrade进行升级

3.pg_logical扩展进行升级

4.通过内置逻辑复制的方式进行版本升级

二、pg_upgrade介绍

pg_upgrade(以前称为pg_migrator)允许在不需要数据转储/恢复的情况下,将存储在PostgreSQL数据文件中的数据升级到更高版本的PostgreSQL主版本,例如从9.5.8升级到9.6.4或从10.7升级到11.2。

PostgreSQL主版本会定期添加新功能,这些功能通常会更改系统表的布局,但内部数据存储格式很少更改。pg_upgrade利用这一事实通过创建新的系统表并简单地重用旧的用户数据文件来执行快速升级。如果将来的主要版本更改数据存储格式,使旧数据格式不可读,则pg_upgrade将无法用于此类升级。(社区将尝试避免这种情况.)

pg_upgrade尽最大努力确保新旧集群与二进制兼容,例如,通过检查兼容的编译时设置,包括 32/64 位二进制文件。重要的是,任何外部模块也是二进制兼容的,尽管这不能由pg_upgrade检查。

pg_upgrade支持从 8.4.X 及更高版本升级到当前的主要版本的 PostgreSQL,包括快照和测试版本。

三、 参数介绍

-b --old-bindir=BINDIR 旧版本PostgreSQL的可执行文件目录;环境变量名称为PGBINOLD -B --new-bindir=BINDIR 新版本PostgreSQL的可执行文件目录;默认路径为pg_upgrade所在目录;环境变量名称为PGBINNEW -c --check 只检查集群升级兼容性,不会真正的升级,不改变数据 -d --old-datadir=configdir 旧版本数据库配置/数据目录;环境变量名称为PGDATAOLD -D --new-datadir=configdir 新版本数据库配置/数据目录;环境变量名称为PGDATANEW -j --jobs 允许多个CPU核复制或链接文件以及并行地转储和重载数据库模式,一般可以设置为CPU核数。这个选项可以显著地减少升级时间。 -k --link 使用硬链接方式而不是将文件copy到新版本数据库的方式升级 -o --old-options=OPTIONS 直接传送给旧postgres 命令的选项,多个选项可以追加在后面 -O --new-options=OPTIONS 直接传送给新postgres 命令的选项,多个选项可以追加在后面 -p --old-port=PORT 旧版本数据库使用的端口号;环境变量名称为PGPORTOLD -P --new-port=PORT 新版本数据库使用的端口号;环境变量名称为PGPORTNEW;新旧版本实例使用的端口号必须不同 -r --retain 即使在成功完成后也保留SQL和日志文件 -s --socketdir=DIR 在升级过程中postmaster sockets使用的目录,默认是当前工作目录,环境变量名称为PGSOCKETDIR -U --username=username 数据库的安装用户;环境变量名称为PGUSER -v --verbose 启用详细的内部日志记录 -V --version 显示版本信息,然后退出 –clone 使用高效的文件克隆(在某些系统上也称为“reflinks”),而不是将文件复制到新群集。这可能导致近乎即 时地复制数据文件,从而提供类似于 -k/–link 的速度优势,同时保持旧集群不变。 文件克隆仅在某些操作系统和文件系统上受支持。如果在不支持的系统上使用了该选项,则pg_upgrade运行 将会出错。目前,它在具有Btrfs和XFS(在支持reflink的文件系统上)的Linux(内核4.5或更高版本) 以及带有APFS的macOS上受支持。 在升级之前应该运行pg_upgrade并用-c参数检查新旧版本的兼容性,把每一项不兼容的问题都解决了才可以 顺利升级。使用pg_upgrade时加上-c参数只会检查新旧版本的兼容性,不会运行真正的升级程序,不会修改 数据文件,并且在命令结束时,会输出一份检查结果的报告,还会对需要手动调整的项做出简要的描述。

 四、环境准备

|节点类别|主机名|IP| |-|-|-| |主库|node1|192.168.3.3| |备库1|node2|192.168.3.4| |备库2|node3|192.168.3.5|

五、下载和pg16 安装包

5.1 下载地址

  https://www.postgresql.org/ftp/source/v16.0/

5.2 解压和创建目录

[postgres@node1 soft]$ cd /postgresql/
[postgres@node1 postgresql]$  tar -xzvf postgresql-16.0.tar.gz 
[postgres@node1 postgresql]$ 
[postgres@node1 postgresql]$ ll
total 56
drwxrwxr-x  2 postgres postgres 32768 Sep 19 16:09 archive
drwxrwxr-x  2 postgres postgres     6 Nov  5  2022 backup
drwxrwxr-x  6 postgres postgres    56 Nov  5  2022 pg15
drwx------ 20 postgres postgres  4096 Sep 20 12:51 pgdata
drwxrwxr-x  2 postgres postgres     6 Nov  5  2022 scripts
drwxrwxr-x  5 postgres postgres   191 Sep 20 15:06 soft
[postgres@node1 postgresql]$ mkdir pg16
[postgres@node1 postgresql]$ mkdir pgdata16

[postgres@node1 postgresql]$ cd soft/postgresql-16.0/

六、升级准备

注: pg主从复制 ,要先升级主库

6.1 编译安装

注:可能会出现问题1到问题13 尽量和老集群保持一致是segsize和blocksize

./configure --prefix=/postgresql/pg16 --with-pgport=5432 --with-openssl --with-perl --with-python --with-readline --with-libxml --with-libxslt 
gmake -j 4 && gmake install  -j 4
gmake world -j 4 && gmake install-world -j 4

6.2 初始化数据库

initdb -D /postgresql/pgdata16 -E UTF8  --locale=en_US.utf8 -U postgres

6.3 备份数据库

注:利用 pg_dump/pg_dumpall 对数据库进行备份,保证升级中遇到各种问题后以便回退。

/postgresql/pg15/bin/pg_dumpall > pgdumpallfull

6.4 升级检查

[postgres@node1 postgresql-16.0]$ pg_upgrade -b /postgresql/pg15/bin/ -B /postgresql/pg16/bin/ -d /postgresql/pgdata/ -D /postgresql/pgdata16/ -c
Performing Consistency Checks
-----------------------------
......