Debian 10 使用 pg_upgrade 跨大版本从 Postgresql 11 升级到了 Postgresql 14,一周过去并未发现有任何使用异常。

♥ 感谢升级前与升级过程中 dudu 与 黛黛的帮助! ♥

升级前准备

建议在进行下面的步骤前先对数据库进行备份。

检查当前系统中 postgresql 版本与程序

sudo su - postgres       # 切换到 postgres 用户
psql -V                  # 会显示 psql 版本和 server 版本
dpkg -l | grep postgres  # 查看系统上有哪些 Postgresql 程序

重点看后面带数字的有哪些,比方说有 postgresql-11postgresql-client-11postgresql-server-dev-11postgresql-11-rum 这些,需要下载安装您要升级到的版本的 Postgresql。

安装 Postgresql 14

从 postgres 切换回 sudo 用户。

  1. 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
    

    ``

  2. 创建 /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'
    

    ``

  3. 更新并下载指定版本 Postgresql

    sudo apt update
    sudo apt install postgresql-14
    

    ``

再次检查(如果有额外安装拓展的话)并重新编译

确保系统中有 postgresql-14postgresql-client-14postgresql-server-dev-14,因为我之前还使用 rum,所以还需要额外安装 postgresql-14-rum

我之前为了让 Pleroma 支持中文搜索,安装过 pg_jiebapg_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

  1. 移动到 tmp 目录
cd /tmp
  1. 升级(确保先前的 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
  1. 修改端口

新安装的 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
  1. 重新开启 Postgresql 和其他服务
sudo systemctl start postgresql
# sudo systemctl start pleroma
# sudo systemctl start funkwhale.target   
  1. 快速生成统计信息以便 postgresql 可以正确计划查询
sudo su - postgres
/usr/lib/postgresql/14/bin/vacuumdb --all --analyze-in-stages
  1. 检查最新版本 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>';

实例就可以正常启动了~

  1. 确定服务都可正常运行后,彻底删除旧版本的 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 可替換爲表格、索引等

参考链接

  1. How to Upgrade PostgreSQL 10 Cluster to 12 in Ubuntu 20.04
  2. Linux downloads (Debian)
  3. How To Completely Uninstall PostgreSQL
  4. 25.2. 定期重建索引
  5. PostgreSQL10基础(6)Analyze和Vacuum
  6. PostgreSQL VACUUM and ANALYZE Best Practice Tips