将矩阵突触 postgresql 数据库从 9.6 升级到 11

将矩阵突触 postgresql 数据库从 9.6 升级到 11

我的服务器上有一个虚拟机,我在其中托管 Matrix synapse 主服务器。

现在我需要更新 postgresql,因为版本 9.6 已经 EOL。

数据库/var/lib/postgresql/9.6/main已经有 56 GB。

我使用以下脚本将数据库转储到 sql 文件中:

#!/bin/bash
DB=synapse
U=irc-bridge
# directory to dump files without trailing slash:
DIR=/home/synapse/postgres-backup
mkdir -p $DIR
TABLES="$(psql -q -d $DB -U $U -t -c "SELECT table_name FROM information_schema.tables WHERE table_type='BASE TABLE' ORDER BY table_name")"
w=$(echo $TABLES|wc -w)
echo $w tables
i=0
for table in $TABLES; do
  i=$((i + 1))
  echo "$i/$w: backup $table ..."
  pg_dump -U $U -t $table $DB | gzip > $DIR/$table.sql.gz;
done;

我得到大约 9 GB 的压缩文件。

从 9.6 升级 Postgres 集群的最简单途径是什么?

答案1

最好的方法是转储整个数据库并将其导入新集群中:

sudo -u postgres pg_dumpall --cluster 9.6/main > dump.sql
sudo -u postgres psql -d postgres --cluster 13/main -f dump.sql

https://decatec.de/linux/postgresql-upgrade-auf-neue-version-durchfuehren

答案2

我也必须进行升级,因为 Synapse 从版本 1.72.0 开始,放弃了对早于版本 11 的 Postgresql 的支持。

上下文:我们的安装是通过 docker-compose 完成的,/opt/synapsepostgres 容器定义如下:

db:                                                                                                                                                                                                                                                                                                                                                                                                                            
  image: docker.io/postgres:10-alpine                                                                                                                                                                                                                                                                                                                                                                                          
  shm_size: 1gb                                                                                                                                                                                                                                                                                                                                                                                                                
  restart: unless-stopped                                                                                                                                                                                                                                                                                                                                                                                       
  environment:                                                                                                                                                                                                                                                                                                                                                                                                                 
    - POSTGRES_USER=synapse                                                                                                                                                                                                                                                                                                                                                                                                    
    - POSTGRES_PASSWORD=my_postgres_password
    - POSTGRES_INITDB_ARGS=--encoding=UTF-8 --lc-collate=C --lc-ctype=C                                                                                                                                                                                                                                                                                                                                                        
  volumes:                                                                                                                                                                                                                                                                                                                                                                                                                     
    - ./schemas:/var/lib/postgresql/data

这意味着 postgres 数据文件位于/opt/synapse/schemas.

我用了https://github.com/tianon/docker-postgres-upgrade进行 postgres 数据升级。

postgres我遇到了一个问题:在我的旧(版本 11)安装中没有角色(用户) 。我通过指定 pg_upgrade 脚本使用 rolesynapse并手动引导新(版本 15)数据库解决了这个问题,因为旧安装和新安装都必须具有相同的可用用户。

一步一步来,事情是这样的:

  1. 备份数据:cp -a schemas schemas-v11-backup
  2. docker-postgres-upgrade按照预期的方式创建文件夹结构:
mkdir -p upgradepg/10/data
mkdir -p upgradepg/15/data
  1. 将旧的 postgres 数据复制到“OLD”目录中: cp -a schemas/* upgradepg/10/data/
  2. 清理schemaspostgres 数据文件夹,以便我们可以使用 postgres 版本 15 数据文件初始化它:rm -rf schemas/*
  3. 将 postgres 版本更改docker-compose.yml为 15(-> 整行是image: docker.io/postgres:15-alpine),并使用 启动服务docker-compose up db。这将使用用户synapse和数据库引导数据库容器synapse
  4. pg_upgrade但是,将会迁移旧数据(=旧数据库),如果已经有一个名为 的数据库,则会失败synapse。我们必须删除数据库:
docker-compose exec db psql -U synapse
\c postgres
drop database synapse;
exit
  1. 停止正在运行的 postgres 15 容器(如果绑定到终端则按 ctrl+c,否则docker-compose stop db
  2. 将新引导的 postgres 15 数据目录复制到upgradepg/15/datacp schemas/* upgradepg/15/data/
  3. 运行迁移工具:docker run --rm -v /opt/synapse/upgradepg:/var/lib/postgresql tianon/postgres-upgrade:10-to-15 -U synapse(-U synapsepg_upgrade使用 user synapse)。终端中的输出应以以下内容结尾:
Upgrade Complete
----------------
Optimizer statistics are not transferred by pg_upgrade.
Once you start the new server, consider running:
    /usr/lib/postgresql/15/bin/vacuumdb -U synapse --all --analyze-in-stages
  1. 将迁移的数据复制回您的 synapse db 容器数据目录:cp -a upgradepg/15/data/* schemas/
  2. 由于某种原因,未设置用户密码synapse,导致synapse无法连接数据库。为了确保密码身份验证有效,请启动数据库容器,并设置synapse用户的密码:
docker-compose up db

(in another terminal, in /opt/synapse):

docker-compose exec db psql -U synapse
alter role synapse with password 'your_synapse_pw_from_docker-compose.yml';
exit

就是这样。为了进行清理,请删除upgradepg和 (在突触正常运行之后:),schemas-v11-backup

相关内容