POSTGRESQL 小版本升级失败后的原因分析

967cbcabdb9e42a82442ea54868ff241.png

随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 POSTGRESQL, MYSQL ,MONGODB ,POLARDB ,REDIS 等,期待你的加入,加群请添加微信liuaustin3.

事情是最近我们的PG13.1在逻辑复制槽上出现了问题,而我们需要针对PG进行小版本升级,小版本升级看似很简单,但是其中的问题也不少,今天我升级中就失败了,那么咱们就捋一捋POSTGRESQL 小版本升级中失败是那些问题导致的。

首先先说说这次小版本升级的工作步骤

1  备份数据库,通过pg_basebackup 对数据库进行plain 方式的备份

2  停止数据库服务

3  编译新版本的数据库安装文件

4  启动数据库,升级完成

但之前的postgresql的数据库是rpm包安装的,对于一些安装的参数部分并不清晰,所以产生了后面的问题。

下图就是在最后一步启动数据库后,遇到的错误

 The database cluster was initialized with RELSEG_SIZE 131072, but the server was compiled with RELSEG_SIZE 524288.

254e9a4e370059ead71e6762ac97b3df.png

数据库无法启动,那么到底是哪里产生的问题。

9235cfa1a805f0f475b5437af703fd95.png

38f10a73c3bbf7a3438986f0171966f7.png

在数据库启动时会对数据文件的初始化大小进行判断,当发现数据文件的初始化大小与现有的数据库大小不一致时,会产生报错信息 relseg_size.

实际上这个问题主要出在升级时对于编译文件的参数设置上的--with-segsize=SEGSIZE。

默认数据库文件编译时是可以针对这个数据文件的初始化最大的大小进行设置的,如果第一次编译和第二次编制时的参数不一致就会报上面的错误。

RELSEG_SIZE = (1024 * 1024 * segsize) / blocksize 

这里 blocksize 默认为8KB 则 RELSEG_SIZE  的变化值在 segsize中如

(1024 * 1024 * 1 ) /8 =  131,072

(1024 * 1024 * 4) /8 =  524,288

我们对比这两个数字,在报错信息的数字是对的上的,这里的意思是,你之前的数据文件大小是 1G 一个,但是你新编译的数据库执行文件是 4G 一个,数据库初始化出现问题。所以无法启动数据库。

解决方案

重新编译,将编译的参数调整和之前进行数据库编译在这个位置的数值一致即可。但问题是,怎么知道之前的编译的参数的问题,又被提出了。

 select name,setting from pg_settings where category = 'Preset Options' order by name;

43e4dff212be21c4afaddf8dfc2e3001.png

在升级数据库小版本前,注意三个位置 

1  block_size 一般是不会对这个参数在编译的时候,进行改变的,但是也要注意,一般是 8K 

2 segment_size   这个是必须要注意的,很多编译中,对这个位置有改变,因为一些大表几十个G ,如果这个位置不变,则一个表将产生几十个数据文件,所以这个位置对于大型的数据库,还是要调整一下的。所以升级时要主要这个位置的数值。segment_size /1024 /1024 = 最大一个数据文件的尺寸。

3 wal_block_size * wal_segment_size = 一个实际的wal文件的大小

这三个位置,在PG 11 后,只需要注意 1 和 2 两个位置即可。也就是编译后,和新升级的编译文件在这两个参数要一致。

同时还可以调取当前系统之前编译的命令

 pg_config --configure

'--prefix=/usr/local/postgres' '--bindir=/usr/local/postgres/bin' '--sysconfdir=/etc' '--libdir=/usr/local/postgres/libs' '--includedir=/usr/local/postgres/includes' '--datadir=/pgdata' '--datarootdir=/pgdata/root' '--with-pgport=5432' '--with-openssl' '--with-pam' '--with-systemd' '--with-libxml' '--with-segsize=1' '--with-ossp-uuid' '--with-lz4' '--with-zstd'

8eb297e5ad48a5d39bc8d14f379dc03c.png

这里重新编译参数将 --with-segsize=4 变为 --with-segsize=1 后,重新编译文件后,问题解决。

从此问题中,发现细节有的时候也是一个工作成败的关键,学习一个知识,需要持续和系统化的学习后,也需要不断在工作中积累,和发现细节的问题。

注明:早期的PG 在wal 上是可以在编译中调整参数的,PG11 后则在数据库初始化中进行 wal segsize 的设置。

--with-wal-blocksize=BLOCKSIZE
                          set WAL block size in kB [8]
  --with-wal-segsize=SEGSIZE
                          set WAL segment size in MB [16]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值