いつも通りだ〜と思ってやっていたら事故ったのでメモ。
$ 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
initdbnow 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-checksumsoption when usingpg_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が壊れてしまったのが発端だったが、なんとかなって良かったね。うんうん。