お茶漬けぶろぐ

postgresqlのメジャーバージョンを17から18にupgradeする

いつも通りだ〜と思ってやっていたら事故ったのでメモ。

$ sudo systemctl stop postgresql
$ sudo mv /var/lib/postgres/{data, olddata}
$ sudo mkdir /var/lib/postgres/{data, tmp}
$ sudo chown postgres:postgres /var/lib/postgres/{data, tmp}
〜ここからはpostgresユーザで作業〜
$ sudo su postgres
$ initdb --locale $LANG -E UTF8 -D '/var/lib/postgres/data'$ pg_upgrade -b /opt/pgsql-17/bin -B /usr/bin -d /var/lib/postgres/olddata -D /var/lib/postgres/data
Performing Consistency Checks
-----------------------------
Checking cluster versions                                     ok

old cluster does not use data checksums but the new one does
Failure, exiting

そもそも

postgresqlにはチェックサム機能がある。データページにチェックサムが含まれるようになって、書き込み時に更新され、読み取る時に検証されるらしい。
で、v17とv18でマニュアルの記載が変わっている。

v17 ( https://www.postgresql.org/docs/17/checksums.html )

By default, data pages are not protected by checksums, but this can optionally be enabled for a cluster.

v18 ( https://www.postgresql.org/docs/18/checksums.html )

By default, data pages are protected by checksums, but this can optionally be disabled for a cluster.

v17ではデフォルトで無効だったのが、v18からはデフォルトで有効だそうだ。

どうにかする

https://www.postgresql.org/about/press/presskit18

Databases initialized with PostgreSQL 18 initdb now have page checksums enabled by default. This can affect upgrades from non-checksum enabled clusters, which would require you to create a new PostgreSQL 18 cluster with the --no-data-checksums option when using pg_upgrade.

pg_upgradeに–no-data-checksumsオプションがあるので、それを使いなさいということみたい。しかしそんなオプションは存在しない。unrecognized option ‘–no-data-checksums’だそうだ。なんで。
ちなみに使っているのは以下。

$ pacman -Qo `which pg_upgrade`
/usr/bin/pg_upgrade is owned by postgresl 18.1-2

ふむ。

一旦無効化作戦

調べていると、チェックサム機能を一旦無効化して、pg_upgradeを実施し、後でチェックサム機能を再有効化しようという情報を見かけた。
https://bbs.archlinux.org/viewtopic.php?id=309977

というわけでそのようにする。pg_checksumsコマンドを使えば良い。

$ sudo su postgres
$ pg_checksums --disable -D /var/lib/postgres/data
pg_checksums: syncing data directory
pg_checksums: updating control file
Checksums disabled in cluster

$ pg_upgrade -b /opt/pgsql-17/bin -B /usr/bin -d /var/lib/postgres/olddata -D /var/lib/postgres/data
略(今度は成功)

$ pg_checksums --enable -D /var/lib/postgres/data
Checksum operation completed
Files scanned:   2041
Blocks scanned:  18633
Files written:  722
Blocks written: 15011
pg_checksums: syncing data directory
pg_checksums: updating control file
Checksums enabled in cluster

あとは普通に起動できる。pg_upgradeの出力で、vacuumdbしろとあったのでやっておく。

$ sudo systemctl start postgresql
$ /usr/bin/vacuumdb --all --analyze-in-stages --missing-stats-only
$ /usr/bin/vacuumdb --all --analyze-only

おわり

無事。
Nextcloud用postgresqlが壊れてしまったのが発端だったが、なんとかなって良かったね。うんうん。

NextcloudでCannot write into "config" directory >