Debian 10 使用 pg_upgrade 跨大版本从 Postgresql 11 升级到了 Postgresql 14,一周过去并未发现有任何使用异常。
♥ 感谢升级前与升级过程中 dudu 与 黛黛的帮助! ♥
升级前准备
建议在进行下面的步骤前先对数据库进行备份。
检查当前系统中 postgresql 版本与程序
sudo su - postgres # 切换到 postgres 用户
psql -V # 会显示 psql 版本和 server 版本
dpkg -l | grep postgres # 查看系统上有哪些 Postgresql 程序
重点看后面带数字的有哪些,比方说有 postgresql-11
、postgresql-client-11
、postgresql-server-dev-11
、postgresql-11-rum
这些,需要下载安装您要升级到的版本的 Postgresql。
安装 Postgresql 14
从 postgres 切换回 sudo 用户。
-
从 https://www.postgresql.org/media/keys/ACCC4CF8.asc 导入数据库密钥
sudo apt install curl ca-certificates gnupg curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/apt.postgresql.org.gpg >/dev/null
``
-
创建 /etc/apt/sources.list.d/pgdg.list ,将 buster 替换为实际使用的发行版。Debian 9 - stretch, 10 - buster, 11 - bullseye, 12 - bookworm, unstable - sid,仍不确定的话用
lsb_release -c
查询。deb http://apt.postgresql.org/pub/repos/apt buster-pgdg main sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
``
-
更新并下载指定版本 Postgresql
sudo apt update sudo apt install postgresql-14
``
再次检查(如果有额外安装拓展的话)并重新编译
确保系统中有 postgresql-14
、postgresql-client-14
、postgresql-server-dev-14
,因为我之前还使用 rum,所以还需要额外安装 postgresql-14-rum
。
我之前为了让 Pleroma 支持中文搜索,安装过 pg_jieba 和 pg_cjk_parser,因为主要用后者所以最后是把 jieba 删掉了(似乎得在安装新版本 Postgresql 前删除),如果需要保留某些拓展,需要进入编译文件所在目录进行重新编译。
pg_jieba:
cmake -DCMAKE_PREFIX_PATH=/PATH/TO/PGSQL_INSTALL_DIR ..
pg_cjk_parser:
make clean && make install
关闭正在使用 Postgresql 的服务并关闭 Postgresql 进行测试
比方说我这边运行的服务有 Pleroma 和 Funkwhale,先把这两个关掉。
# sudo systemcyl stop pleroma
# sudo systemctl stop funkwhale.target
之后关掉 Postgresql。
sudo systemctl stop postgresql
切换到 postgres 用户。
sudo su - postgres
检查 pg_upgrade 是否可以正常运行。
/usr/lib/postgresql/14/bin/pg_upgrade --check \
-b /usr/lib/postgresql/11/bin \
-B /usr/lib/postgresql/14/bin \
-d /var/lib/postgresql/11/main \
-D /var/lib/postgresql/14/main \
-o '-c config_file=/etc/postgresql/11/main/postgresql.conf' \
-O '-c config_file=/etc/postgresql/14/main/postgresql.conf'
如果没有报错、所有的 checking 都过了,就可以正式进行升级了。如果出现报错,终端会给出提示,根据提示一个个纠错。可能有 postgresql 没有关闭、没有重新编译、缺少某些 package 等原因。
升级 Postgresql
- 移动到 tmp 目录
cd /tmp
- 升级(确保先前的 check 成功了再正式升级)
/usr/lib/postgresql/14/bin/pg_upgrade \
-b /usr/lib/postgresql/11/bin \
-B /usr/lib/postgresql/14/bin \
-d /var/lib/postgresql/11/main \
-D /var/lib/postgresql/14/main \
-o '-c config_file=/etc/postgresql/11/main/postgresql.conf' \
-O '-c config_file=/etc/postgresql/14/main/postgresql.conf'
成功的话应该会出现以下提示:
ptimizer statistics are not transferred by pg_upgrade. Once you start the new server, consider running: /usr/lib/postgresql/14/bin/vacuumdb --all --analyze-in-stages Running this script will delete the old cluster's data files: ./delete_old_cluster.sh
- 修改端口
新安装的 Postgresql 默认端口会变成 5433,我们把它的端口改回 5432,并把旧 Postgresql 端口改为 5433
sudo su - <user>
# 切换回之前的用户
sudo nano /etc/postgresql/14/main/postgresql.conf
# Ctrl + W 输入 "port = 5433" 跳转到端口位置,修改为 5422
# 如果有需要可以一并修改其他配置对 postgresql 进行优化
sudo nano /etc/postgresql/11/main/postgresql.conf
# Ctrl + W 输入 "port = 5432" 跳转到端口位置,修改为 5423
- 重新开启 Postgresql 和其他服务
sudo systemctl start postgresql
# sudo systemctl start pleroma
# sudo systemctl start funkwhale.target
- 快速生成统计信息以便 postgresql 可以正确计划查询
sudo su - postgres
/usr/lib/postgresql/14/bin/vacuumdb --all --analyze-in-stages
- 检查最新版本 Postgresql
psql -c "SELECT version();"
跟我一样服务器上有 Pleroma 的话此时可能发现实例打不开,检查 /var/log/postgresql 下的日志,发现如下报错:
password authentication failed for user “pleroma” User “pleroma” does not have a valid SCRAM secret.
将 /etc/pleroma 下的 config 文件中的密码复制下来,进入 pleroma 数据库,手动改回密码:
Alter USER pleroma WITH PASSWORD '<password>';
实例就可以正常启动了~
- 确定服务都可正常运行后,彻底删除旧版本的 Postgresql
apt list --installed | grep postgresql
# sudo apt remove postgresql-11 postgresql-client-11
# sudo rm -rf /etc/postgresql/11
# sudo rm -rf /var/lib/postgresql/11
cd /tmp
./delete_old_cluster.sh
可定期执行的数据库维护指令
VACUUM ANALYSE VERBOSE;
# 同時執行 VACUUM 和 ANALYZE, VERBOSE 显示处理信息
REINDEX DATABASE CONCURRENTLY <DATABASE_NAME>;
# DATABASE 可替換爲表格、索引等