pgsql 版本升级和数据迁移(编译版)

最近给pgsql从16.0升级到16.4,有挺多细节

1.关闭pgsql

为了保证数据一致性和过渡平稳,还是需要暂停pgsql。

bash 复制代码
systemctl stop pgsql

2.备份现有数据

需要切换到pgsql的用户,通常用root是不行的

bash 复制代码
pg_dumpall > /xxx/xxx/backup.sql

3.重命名程序目录和数据目录(重要)

如果是默认的位置,那么命令如下

bash 复制代码
mv /usr/local/pgsql /usr/local/pgsql0
bash 复制代码
mv /var/pgsqldata /var/pgsqldata0

一定要迁移到其他目录,而不是直接覆盖,因为很容易搞错。

4.编译安装新版

编译安装的教程:链接

到make && make install就编译好了,下面是迁移数据
注意插件也需要重新安装

安装插件!!!

5.新版本的数据初始化

bash 复制代码
mkdir /var/pgsqldata
bash 复制代码
chown postgres:postgres /var/pgsqldata
bash 复制代码
chmod -R 750 /var/pgsqldata

切换到postgres,然后再进行初始化

bash 复制代码
su postgres
bash 复制代码
cd /var/pgsqldata
bash 复制代码
initdb

初始化之后不需要启动,如果不是初始化默认的/var/pgsqldata,可以适用指定目录initdb -D /xxx/xxx

6.升级数据目录(重要)

需要切换到postgres用户,还有进入可执行的目录,比如/tmp

bash 复制代码
cd /tmp
bash 复制代码
/usr/local/pgsql/bin/pg_upgrade -b /usr/local/pgsql0/bin -B /usr/local/pgsql/bin -d /var/pgsqldata0 -D /var/pgsqldata

/usr/local/pgsql/bin/pg_upgrade:这是 pg_upgrade 可执行文件的路径。新版本 PostgreSQL 的 pg_upgrade 工具的位置,因为它包含最新的升级工具代码

-b /usr/local/pgsql0/bin:

复制代码
旧版本 PostgreSQL 的 bin 目录路径。
这个目录包含旧版本的 PostgreSQL 二进制文件(如 postgres、pg_ctl 等),pg_upgrade 需要知道旧二进制文件的位置以便与新版本进行兼容性检查。

-B /usr/local/pgsql/bin:

复制代码
新版本 PostgreSQL 的 bin 目录路径。
这个目录包含新安装的 PostgreSQL 二进制文件。指定该路径以便 pg_upgrade 使用新版本的二进制文件进行升级。

-d /var/pgsqldata0:

复制代码
旧版本 PostgreSQL 的数据目录路径。
此目录存储旧版本数据库的实际数据文件和元数据。pg_upgrade 将读取这些数据并将其迁移到新版本中。

-D /var/pgsqldata:

复制代码
新版本 PostgreSQL 的数据目录路径。
这个目录将用于存储升级后的数据。pg_upgrade 会将旧数据目录中的数据迁移到这个新目录中,确保新版本 PostgreSQL 启动时可以直接使用这些数据。

一切正常后,会看到类似下面的提示,upgrade complete

7.修改pg_hba.conf文件和postgresql.conf

将旧的pg_hba.conf和postgresql.conf文件内容(我这里是/var/pgsqldata0)修改到新的数据目录里面去

8.启动pgsql

bash 复制代码
systemctl start pgsql

二、容易出现的报错和处理

1.新目录没有初始化

虽然是要从旧目录迁移数据,但是还是要初始化新版的数据目录

2.数据目录权限

无论是新的还是旧的目录,都需要700或750的权限

bash 复制代码
chmod -R 750 /var/pgsqldata
bash 复制代码
chmod -R 750 /var/pgsqldata0

3.没有关闭旧的程序

如果你不止开启了一个实例(多开pgsql),需要注意,否则无法正常进行

另外如果多个实例,有多个数据目录,则除了编译安装外,其他的数据迁移目录都要这样来一遍

4.插件没有安装

插件没有安装的情况是,是无法顺利迁移的,需要装的都要装

5.其他报错

如果有其他报错,通常会有个日志文件,读取其中就可以知道为什么迁移错误了

相关推荐
周周爱喝粥呀37 分钟前
详细教程:在 Docker 中部署 PostgreSQL 并使用 pgAdmin 可视化管理
docker·postgresql·容器
qq_白羊座41 分钟前
Hologres / PostgreSQL jsonb 常用函数 & 操作符对照表
数据库·postgresql
kele_z3 小时前
手工修改数据库中的数据时,我会加的四道保险
mysql·postgresql
ly76893 小时前
PostgreSQL 执行计划深读:从 EXPLAIN 输出到代价模型驱动的 SQL 改写
数据库·sql·postgresql·explain·执行计划·代价模型
ss2734 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 16 PostgreSQL子查询与嵌套查询(下)
数据库·笔记·postgresql
l1t6 小时前
DeepSeek总结的PostgreSQL 的 MVCC 很糟。其他所有的也一样。第1部分
数据库·postgresql
ss2737 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 15 PostgreSQL子查询与嵌套查询(上)
数据库·人工智能·postgresql
ly76891 天前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
ly76891 天前
Spring Boot 集成 PostgreSQL 的连接池调优:HikariCP、prepared statement 与服务器资源边界
spring boot·postgresql·hikaricp·连接池调优
一直在努力学习的菜鸟2 天前
PostgreSQL流复制和PostgreSQL高可用的区别
postgresql