我的服务器上有一个虚拟机,我在其中托管 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/synapse
postgres 容器定义如下:
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)数据库解决了这个问题,因为旧安装和新安装都必须具有相同的可用用户。
一步一步来,事情是这样的:
- 备份数据:
cp -a schemas schemas-v11-backup
docker-postgres-upgrade
按照预期的方式创建文件夹结构:
mkdir -p upgradepg/10/data
mkdir -p upgradepg/15/data
- 将旧的 postgres 数据复制到“OLD”目录中:
cp -a schemas/* upgradepg/10/data/
- 清理
schemas
postgres 数据文件夹,以便我们可以使用 postgres 版本 15 数据文件初始化它:rm -rf schemas/*
- 将 postgres 版本更改
docker-compose.yml
为 15(-> 整行是image: docker.io/postgres:15-alpine
),并使用 启动服务docker-compose up db
。这将使用用户synapse
和数据库引导数据库容器synapse
。 pg_upgrade
但是,将会迁移旧数据(=旧数据库),如果已经有一个名为 的数据库,则会失败synapse
。我们必须删除数据库:
docker-compose exec db psql -U synapse
\c postgres
drop database synapse;
exit
- 停止正在运行的 postgres 15 容器(如果绑定到终端则按 ctrl+c,否则
docker-compose stop db
) - 将新引导的 postgres 15 数据目录复制到
upgradepg/15/data
:cp schemas/* upgradepg/15/data/
- 运行迁移工具:
docker run --rm -v /opt/synapse/upgradepg:/var/lib/postgresql tianon/postgres-upgrade:10-to-15 -U synapse
(-U synapsepg_upgrade
使用 usersynapse
)。终端中的输出应以以下内容结尾:
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
- 将迁移的数据复制回您的 synapse db 容器数据目录:
cp -a upgradepg/15/data/* schemas/
- 由于某种原因,未设置用户密码
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
。