分类 标签 存档 黑客派 订阅 搜索

openSUSE 升级 postgresql 数据库

44 浏览

之前升级 openSUSE 中文论坛的 discourse,发现 postgresql 已经出到了 10,但 discourse 数据库还是 9.6 的,安装 10 的软件包也没用,要先迁移数据。

中间走了不少弯路,主要是对 pg_hba.conf 的理解不到位造成的。

pg_dump -h localhost -U discourse -d discourse 导出再导入肯定是可以的,但我就是想找个 smart way。

openSUSE 的 postgresql-common 跟 Debian 的不一样,也就是说 pg_lsclusters 这样的命令是没有的(于是某人默默把 port 这些 perl 命令的工作添加到了 TODO 上)。

只能用 pg_upgrade。

运行之前,先要把 /var/lib/pgsql 复制出来,因为我们的这个文件夹不是 vensioned(又添加了一项 TODO),先停止服务然后移动:

sudo systemctl stop postgresql 
sudo mv /var/lib/pgsql ~/pgsql

然后删除重建:

sudo rm -rf /var/lib/pgsql
sudo mkdir -p /var/lib/pgsql/data  #真正放数据的是 data 文件夹
sudo systemctl start postgresql 
/usr/lib/postgresql10/bin/initdb -D /var/lib/pgsql/data
sudo systemctl stop postgresql

然后把新老文件夹都给 postgres 用户:

sudo chown -R postgres:postgres /var/lib/pgsql
sudo chown -R postgres:postgres ~/pgsql 

然后编辑新老文件夹的 pg_hba.conf,保证他们是这样的:

local all all trust
host discourse discourse 127.0.0.1/32 trust
host discourse diacourse ::1/128 trust

改 trust 是为了在迁移过程中不验证,之后要改回来。local all all trust 是必须加的,是为了让 postgres 用户的 template1 默认数据库也能通过 [local] 方式迁移,之后可以改成 local all all peer。我之前陷入的误区就是怎么在迁移的过程中像给 pg_dump 传参数那样用 discourse 用户和 discourse 数据库和 localhost,找了各种给 pg_upgrade 传参数的办法,比如 -U discourse 之类的,这是条死路。因为错误提示报的实际上是说 postgres 用户的 template1 数据库通过 local 方式迁移不了,因为我在生产环境用不到,之前注释掉了。后来看了 pg_hba.conf 的文档才明白。

然后是编辑新老文件夹的 postgresql.conf 文件,把端口改了。因为在迁移过程中要同时跑 postgresql10 和 postgresql96,不然会冲突。

然后就可以真正开始迁移啦。

su # root 登录
su - postgres # 不先以 root 登录不能这么切用户
/usr/lib/postgresql10/bin/pg_upgrade -b /usr/lib/postgresql96/bin -B /usr/lib/postgresql10/bin  -d ~/pgsql/data -D /var/lib/pgsql/data -p 65530 -P 65531

等迁移成功后,把 postgresql 服务跑起来

sudo systemctl start postgresql 

切换到 postgres 用户跑 analyze_new_cluster.sh 和 delete_old_cluster.sh 就好了。

评论  
留下你的脚步
推荐阅读