Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般

Mac: HomebrewでインストールしたPostgreSQLをアップグレードする

MacbookのHomebrewでインストールしたPostgreSQL 14とそのデータをPostgreSQL 16にアップグレードしたときのメモです。

参考: Upgrading from PostgreSQL 14 to 15 installed with Homebrew, on an Apple Silicon Mac – Ian's notes

$ brew services list
Name          Status  User      File
mysql         none
php           none
postgresql@16 started hachi8833 ~/Library/LaunchAgents/homebrew.mxcl.postgresql@16.plist
redis         none
unbound       none

要点

いずれも当たり前のことですが。

  • 当然ながら、14から16にいきなりアップグレードせず、14->15、15->16と順にアップグレードし、その都度動作確認すること
  • 近年はpg_upgradeを使ってアップグレードできる
    • 新しいバージョンにある方のpg_upgradeを使うこと
    • which pg_upgradeで表示されるパス↓を使うとバージョンを指定できないので、このパスをアップグレード作業で使うのは避けています)
$ which pg_upgrade
/opt/homebrew/opt/libpq/bin/pg_upgrade
$ pg_upgrade --version
pg_upgrade (PostgreSQL) 16.0
  • pg_upgradeに渡すパス情報は、brew infoで確認できる
    • brew info postgresql@16のように指定し、結果に含まれるbin/ディレクトリのパスを取り出して使う(以下の場合/opt/homebrew/opt/postgresql@16/bin/
$ postgresql@16: stable 16.1 (bottled) [keg-only]
Object-relational database system
https://www.postgresql.org/
/opt/homebrew/Cellar/postgresql@16/16.0_1 (3,778 files, 68.0MB)
  Poured from bottle using the formulae.brew.sh API on 2023-11-03 at 12:58:06
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/p/postgresql@16.rb
License: PostgreSQL
==> Dependencies
Build: pkg-config ✔
Required: gettext ✔, icu4c ✔, krb5 ✔, lz4 ✔, openssl@3 ✔, readline ✔
==> Caveats
This formula has created a default database cluster with:
  initdb --locale=C -E UTF-8 /opt/homebrew/var/postgresql@16
For more details, read:
  https://www.postgresql.org/docs/16/app-initdb.html

postgresql@16 is keg-only, which means it was not symlinked into /opt/homebrew,
because this is an alternate version of another formula.

To restart postgresql@16 after an upgrade:
  brew services restart postgresql@16
Or, if you don't want/need a background service you can just run:
  LC_ALL="C" /opt/homebrew/opt/postgresql@16/bin/postgres -D /opt/homebrew/var/postgresql@16
==> Analytics
install: 4,105 (30 days), 7,415 (90 days), 7,416 (365 days)
install-on-request: 4,105 (30 days), 7,399 (90 days), 7,398 (365 days)
build-error: 1 (30 days)

pg_upgradeの実行例

注意: 以下は現時点の私のHomebrew(4.1.20)における環境なので、そのままコピペしても動くとは限りません。必ずhomebrew infoで確かめた絶対パスで以下の4つのパスを置き換えること。

# PostgreSQL 14->15の場合
$ /opt/homebrew/Cellar/postgresql\@15/15.4_1/bin/pg_upgrade -b /opt/homebrew/Cellar/postgresql\@14/14.9_1/bin -d /opt/homebrew/var/postgresql\@14 -B /opt/homebrew/Cellar/postgresql\@15/15.4_1/bin -D /opt/homebrew/var/postgresql\@15

ちょっと見やすく整理。

$ /opt/homebrew/Cellar/postgresql\@15/15.4_1/bin/pg_upgrade \
  -b /opt/homebrew/Cellar/postgresql\@14/14.9_1/bin \
  -d /opt/homebrew/var/postgresql\@14 \
  -B /opt/homebrew/Cellar/postgresql\@15/15.4_1/bin \
  -D /opt/homebrew/var/postgresql\@15
  • -b: アップグレード前のbinディレクトリ
  • -d: アップグレード前のデータディレクトリ
  • -B: アップグレード後のbinディレクトリ
  • -D: アップグレード後のデータディレクトリ

ちなみにPostgreSQL 15->16の場合は、以下のようにPostgreSQL 16のbin/ディレクトリのパスが従来と微妙に変わっていました。

# PostgreSQL 15->16の場合
$ /opt/homebrew/opt/postgresql@16/bin/pg_upgrade \
  -b /opt/homebrew/Cellar/postgresql\@15/15.4_1//bin \
  -d /opt/homebrew/var/postgresql\@15 \
  -B /opt/homebrew/opt/postgresql@16/bin \
  -D /opt/homebrew/opt/postgresql@16

こうしてPostgreSQL 14->16の二段階アップグレードが終わったら、PostgreSQL 16の動作確認を終えてから(できれば数日おくとよい)、brew uninstall postgresql@14brew uninstall postgresql@15を実行して、古いバージョンを削除します。

関連記事

brew upgrade でのエラー対処からCommand Line Toolsについてまとめてみる

M1 MacでRuby 2.4〜3.2をrbenvでビルドする最小限のセットアップを全部調べた


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。