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のままにすれば使用できます。

参考

    • BlueSkyで共有する
    • Hatenaで共有する
記事の作成者のW.Aのアイコン

この記事を書いた人

W.A
茨城県在住Webエンジニアです。 PHP、PostgreSQL、Linuxなどを業務で使用しています。 趣味ではGoやNuxt、Flutterをやってます。
  • GitHubのリンク

Comment

関連記事

  • DBバックアップをGASのAPI経由でGoogle Driveに保管するのサムネイル画像

    DBバックアップをGASのAPI経由でGoogle Driveに保管する

    掲載

    DBバックアップはサーバー内部に保存していると、サーバー自体に問題があった場合にバックアップが取得できず復旧が難しくなります。DBバックアップをpg_dumpコマンドを使ってシェルスクリプトで日次・月次に取得し、GAS(Google App Script)で作ったAPI経由で外部(Google Drive)に自動同期・保存することで個人サイトでもお金をかけずにバックアップを退避できる方法を解説しています。

  • PostgreSQLでシーケンス重複エラーの原因に立ち向かうのサムネイル画像

    PostgreSQLでシーケンス重複エラーの原因に立ち向かう

    掲載

    PostgreSQLで、シーケンス値の重複エラーが出た際の原因の一つを調査した備忘録です。頻繁に実行される処理でトランザクションを張ってsetvalを実行していたために不整合が生じたというレアケースですが、シーケンス値の重複の調査は大変なので誰かの調査のヒントになれば。

check コピーしました!