随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 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.
数据库无法启动,那么到底是哪里产生的问题。
在数据库启动时会对数据文件的初始化大小进行判断,当发现数据文件的初始化大小与现有的数据库大小不一致时,会产生报错信息 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;
在升级数据库小版本前,注意三个位置
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'
这里重新编译参数将 --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]
本文分享自 AustinDatabases 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有