注: 以下はChatGPT o1によって生成された文章です。 とりあえずうまくいきましたが、必ずバックアップを作成してから実行すること!

1. PostgreSQL 17 のインストール

PostgreSQL 17 のリポジトリとパッケージが公開されている場合、以下のように実行します:

sudo apt-get install postgresql-17

これでシステム上に PostgreSQL 17 のバイナリや、cluster のスクリプトなどがインストールされます。


2. 既存の PostgreSQL 15 の確認

PostgreSQL のデータベースクラスタ管理は postgresql-common が提供するコマンド pg_lsclusters で確認できます。

pg_lsclusters

通常、インストール直後は以下のようなクラスタが存在しているはずです:

  • 15 メインクラスタ: 15 main ...
  • 17 メインクラスタ: 17 main ...

※ PostgreSQL 17 インストール時に、自動的に空の 17/main クラスタが作成される場合があります。


3. 新規クラスタを削除 (空の17クラスタを作り直す場合)

PostgreSQL 17 インストール時に自動生成された「空」の 17/main クラスタが不要であれば、pg_upgradecluster 実行前に削除しておきます。

sudo pg_dropcluster 17 main --stop

クラスタを削除すると、同名クラスタでの pg_upgradecluster が可能になります。


4. データのアップグレード(pg_upgradecluster を使用)

Ubuntu/Debian 系で提供されている pg_upgradecluster コマンドを使うと、自動的に

  • 旧バージョンのデータディレクトリ → 新バージョンのデータディレクトリへのマイグレーション
  • 設定ファイルのコピー
  • ポート設定やサービス設定の反映

などを行ってくれます。以下のコマンドを実行してください。

sudo pg_upgradecluster 15 main

このコマンドは下記を自動的に実行します。

  1. 既存の 15/main クラスタを読み込み
  2. 新しい 17/main クラスタ用のデータディレクトリを初期化
  3. PostgreSQL 15 と 17 のバイナリを使い分けながら pg_upgrade を実行
  4. 15/main の設定ファイルなどを 17/main にコピー
  5. 必要に応じて、元の 15/main を停止し、17/main を起動

処理が完了したらエラーがないかを確認してください。エラーが無ければ、アップグレードは成功です。


5. 動作確認

アップグレードが完了したら、 PostgreSQL 17 のクラスタが起動しているかを確認します。

pg_lsclusters

17 main ... online のようになっていれば OK です。
次にデータベースに接続できるかを確認します。

sudo -u postgres psql

正しくログインでき、テーブルやスキーマなどが期待通りに移行されているか確認してください。


6. 古いバージョン(15) のクラスタ削除(不要であれば)

アップグレード後に問題が無ければ、古いデータディレクトリは削除しても構いません。pg_upgradecluster は既存のクラスタを削除しませんが、不要であれば下記コマンドで削除が可能です。

sudo pg_dropcluster 15 main --stop

さらにパッケージとしても PostgreSQL 15 が不要であれば削除可能ですが、他に依存がある場合は削除前にご注意ください。

sudo apt-get remove postgresql-15

7. トラブルシューティング

  • ポートの競合: 15 と 17 が同時に起動できない場合、設定ファイルに定義されたポート番号が重複している可能性があります。/etc/postgresql/<バージョン>/main/postgresql.conf を確認してみてください。
  • 拡張機能/モジュール: 特定の拡張機能(例: PostGIS 等)を使用している場合、PostgreSQL 17 向けに該当拡張が対応しているか確認が必要です。
  • 十分なストレージ容量: pg_upgrade は一時ファイルやリンクを作成するため、アップグレード前に空き領域が十分あるか確認してください。

まとめ

  1. PostgreSQL 17 をインストール
  2. 自動生成された空のクラスタを必要に応じて削除
  3. pg_upgradecluster 15 main を実行
  4. 動作確認
  5. 問題なければ古いクラスタや不要パッケージを削除

上記のステップで、PostgreSQL 15 から PostgreSQL 17 へのアップグレードをデータを保持したままスムーズに行うことができます。必ず 事前にバックアップ を取った上で実施することを強くおすすめします。