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.其他报错

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

相关推荐
ppo_wu1 天前
1Panel修改PostgreSQL时区
linux·数据库·docker·postgresql
谦谦均1 天前
PostgreSQL中的COPY命令:高效数据导入与导出
数据库·postgresql·oracle
不会编程的猫星人1 天前
向量数据库PGVECTOR安装
数据库·postgresql·向量数据库
谦谦均1 天前
PostgreSQL序列:创建、管理与高效应用指南
数据库·postgresql
kahnyao2 天前
PostgreSQL加密连接SSL配置
postgresql
Moshow郑锴2 天前
PostgreSQL中如果有Left Join的时候索引怎么加
数据库·postgresql
Navicat中国2 天前
Navicat 17 功能简介 | 单元格编辑器
数据库·sql·mysql·postgresql·oracle·编辑器·navicat
geovindu3 天前
string split function in postgreSQL 17.01 or SQL Server2019 or mySQL 9.0
数据库·sql·mysql·postgresql·sqlserver
ac.char3 天前
在 PostgreSQL 中,重建索引可以通过 `REINDEX` 命令来完成
数据库·postgresql·database