PostgreSQL17から18のバージョンアップ
- 掲載日
- 更新日
はじめに
自分は普段の業務で、データベースでは主にPostgreSQLを使用しています。今回、バージョン18がリリースされたのでアップグレードを行いました。
その際、PostgreSQL 18の仕様変更(デフォルト設定の変更)が原因で実行時に整合性チェックでエラーを吐いてしまい、小一時間ほど頭を抱えることになりました。
Windows環境で必要な処置とを備忘録としてまとめています。
前提
- Windows環境。
- 事前にPostgreSQLの18をダウンロードして任意の位置に展開してシステム環境変数が設定されていること。
- PostgreSQLのバージョン17を18にアップグレードする。
(16から18等バージョンが違うと別エラー出る可能性有。) - 各種バージョンのサービスは停止していること。
詰まったところと解決方法
チェックサムのエラー
まず、以下の通りpg_upgradeコマンドを実行します。
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" ※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です。
※ この時、整合性チェックでOK以外が出ていたらまた別のエラーが発生している可能性がありますので要注意。
ライブラリ等の状態を合わせることも忘れずに。
またデータが重い場合vacuumdb -aしておく、重いDBは一旦バックアップ取って削除しておく等、容量がひっ迫しないよう注意してください。
(業務環境では200GBくらいのデータを扱っていたため、upgrade中にSSDが100%になり1敗)
また、最後の省略部分で「vacuumdbしてね」等色々メッセージが出て来ることがあるので、基本的にはアドバイスに従ってコマンドを実行しておきましょう。
最後に忘れずに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のままにすれば使用できます。


