postgresql13.6升级到14.11实录
背景与需求
当前生产环境的gitlab版本使用的postgresql 版本为13.6, 按gitlab官方版本要求, gitlab 17.X 版本 ,Minimum PostgreSQL version 为14.9 (参考gitlab版本要求 ),因此 要升级gitlab版本的话,必须先升级postgresql数据库。
版本描述
- 当前版本:13.6
- 目标版本:14.11
升级步骤
(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
这个方式升级还是比较保险的,但是要停机(较长时间,视库的大小而定),这个是最大的弊病。
如果可以新升级从库,然后切换至从库,再升级主库的话,就可以极大减少停机时间,但目前不确定不同版本搭建流复制是否有暗病。因此为了保险起见,还是安排停机升级。