1、创建临时安装包文件夹:
# 打开usr目录
cd /usr
# 在usr目录下创建tmptar文件夹
mkdir tmptar
# 打开tmptar文件夹
cd tmptar
2、下载安装包、安装依赖包
# 下载数据库安装包,版本postgresql-16.9
wget https://ftp.postgresql.org/pub/source/v16.9/postgresql-16.9.tar.gz
# 安装数据库包之前需要先安装依赖包
yum install -y perl-ExtUtils-Embed readline-devel zlib-devel pam-devel libxml2-devel libxslt-devel openldap-devel python-devel gcc-c++ openssl-devel cmake
3、解压、编译、安装、插件安装
# 执行解压(在tmptar目录下生成一个postgresql-16.9的目录)
tar zxvf postgresql-16.9.tar.gz
# 编译postgresql源码,安装
cd postgresql-16.9
./configure --prefix=/usr/pgsql-16
make && make install
# 插件安装
cd /contrib
make && make install
4、指定目录初始化数据库
# 在home目录下创建data目录
cd /home
mkdir pg16
cd pg16
mkdir data
# 赋于用户postgres对于data目录的权限
chown postgres:postgres data
# 执行数据库初始化
su - postgres -c "/usr/pgsql-16/bin/initdb -D /home/pg16/data"
5、修改pg_hba.conf、postgresql.conf配置文件
# 打开编辑pg_hba.conf
vi /home/pg16/data/pg_hba.conf
# 在最后一行添加
host all all 0/0 md5
打开编辑postgresql.conf
vi /home/pg16/data/postgresql.conf
# 把 listen_addresses放开,值改为 *
# 把 下一行port = 5432放开
6、原有postgresql-14数据库备份
# 创建备份目录p14olddata
cd /home
mkdir p14olddata
chown postgres:postgres /home/p14olddata
# 执行以下备份命令(包含所有数据库、用户、角色等),备份文件也放在home目录下。
su - postgres
pg_dumpall -U postgres -f /home/p14olddata/dumpall_data.sql
# 备份完停止老库:
systemctl stop postgresql-14
7、版本兼容性校验、升级安装
# 新版本pg与旧版本兼容性校验--check(若校验失败则解决之后才能安装,一般情况下都是OK的)
su - postgres
/usr/pgsql-16/bin/pg_upgrade --old-datadir /var/lib/pgsql/14/data --new-datadir /home/pg16/data --old-bindir /usr/pgsql-14/bin --new-bindir /usr/pgsql-16/bin --check
# check通过后安装命令:
/usr/pgsql-16/bin/pg_upgrade --old-datadir /var/lib/pgsql/14/data --new-datadir /home/pg16/data --old-bindir /usr/pgsql-14/bin --new-bindir /usr/pgsql-16/bin
8、创建 systemd 数据库启动服务配置postgresql-16.service
# 打开编辑
sudo nano /etc/systemd/system/postgresql-16.service
# 复制粘贴以下内容:
[Unit]
Description=PostgreSQL 16 database server
Documentation=https://www.postgresql.org/docs/16/static/
After=network.target
[Service]
User=postgres
Group=postgres
ExecStart=/usr/pgsql-16/bin/postgres -D /home/pg16/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
TimeoutSec=infinity
LimitNOFILE=65535
Restart=on-failure
[Install]
WantedBy=multi-user.target
# 按 Ctrl + O(字母O)保存,再按回车
# 再按Ctrl + X退出编辑
# 重新加载启动服务,使配置生效
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
9、配置环境变量.bash_profile
# 打开编辑bash_profile文件
vi ~/.bash_profile
# export PATH 前添加以下内容:
export LANG=en_US.UTF-8
export PS1="[\u@\h \W]\$ "
export PGPORT=5432
export PGDATA=/home/pg16/data
export PGHOME=/usr/pgsql-16
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export PATH=$PGHOME/bin:$PATH:.
export DATE=`date +"%Y%m%d%H%M"`
export MANPATH=$PGHOME/share/man:$MANPATH
export PGHOST=$PGDATA
export PGUSER=postgres
export PGDATABASE=postgres
10、启动postgresql-16
# 启动postgresql-16数据库服务
systemctl start postgresql-16
# 停止postgresql-16数据库服务 systemctl stop postgresql-16
# 查看数据库服务状态
systemctl status postgresql-16
# 重新收集统计信息
su - postgres
/home/pg16/data/bin/vacuumdb --all --analyze-in-stages
11、其它辅助命令(供安装过程中参考)
# 修改数据库postgres用户密码
sudo -u postgres /usr/pgsql-16/bin/postgres --single -D /home/pg16/data
ALTER USER postgres PASSWORD '新密码';
# 退出
\q
# 查询服务安装情况
rpm -qa | grep postgresql14
# 查看服务日志
sudo journalctl -u postgresql-16
# 若systemctl status postgresql-16报下面错
Jul 01 17:48:42 dce-infra01 postgres[748331]: 2025-07-01 17:48:42.754 CST [748334] LOG: invalid record length at 0/494C8D88: expected at least 24, got 0
# 解决方法
# 先停止服务:
sudo systemctl stop postgresql-16
# 重新归档数据库日志
su - postgres
/usr/local/pgsql/bin/pg_resetwal -f /home/pg16/data
# 若出现报错:
pg_resetwal: error: lock file "postmaster.pid" exists
pg_resetwal: hint: Is a server running? If not, delete the lock file and try again.
# 解决方法
# 手动删除.pid文件:
rm /home/pg16/data/postmaster.pid,
# 再次执行
/usr/local/pgsql/bin/pg_resetwal -f /home/pg16/data