Ubuntu PostgreSQL版本升级攻略
升级PostgreSQL是维护数据库的重要环节,需根据版本类型(小版本/大版本)选择合适方法,并严格遵循步骤以避免数据丢失。以下是详细操作指南:
升级前必须备份,确保数据可恢复。使用pg_dumpall
导出所有数据库(包括角色、表空间等):
sudo -u postgres pg_dumpall > /path/to/backup.sql
建议将备份文件存储到远程服务器或云存储,避免本地磁盘故障导致数据丢失。
确认当前PostgreSQL版本,判断升级路径(如12→13为小版本,14→15为大版本):
sudo -u postgres psql -c "SELECT version();"
小版本升级通过apt
包管理器直接完成,步骤简单且风险低:
sudo systemctl stop postgresql
sudo apt update
apt
会自动升级到该主版本下的最新小版本:sudo apt install postgresql-14
sudo systemctl start postgresql
psql --version # 或 sudo -u postgres psql -c "SELECT version();"
小版本升级无需数据迁移,升级后检查数据库功能是否正常即可。
大版本升级需更换数据库集群,推荐使用pg_upgrade
工具(快速)或逻辑转储(安全),以下分别介绍:
pg_upgrade
是PostgreSQL官方提供的升级工具,直接迁移数据文件,耗时短,但需满足版本兼容性(如14→15支持,10→12不支持)。
若当前Ubuntu版本未包含目标大版本,需添加PostgreSQL官方APT仓库:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
安装目标大版本(如15),不覆盖旧版本:
sudo apt install postgresql-15
sudo systemctl stop postgresql
新版本会自动初始化集群,但需确认目录(如/var/lib/postgresql/15/main
)是否存在。
检查兼容性(可选但推荐):
sudo -u postgres /usr/lib/postgresql/15/bin/pg_upgrade \
-b /usr/lib/postgresql/14/bin \ # 旧版本二进制目录
-B /usr/lib/postgresql/15/bin \ # 新版本二进制目录
-d /var/lib/postgresql/14/main \ # 旧版本数据目录
-D /var/lib/postgresql/15/main \ # 新版本数据目录
--check
若输出“Check successful”,则可继续。
执行升级:
sudo -u postgres /usr/lib/postgresql/15/bin/pg_upgrade \
-b /usr/lib/postgresql/14/bin \
-B /usr/lib/postgresql/15/bin \
-d /var/lib/postgresql/14/main \
-D /var/lib/postgresql/15/main \
-o '-c config_file=/etc/postgresql/14/main/postgresql.conf' \ # 旧版本配置文件路径
-O '-c config_file=/etc/postgresql/15/main/postgresql.conf' # 新版本配置文件路径
升级后需更新统计信息,优化查询性能:
sudo -u postgres /usr/lib/postgresql/15/bin/vacuumdb --all --analyze-in-stages
sudo systemctl start postgresql@15-main # 启动新版本
sudo systemctl stop postgresql@14-main # 可选:停止旧版本(需确认新版本正常)
若pg_upgrade
不支持(如10→12),或需要跨平台迁移,可使用逻辑转储,步骤如下:
sudo -u postgres pg_dumpall -f /path/to/backup.sql
同方法一的步骤2。
sudo /usr/lib/postgresql/15/bin/initdb -D /var/lib/postgresql/15/main/
sudo systemctl start postgresql@15-main
sudo -u postgres psql -f /path/to/backup.sql postgres
sudo -u postgres psql -c "SELECT version();"
pg_upgrade
(快速,适合生产环境);pg_upgrade
不支持或需跨平台,使用逻辑转储(安全,适合复杂环境)。若使用pg_upgrade
,旧版本的postgresql.conf
、pg_hba.conf
会自动复制到新目录(如/etc/postgresql/15/main/
)。需检查以下配置:
sudo sed -i 's/port = 5432/port = 5433/' /etc/postgresql/15/main/postgresql.conf
pg_hba.conf
中的认证方式(如md5
、scram-sha-256
)符合需求,避免无法登录。sudo systemctl start postgresql@15-main
sudo systemctl stop postgresql@14-main
psql -p 5433 -U postgres -c "SELECT version();" # 替换为新版本端口
检查数据库功能(如创建表、查询数据)是否正常。
确认新版本运行稳定后,卸载旧版本软件包并删除旧集群:
sudo apt remove --purge postgresql-14 postgresql-server-dev-14 # 卸载旧版本
sudo rm -rf /etc/postgresql/14/ /var/lib/postgresql/14/ # 删除旧配置和数据
若停止了旧版本,可重启新版本服务:
sudo systemctl restart postgresql
若pg_upgrade
报错“permission denied”,需确保旧数据目录和新数据目录的权限正确:
sudo chown -R postgres:postgres /var/lib/postgresql/14/main/
sudo chown -R postgres:postgres /var/lib/postgresql/15/main/
若新旧版本的postgresql.conf
有冲突(如max_connections
),需手动合并,优先保留新版本的配置。
升级后,部分扩展(如postgis
)可能需要重新安装:
sudo apt install postgis postgresql-15-postgis # 示例:重新安装postgis
通过以上步骤,可顺利完成Ubuntu环境下PostgreSQL的版本升级。务必牢记:备份是升级的前提,选择合适的升级方法,并仔细检查每一步的操作结果。