当前版本为15.8 升级后为16.1
1、备份原数据库
pg_dumpall -f /data/pgdatabak/pg15all.sql
2、安装目标版本
cd /data
wget https://ftp.postgresql.org/pub/source/v16.1/postgresql-16.1.tar.bz2 --no-check-certificate
tar -xjvf postgresql-16.1.tar.bz2 -C /data
mkdir /data/pg16
chown -R postgres.postgres /data/pg16
查旧库的blocksize大小
SELECT name, setting FROM pg_settings WHERE name = 'block_size';
name | setting
------------+---------
block_size | 8192
旧库配置信息查看 pg_config
./configure --prefix=/data/pg16 --with-pgport=5432 --with-openssl --with-readline
说明:1、blocksize默认是8KB或16KB, 指定参数前先查一下旧库的值,如果需要指定则带参数 --with-blocksize=8
make && make install
cd /data/pg16
mkdir pgdata
chown -R postgres.postgres /data/pg16/pgdata
su - postgres
/data/pg16/bin/initdb -D /data/pg16/pgdata -U postgres --encoding=UTF8 --lc-collate=C --lc-ctype=en_US.utf8 --data-checksums
注意:
1、如果旧库没使用–data-checksums 则这里也不使用,如果使用了,重新执行初始化时间要删除/data/pg16/pgdata目录内容
旧库检查 cat /var/lib/pgsql/15/data/postgresql.conf|grep checksums
或连接到库
SELECT name, setting, unit, source
FROM pg_settings
WHERE name = ‘data_checksums’;
2、初始化新的集群,注意兼容旧库实例的initdb选项
3、停掉原库的连接及库
/usr/pgsql-15/bin/pg_ctl -D /var/lib/pgsql/15/data/ -mf stop
4、拷贝配置文件
cd /data/pg16/pgdata
mv postgresql.conf postgresql.conf.bak
mv pg_hba.conf pg_hba.conf.bak
cp /var/lib/pgsql/15/data/postgresql.conf /data/pg16/pgdata/postgresql.conf
cp /var/lib/pgsql/15/data/pg_hba.conf /data/pg16/pgdata/pg_hba.conf
5、预检
使用pg_upgrade预检(兼容性检测)
/data/pg16/bin/pg_upgrade --old-bindir=/usr/pgsql-15/bin --new-bindir=/data/pg16/bin --old-datadir=/var/lib/pgsql/15/data --new-datadir=/data/pg16/pgdata --check
如果不想拷贝数据,可以使用参数 --link建立硬连接
6、执行升级
/data/pg16/bin/pg_upgrade --old-bindir=/usr/pgsql-15/bin --new-bindir=/data/pg16/bin --old-datadir=/var/lib/pgsql/15/data --new-datadir=/data/pg16/pgdata
升级成功最后提示
Once you start the new server, consider running:
/data/pg16/bin/vacuumdb --all --analyze-in-stages
Running this script will delete the old cluster's data files:
./delete_old_cluster.sh
7、 修改环境变量
vim /home/postgres/.bash_profile
export PGHOME=/data/pg16
export PGDATA=/data/pg16/pgdata
export PGPORT=5432
export PGPASSWORD=123456
export PATH=
P
G
H
O
M
E
/
b
i
n
:
PGHOME/bin:
PGHOME/bin:PATH
export MANPATH=
P
G
H
O
M
E
/
s
h
a
r
e
/
m
a
n
:
PGHOME/share/man:
PGHOME/share/man:MANPATH
export LD_LIBRARY_PATH=
P
G
H
O
M
E
/
l
i
b
:
PGHOME/lib:
PGHOME/lib:LD_LIBRARY_PATH
export SCRIPTS_DIR=$SCRIPTS_DIR
export LANG=en_US.UTF-8
export DATE=date +“%Y%m%d%H%M”
二进制部署方式可能没有环境变量,需要先
sudo su -
cd /home
mkdir postgres
chown -R postgres. postgres
再修改环境变量
改变用户主目录 usermod -d /home/postgres postgres
变更前用户主目录 postgres❌26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash
source /home/postgres/.bash_profile
8、启动数据库
/data/pg16/bin/pg_ctl -D /data/pg16/pgdata -l logfile start
也可以不用写全路径 pg_ctl -D /data/pg16/pgdata -l logfile start
9、收集统计信息
/data/pg16/bin/vacuumdb --all --analyze-in-stages
10、删除旧数据
/data/pg16/pgdata/delete_old_cluster.sh
执行之后 /var/lib/pgsql/15 下 data 目录就没有了
11、查看数据
postgres=#\l+
\c mydb u1
/data/pg16/bin/pg_ctl -D /data/pg16/pgdata -l logfile start
/usr/pgsql-15/bin/postmaster -D /var/lib/pgsql/15/data/
12、设置PostgreSQL开机自启动
1.打开终端并使用root权限登录系统
2.编辑 /etc/rc.local 文件:
vi /etc/rc.local
在文件的最后一行添加以下内容:
su - postgres -c "/data/pg16/bin/pg_ctl start -D /data/pg16/pgdata -l /data/pg16/pgdata/log/postgresql.log"
###这里假设PostgreSQL安装路径为 /data/pg16,数据存储路径为 /data/pg16/pgdata,日志文件存储路径为 /data/pg16/pgdata/log/postgresql.log。如果这些路径不同,请相应地修改命令参数。
保存文件并退出编辑器。
3.添加可执行权限以使该文件在系统启动时自动运行:
sudo chmod +x /etc/rc.local
4.重启系统,确保PostgreSQL服务器已自动启动。
报错处理:
1、wal_segment_size不一样
如果出现old and new pg_controldata WAL segment sizes are invalid or do not match
是因为wal_segment_size不一样,需要重新修改高版本的
/data/pg15/bin/pg_resetwal --wal-segsize=64 -D /data/pg15/data
修改之后启动会报错
waiting for server to start…2024-01-04 17:24:27.696 CST [19814] FATAL: “min_wal_size” must be at least twice “wal_segment_size”
修改postgres.conf 中的min_wal_size为64的两倍即可
2、检查block size
pg_controldata -D /data/pg12/data |grep -i ‘wal|size’ 中WAL block size不一样
with-wal-segsize 该参数无效 初始化之后设置/data/pg15/bin/pg_resetwal --wal-segsize=64 -D /data/pg15/data
3、config时提示找不到icu lib
查看是否安装此库 icu-config --version
安装 yum install libicu-devel
然后再执行刚才的config