postgresql13.6升级到14.11实录

背景与需求

当前生产环境的gitlab版本使用的postgresql 版本为13.6, 按gitlab官方版本要求, gitlab 17.X 版本 ,Minimum PostgreSQL version 为14.9 (参考gitlab版本要求 ),因此 要升级gitlab版本的话,必须先升级postgresql数据库。

版本描述

  • 当前版本:13.6
  • 目标版本:14.11

postgresql源码包下载地址

升级步骤

(1) 在原postgresql数据库服务器安装新版本, 路径与原来不同(包括数据文件,归档,软件路径等等)
(2) 使用pg_upgrade命令检查升级
(3) 关闭老版本postgresql数据库,使用pg_upgrade命令升级
(4) 拷贝老版本postgresql数据库参数文件postgresql.conf、ph_hba.conf文件到新版本数据库目录
(5) 按实际情况修改postgresql.conf、ph_hba.conf
(6) 修改/etc/profile 环境变量
(7) 修改postgresql.service 文件,改为使用新版本数据库

环境描述

操作系统环境:

# lsb_release -a
LSB Version:    :core-4.1-amd64:core-4.1-noarch
Distributor ID: CentOS
Description:    CentOS Linux release 7.9.2009 (Core)
Release:        7.9.2009
Codename:       Core

postgresql 环境:

postgres=# select version();
                                                 version                                                 
---------------------------------------------------------------------------------------------------------
 PostgreSQL 13.6 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
(1 row)

生产环境为流复制环境,主备版本均为13.6。 本地升级需要将主备版本均升级为14.11版本。

下面命令如无特殊说明, # 均表示操作系统root执行(进入postgresql里除外), $ 均表示pgsql用户执行

具体升级步骤

(1) 规划

当前的postgresql安装在/postgresql下,(我这里是用pgsql用户管理的postgresql数据库), 具体如下

# ls -alrt /postgresql/
dr-xr-xr-x. 20 root  root  4096 Sep 29  2022 ..
drwxr-xr-x   2 pgsql pgsql    6 Sep 29  2022 scripts
drwxr-xr-x   2 pgsql pgsql    6 Sep 29  2022 soft
drwxr-xr-x   2 pgsql pgsql    6 Sep 29  2022 backup
drwxr-xr-x   6 pgsql pgsql   56 Sep 29  2022 pg13       --- 软件安装路径
drwxr-xr-x   2 pgsql pgsql  294 Sep 14 16:39 archive    --- 归档目录
drwx------  19 pgsql pgsql 4096 Sep 14 16:39 pgdata     --- 数据目录
drwx------  19 pgsql pgsql 4096 Sep 14 16:39 pg_log     --- 日志目录

计划postgresql 14版本创建全新的目录/postgresql/postgresql14, 目录结构如下:

# ls -alrt /postgresql/postgresql14/
total 4
drwxr-xr-x 11 pgsql pgsql  137 Sep 14 16:14 ..
drwxr-xr-x  6 pgsql pgsql   56 Sep 14 16:18 pg14        --- 软件安装目录
drwxr-xr-x  2 pgsql pgsql    6 Sep 14 16:27 soft
drwxr-xr-x  2 pgsql pgsql    6 Sep 14 16:27 scripts
drwxr-xr-x  2 pgsql pgsql    6 Sep 14 16:27 backup
drwxr-xr-x  9 pgsql pgsql  102 Sep 14 16:27 .
drwxr-xr-x  2 pgsql pgsql   20 Sep 14 16:55 pg_log      --- 日志目录
drwxr-xr-x  2 pgsql pgsql   70 Sep 14 17:25 archive     --- 归档目录
drwx------ 19 pgsql pgsql 4096 Sep 14 17:25 pgdata      --- 数据目录

也就是新的不影响老的。

(2) 安装postgresql 14.11 版本

安装postgresql 14.11 版本(下面使用root用户操作)

mkdir -p /postgresql/postgresql14/{pgdata,archive,scripts,backup,pg14,soft,pg_log}
tar zxvf postgresql-14.11.tar.gz
cd postgresql-14.11
./configure --prefix=/postgresql/postgresql14/pg14 --without-readline --with-perl --with-python
make
make install
cd contrib/pg_trgm/
make && make install
cd ../btree_gist extension
make && make install
chown -R pgsql.pgsql /postgresql/postgresql14

至此,postgresql 14.11 版本软件就已经安装好了。 安装到了/postgresql/postgresql14/pg14

(3) 初始化postgresql 14.11 数据库

# su - pgsql 
$ /postgresql/postgresql14/pg14/bin/initdb -D /postgresql/postgresql14/pgdata -E UTF8 --locale=en_US.utf8 -U postgres

