Docker系统如何升级Postgres数据库(已过时,仅作为存档)

如何升级Postgres数据库 Posted by Mastodon搭建指南 on December 2, 2020

注意(2022-03-18更新):官方自3.5.0版本后将docker-compose.yml的postgres版本号升级成了14,升级步骤见这份教程,本文仅作为存档!

如果依然需要参考本教程,则需注意在v3.5.0后:1. postgres版本升级为14。2. postgres文件夹地址发生改变,改为了postgres14。

本升级教程依旧是@star@b612.me兔子老师的手把手指导记录。

为何需要

在v3.3.0版本之后,迁移数据时会出现可能发生错误的提示。这是由于系统自带的glibc在2.28版本之后,处理数据的方式发生巨大变化,如果曾经使用过该版本之前的系统,系统升级后依然使用原有数据库,可能导致数据库索引发生问题。

查看自身gblic版本方法:

ldd --version

会显示是GLIBC的哪个版本。

官方给出了检查和解决方案,但如果你之前使用了本站教程最早的版本采用Docker安装,由于官方给出的docker-compose.yml文件中数据库版本还是Postgres 9.6,无法运行官方检查使用的插件。

因此,可以直接选择对Postgres数据库进行升级并重新编码数据库。思路是:将数据库文件从二进制导出变为文本,将数据库升级后再导回数据库重新编码为二进制。重新编码之后数据库的索引版本将与系统保持一致,不会再出现不适配的问题,用官方的检查方案进行检查也不会有任何问题。

  

步骤

  

1. 拉取12.5的pg镜像

   docker pull postgres:12.5-alpine

  

2. 关闭mastodon服务

   cd /home/mastodon/mastodon     #mastodon docker所在文件夹
   systemctl stop nginx           #关闭nginx,禁止入口流量,使数据库不再发生变化
   docker stop mastodon_web_1
   docker stop mastodon_sidekiq_1
   docker stop mastodon_streaming_1
   docker stop mastodon_redis_1        #关闭mastodon其他服务

此时使用docker ps查看,mastodon相关服务应该仅剩mastodon_db_1mastodon_es_1(如果开启了全文搜索)。

  

3. 执行全局备份

   docker exec mastodon_db_1 pg_dumpall -c -U postgres > ./fullbackup.sql

与此同时,如果你按照之前教程设置了自动备份,安全起见也可以另外在此时运行一下备份脚本,以免后续操作出现问题。

停止所有服务:

   docker-compose down

重命名旧的postgres库

   mv ./postgres ./postgres9-old

  

4. 在新版本postgres库中恢复数据

新建一个postgres12的容器:

如果你设置了数据库的密码:

   docker run --name postgres12 -v /当前文件夹绝对路径/postgres:/var/lib/postgresql/data -e POSTGRES_PASSWORD=旧库密码 -d postgres:12.5-alpine

如果你没有设置数据库的密码:

   docker run --name postgres12 -v /当前文件夹绝对路径/postgres:/var/lib/postgresql/data -e POSTGRES_HOST_AUTH_METHOD=trust -d postgres:12.5-alpine

然后,docker ps | grep postgres12 | awk '{print $1}'查看postgres12一行最前面的代码,通过docker cp命令将刚才生成的备份拷贝入docker容器:

   docker cp ./fullbackup.sql 刚查到的代码:/tmp/fullbackup.sql

随后进入容器:

   docker exec -it postgres12 /bin/bash
   su - postgres

导入备份:

   psql -f  /tmp/fullbackup.sql

随后两次exit退出容器。

  

5. 将数据库挂载到mastodon上

停止postgres12:

   docker stop postgres12
   docker rm postgres12

nano docker-compose.yml修改docker-compose.yml,将db部分的image一行改成:

   image: postgres:12.5-alpine

重启mastodon和nginx:

   docker-compose up -d
   systemctl start nginx

升级就完成啦!数据库版本可以打开网页,在“首选项-管理”中查看。

  

  

检查

按照官方检查方案检查即可。注意官方给出的代码均要在数据库中输入,具体需要:

   docker exec -it mastodon_db_1 /bin/bash
   su - postgres
   psql

之后再进行输入,不要忘记分号。

检查之后,需要再次重启:

   docker-compose down
   docker-compose up -d