将 PostgreSQL 从 12.2 版本升级到 16.4 版本是一个相对较大的跳跃,因为 PostgreSQL 的主要版本之间(如从 12 到 16)可能会引入不兼容的更改、新特性以及性能改进。以下是一个基本的步骤指南,帮助你完成从 PostgreSQL 12.2 到 16.4 的升级过程。请注意,这个过程可能需要根据你的具体环境(如操作系统、数据库大小、配置等)进行调整。
1. 备份数据库
在升级之前,最重要的一步是备份你的数据库。这样,如果升级过程中出现问题,你可以恢复到原始状态。
pg_dumpall -U postgres > all_databases.sql
或者,如果你只想备份特定的数据库:
pg_dump -U postgres your_database_name > your_database_name.sql
2. 安装 PostgreSQL 16.4
在升级之前,你需要先安装 PostgreSQL 16.4。这通常涉及到下载新版本的 PostgreSQL 并按照你的操作系统的指导进行安装。确保在安装过程中不要覆盖或删除旧版本的 PostgreSQL,因为稍后你可能需要访问它。
2.1、创建目录并授权
mkdir -p /postgresql/pgsql16.4
mkdir -p /postgresql/pgdata16.4
chown -R pgsql:pgsql /postgresql/pgsql16.4
chown -R pgsql:pgsql /postgresql/pgdata16.4
chmod -R 775 /postgresql/pgsql16.4
chmod -R 775 /postgresql/pgdata16.4
2.2、解压编译postgresql-16.4及初始化配置
su - pgsql
cd /postgresql/soft
tar zxvf postgresql-16.4.tar.gz
cd postgresql-16.4
./configure --prefix=/postgresql/pgsql16.4 --without-readline
make
make install
-- 初始化
/postgresql/pgsql16.4/bin/initdb -D /postgresql/pgdata16.4 -E UTF8 --locale=en_US.utf8 -U postgres
-- 配置postgresql.conf
vi /postgresql/pgdata16.4/postgresql.conf
listen_addresses = '*'
port = 5432
max_connections = 1000
#logging_collector = off ===>>logging_collector = on
#log_directory = 'log' ===>>log_directory = 'pg_log'
#log_truncate_on_rotation = off ===>> log_truncate_on_rotation = on
#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' ===>> log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
shared_buffers = 128MB ===>> shared_buffers = 1024MB
max_wal_size = 1GB
min_wal_size = 80MB
-- 配置pg_hba.conf
vi /postgresql/pgdata16.4/pg_hba.conf
host all all 0.0.0.0/0 md5
3. 停止 PostgreSQL 12.2 服务
在升级过程中,确保 PostgreSQL 12.2 的服务是停止的,以避免任何潜在的冲突。
# pg_ctl来停止数据库服务
pg_ctl stop
# 对于 Linux 系统,使用 systemctl 或 service 命令
sudo systemctl stop postgresql-12
# 或者
sudo service postgresql-12 stop
4. 迁移数据
有几种方法可以迁移数据从 PostgreSQL 12.2 到 16.4:
-
使用 pg_upgrade:这是 PostgreSQL 官方推荐的升级工具,可以最小化停机时间。但是,它要求旧版本的服务必须运行,并且新版本必须安装在不同的数据目录中。
/postgresql/pgsql16.4/bin/pg_upgrade --old-datadir /postgresql/pgdata --new-datadir /postgresql/pgdata16.4 --old-bindir /postgresql/pgsql12/bin --new-bindir /postgresql/pgsql16.4/bin -U postgres -- OR pg_upgrade -b /postgresql/pgsql12/bin -B /postgresql/pgsql16.4/bin -d /postgresql/pgdata -D /postgresql/pgdata16.4 -U postgres -- 编辑环境变量 vi ~/.bash_profile export LANG=en_US.UTF8 export PS1="[`whoami`@`hostname`:"'$PWD]$' export PGPORT=5432 export PGDATA=/postgresql/pgdata16.4 export PGHOME=/postgresql/pgsql16.4 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 -- 启动数据库 pg_ctl start -- OR /postgresql/pgsql16.4/bin/pg_ctl -D /postgresql/pgdata16.4 start -- 数据库状态 pg_ctl status -- 停止数据库 pg_ctl stop
注意:你需要根据你的实际安装路径调整 `-b` 和 `-B` 参数。
-
使用 pg_dump 和 pg_restore:如果你不想使用
pg_upgrade
,或者你的环境不允许这样做,你可以使用pg_dump
导出旧数据库,然后使用pg_restore
将其导入到新版本的 PostgreSQL 中。这种方法可能需要更长的停机时间,因为它涉及到导出和导入整个数据库。
5. 验证和测试
升级完成后,验证新数据库的功能和性能。检查所有应用程序是否都能正常工作,以及是否有任何性能问题。
psql -V
psql -h 127.0.0.1 -p 5432
6. 更新应用程序配置
更新任何指向旧 PostgreSQL 实例的数据库连接字符串和配置。
7. 清理旧版本
一旦你确认新版本运行正常,并且所有应用程序都已更新,你可以安全地卸载或删除旧版本的 PostgreSQL。
注意事项
- 在升级之前,请仔细阅读 PostgreSQL 的官方升级文档,了解可能的不兼容更改和注意事项。
- 考虑在测试环境中先进行升级,以确保一切按预期工作。
- 升级过程中可能会遇到特定于你数据库的问题,因此请准备好解决这些问题。
希望这个指南能帮助你成功地将 PostgreSQL 从 12.2 升级到 16.4!