お茶漬けぶろぐ

postgresqlのメジャーバージョンを上げる

Nextcloud を入れているサーバでシステムアップデートしたら、HTTP で答えてくれるマンたる apache が何を聞いても 500 を返すようになってしまった。ログを一通り見たが原因がわからず。なんだ〜?と思っていたら、DB が動いてないのでは?というページを見かけた。んで、DB として使っている postgresql のログを見ると、確かにダメそう。というわけでその対処。

状況

apache の応答は常にこれ。

Internal Server Error

The server encountered an internal error and was unable to complete your request.
Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report.
More details can be found in the server log.

access_log を見ると、500 返したよ!しか言わず、なんで〜という感じだった。ログレベル変えたらどこかに出たりしたのかな…。

postgresql のログはこんな。

Dec 28 01:14:59 nextcloud systemd[1]: Failed to start PostgreSQL database server.
░░ Subject: A start job for unit postgresql.service has failed
░░ Defined-By: systemd
░░ Support: https://lists.freedesktop.org/mailman/listinfo/systemd-devel
░░
░░ A start job for unit postgresql.service has finished with a failure.
░░
░░ The job identifier is 374 and the job result is failed.
Dec 28 01:14:59 nextcloud postgres[421]: An old version of the database format was found.
Dec 28 01:14:59 nextcloud postgres[421]: See https://wiki.archlinux.org/index.php/PostgreSQL#Upgrading_PostgreSQL

バージョンを確認すると以下。

# cat /var/lib/postgres/data/PG_VERSION
15
$ pacman -S postgresql
local/php-pgsql 8.2.13-2
    PostgreSQL modules for PHP
local/postgresql 16.1-2
    Sophisticated object-relational DBMS
local/postgresql-libs 16.1-2
    Libraries for use with PostgresSQL

作業

ちゅーわけで、ArchWiki の言う通りにアップグレード作業を行う。

メジャーバージョンが異なると、データファイルに互換性がなかったりするみたい。なので、15 向けデータを読み取れるよう、15 環境が必要。というわけでそれ用パッケージをインストール。(こいつは常に最新バージョンの直前バージョンらしい)

# pacman -S postgresql-old-upgrade

あとは、現行の postgresql を止めて(いやそもそも起動してないけど)、データディレクトリを移動(バージョンが違っても同じパスで作ろうとするので)、16 を使って initdb して、そこにデータを流し込むツールを使う。

# systemctl stop postgresql
# mv /var/lib/postgres/{data, olddata}
# mkdir /var/lib/postgres/{data, tmp}
# chown postgres:postgres /var/lib/postgres{data, tmp}
# su postgres
$ initdb --locale $LANG -E UTF8 -D '/var/lib/postgres/data'
略
$ cd /var/lib/postgres/tmp
$ pg_upgrade -b /opt/pgsql-15/bin -B /usr/bin -d /var/lib/postgres/olddata -D /var/lib/postgres/data
略
$ /usr/bin/vacuumdb --all --analyze-in-stages
$ exit
# systemctl start postgresql

作業が完了したらごみ掃除して終わり。

# rm -rf /var/lib/postgres/olddata
# rm -rf /var/lib/postgres/tmp

おわり

正直、メジャーバージョンが変わるからって自動で upgrade してくれないのは、結構不親切だよな感がある…けど、まぁ楽ちんに使う観点しか自分が見てないだけなのかな。知らん事情があるんだろうな…

< proxmoxのVMのストレージがパンパンになったので広げよう

最近の登山 >