PostgreSQL17から18のバージョンアップ
- 掲載日
はじめに
業務でPostgreSQLを使用しています。バージョン18がリリースされたのでアップグレードしました。
その際18から追加の設定で詰まったのでその解決策の備忘録です。
前提
- Windows環境。
- 事前にPostgreSQLの18をダウンロードして任意の位置に展開してシステム環境変数が設定されていること。
- PostgreSQLのバージョン17を18にアップグレードする。
(16から18等バージョンが違うと別エラー出る可能性有。) - 各種バージョンのサービスは停止していること。
詰まったところと解決方法
チェックサムのエラー
X:XXXX>pg_upgrade ^
-U postgres ^
-d "E:\PostgreSQL\17/data" ^
-D "E:\PostgreSQL\18/data" ^
-b "E:\PostgreSQL\17/bin" ^
-B "E:\PostgreSQL\18/bin"
整合性チェックを実行しています。
-----------------------------
Checking cluster versions ok
旧クラスタではデータチェックサムを使用していませんが、新クラスタでは使用しています
失敗しました、終了しています※E:\PostgreSQL\の部分は環境に合わせて変更してください。
調査したところ、PostgreSQLのバージョン18からはチェックサムがデフォルトで有効になっているようです。
PostgreSQLのバージョン17まではデフォルトで無効になっているため、チェックサム無データをチェックサム有データとして扱おうとして失敗しているという感じだと思われます。
解決方法
リンク先の書き方だとpg_upgradeコマンド実行時に--no-data-checksumsオプションを付ければ良さそうでしたが、Windowsの場合該当オプションが無さそう(pg_upgrade --help を実行しても該当オプションが出てこず。英語が読めてないだけかもしれません。)でした。
よって、一旦18側のチェックサムを無効化します。
# ※※ 事前に18のサービスは停止しておく ※※
pg_checksums -D E:\PostgreSQL\18\data --disableこの状態で再度pg_upgradeします。以下のようにログが出力されればOKです。
X:XXXX>pg_upgrade.exe ^
More? -U postgres ^
More? -d "E:\PostgreSQL\17/data" ^
More? -D "E:\PostgreSQL\18/data" ^
More? -b "E:\PostgreSQL\17/bin" ^
More? -B "E:\PostgreSQL\18/bin"
整合性チェックを実行しています。
-----------------------------
Checking cluster versions ok
(省略。この間にok以外が出てたら要注意)
アップグレードが完了しました
----------------
統計情報の一部は pg_upgrade では転送されません。
新しいサーバーを起動した後、次の2つのコマンドの実行を検討してください。
(省略。vacuumdbしてね等色々出て来るので基本的にはアドバイスに従っておきましょう。)ライブラリ等の状態を合わせることも忘れずに。
またデータが重い場合vacuumdb -aしておく、重いDBは一旦バックアップ取って削除しておく等もやりましょう。(業務環境では200GBくらいのデータを扱っていたため、upgrade中にSSDが100%になり1敗)
最後に忘れずにchecksumを有効にします。
※ 重いデータがあると時間がかかると思うので注意。
pg_checksums -D E:\PostgreSQL\18\data --enableおまけ(pgroongaを使用している場合)
checksumをenableにしようとしたところ、自分の環境では以下のエラーが出ました。(自宅でライブラリ無環境では試したら通ったので、ライブラリ等入れてなければ基本的には大丈夫だと思います。)
pg_checksums: エラー: ファイル名"E:\PostgreSQL\18\data/base/XXXXXXX/pgrn.0000000"の不正なセグメント番号0自分はpgroongaという、高速で日本語全文検索ができるライブラリを使用しているので、data配下にpgrn.XXXというファイルが生成されます。
それがchecksumを有効にするときの処理で悪さをしている様子。
既にissueが作られていて、pgroonga側は把握してそうなので対応待ちです。
取り急ぎchecksumをdisabledのままにすれば使用できます。
参考

この記事を書いた人
- A.W.
- 茨城県在住Webエンジニアです。 PHPなどを業務で使用しています。 趣味ではGoやNuxt、Flutterをやってます。