最近给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.其他报错
如果有其他报错,通常会有个日志文件,读取其中就可以知道为什么迁移错误了