前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POSTGRESQL 小版本升级失败后的原因分析

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

作者头像
AustinDatabases
发布2023-02-28 14:39:50
7920
发布2023-02-28 14:39:50
举报
文章被收录于专栏:AustinDatabasesAustinDatabases

随着问问题的同学越来越多,公众号内部私信回答问题已经很困难了,所以建立了一个群,关于各种数据库的问题都可以,目前主要是 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 的设置。

代码语言:javascript
复制
  --with-wal-blocksize=BLOCKSIZE
                          set WAL block size in kB [8]
  --with-wal-segsize=SEGSIZE
                          set WAL segment size in MB [16]
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AustinDatabases 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档