(4) 使用pg_upgrade命令检查升级

$ /postgresql/postgresql14/pg14/bin/pg_upgrade -d /postgresql/pgdata -D /postgresql/postgresql14/pgdata -b /postgresql/pg13/bin -B /postgresql/postgresql14/pg14/bin -c

(5) 关闭老版本数据库,开始正式升级

在检查升级无报错后,去掉 -c参数,开始正式升级

# systemctl stop postgresql.service
# su - pgsql
$ /postgresql/postgresql14/pg14/bin/pg_upgrade -d /postgresql/pgdata -D /postgresql/postgresql14/pgdata -b /postgresql/pg13/bin -B /postgresql/postgresql14/pg14/bin 
$ chmod 700 /postgresql/postgresql14/pgdata

(6) 修改配置文件

按实际情况修改postgresql.conf、ph_hba.conf,/etc/profile postgresql.service , 使用新的数据库路径。

# cat pgdata/postgresql.conf 
listen_addresses = '*'
port = 5432                             
max_connections = 1000                
unix_socket_directories = '/postgresql/postgresql14/pgdata'  # comma-separated list of directories
             
# - Authentication -  
password_encryption = md5
# - Memory -  
shared_buffers = 12GB    ## 1/4 of the memory  
dynamic_shared_memory_type = posix

# WRITE-AHEAD LOG 
wal_level = replica
max_wal_size = 4GB
min_wal_size = 1024MB

# - Archiving -   
archive_mode = on
archive_command = 'cp %p /postgresql/postgresql14/archive/%f'
#archive_command = '/bin/date'

# REPLICATION
max_wal_senders = 10 
wal_keep_size = 1000
wal_sender_timeout = 120s
max_slot_wal_keep_size = 10

log_directory = 'pg_log'                        
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern,
log_truncate_on_rotation = off          
log_rotation_age = 1d                  
log_rotation_size = 0
log_timezone = 'Asia/Shanghai'
datestyle = 'iso, mdy'
timezone = 'Asia/Shanghai'
lc_messages = 'en_US.utf8'                      
lc_monetary = 'en_US.utf8'                      
lc_numeric = 'en_US.utf8'                      
lc_time = 'en_US.utf8'                       
default_text_search_config = 'pg_catalog.english'

(7) 启动新版本数据库,修改postgresql.service ,环境变量等,升级插件

# vim /usr/lib/systemd/system/postgresql.service 
[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
After=network.target
[Service]
Type=forking
User=pgsql
Group=pgsql
Environment=PGPORT=5432
Environment=PGDATA=/postgresql/pgdata
OOMScoreAdjust=-1000
ExecStart=/postgresql/pg13/bin/pg_ctl start -D ${PGDATA} -s -o "-p ${PGPORT}" -w -t 300
ExecStop=/postgresql/pg13/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/postgresql/pg13/bin/pg_ctl reload -D ${PGDATA} -s
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=300
[Install]
WantedBy=multi-user.target

# vim /etc/profile
export PGPORT=5432
export PGDATA=/postgresql/pgdata
export PGHOME=/postgresql/pg13
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH
export PGHOST=$PGDATA
export PGUSER=postgres
export PGDATABASE=postgres
alias psql='rlwrap psql'

# systemctl start postgresql.service
# su - pgsql
$ psql
postgres=# \i /home/pgsql/update_extensions.sql

(8) 安装pg_rman-REL_14_STABLE, 重新备份

# unzip pg_rman-REL_14_STABLE.zip 
# cd pg_rman-REL_14_STABLE/
# make && make install
# su - pgsql
$ pg_rman -B /db_backup/backup init
INFO: ARCLOG_PATH is set to '/postgresql/postgresql14/archive'
INFO: SRVLOG_PATH is set to '/postgresql/postgresql14/pgdata/pg_log'
$ pg_rman backup --backup-mode=full --backup-path=/db_backup/backup
$ pg_rman validate --backup-mode=full --backup-path=/db_backup/backup

(9) 收尾工作,总结

为了目录结构好看一点,将老的postgresql文件全部移动到一个目录下。

# mkdir /postgresql/postgresql13
# cd /postgresql
# mv archive  backup  opt  pg13  pgdata scripts  soft postgresql13

这个方式升级还是比较保险的,但是要停机(较长时间,视库的大小而定),这个是最大的弊病。
如果可以新升级从库,然后切换至从库,再升级主库的话,就可以极大减少停机时间,但目前不确定不同版本搭建流复制是否有暗病。因此为了保险起见,还是安排停机升级。

posted @ 2024-09-23 15:15  xuege  阅读(120)  评论(0编辑  收藏  举报