前因
树莓派中安装的是postgresql15,再一次更新后莫名升级到了postgresql16,于是系统进程中出现了两个版本的进程,对于我这样的洁癖狂来说无法忍受,于是安装官方例程升级数据库文件,结果多次出错,当时放弃,后终于浪费一下午时间搞定,记录下来,防止下次更新忘记.
一.停止postgresql服务
$ sudo systemctl stop postgresql.service
这一条命令会同时停止两个版本的服务.
二.更新数据库
-
使用postgres用户登陆
$ sudo su postgres
-
切换到/tmp目录
$ cd tmp/
这里我出现第一个关于权限的错误,因为我没有切换目录,用的是/home目录,出现错误的第一时间我是在/home/pi目录下建立了一个具有postgres:postgres权限的目录,在这个目录下面运行pg_upgrade命令,结果是出现更多的关于权限的错误,猜测大概在升级运行命令过程中生成了各种文件权限造成的,最后在根目录下面创建了一个具有postgres权限的目录解决
-
运行带–check参数的命令check一下
$ /usr/lib/postgresql/16/bin/pg_upgrade --old-datadir=/var/lib/postgresql/15/main --new-datadir=/var/lib/postgresql/16/main --old-bindir=/usr/lib/postgresql/15/bin --new-bindir=/usr/lib/postgresql/16/bin --old-options '-c config_file=/etc/postgresql/15/main/postgresql.conf' --new-options '-c config_file=/etc/postgresql/16/main/postgresql.conf' --check
这个时候又出现一个错误
多方Google以后知道我设置了postgres用户的密码,但是在切换用户的时候没有输入postgres的密码,解决办法是设置密码变量,结果如下
-
去掉–check参数运行,官方还有别的–link参数几个,感觉默认就行了.运行后退出postgres用户.
exit
-
修改版本15和16的配置文件,调换端口.我的没有更换端口的出错图示
$ sudo vim /etc/postgresql/16/main/postgresql.conf $ port = 5433 # 改成5432 $ sudo vim /etc/postgresql/15/main/postgresql.conf $ port = 5432 # 改成5433
-
启动postgresql服务,切换postgres用户查看当前运行的版本
$ sudo systemctl start postgresql.service $ sudo su postgres $ psql -c "SELECT version();"
三.运行优化程序删除老版本
-
运行vacuumdb优化更新后的数据库,
$ /usr/lib/postgresql/16/bin/vacuumdb --all --analyze-in-stages
这一步没有发现错误
-
清理旧的数据集文件
$ ./delete_old_cluster.sh $ sudo rm -rf /etc/postgresql/15/main
清理的.sh文件应该是生成的,整个运行目录都在那个具有postgres用户权限的目录下.运行完毕后就可以卸载老版本了.那些版本15的配置文件不会卸载,建议保留,因为还有后续.
四.后续
升级完成后会发现无法通过局域网访问数据库,一直鼓捣了半天ufw,后来chatgpt后才知道大版本升级配置文件不会升级,于是那些保留的版本15的配置文件就派上用场了,我大概对比了一下,配置参数好像没有大的变动,应该可以覆盖来修改的,由于我的只要修改两处,没有使用覆盖这种简单粗暴的办法
-
修改postgresql.conf
$ sudo vim /etc/postgresql/16/main/postgresql.conf
-
修改pg_hba.conf
$ sudo vim /etc/postgresql/16/main/pg_hba.conf
另外发现的问题是使用 systemctl reload postgresql发现配置文件文件无法生效,只有使用restart才行.莫名其妙