最近のプログラミング言語はrbenvやanyenvなど複数のバージョンを共存して使うためのツールが用意されてる事が多いですが、PostgreSQLなどのデータベース環境にはまだデファクトスタンダードのものがないようです。Dockerを使えばいいのかもしれませんが、MacOSでは非常に遅くできるだけ避けたいのでHomebrewでサードパーティのフォーミュラを使った方法を紹介します。
インストール方法
まず標準のpostgresqlを既にインストールしていたらアンインストールしましょう。
$ brew list | grep postgresql
postgresql
$ brew uninstall postgresql
...
$ brew list | grep postgresql
$
フォーミュラを追加して使いたいバージョンをインストールします
$ brew tap petere/postgresql
$ brew install petere/postgresql/postgresql@12
$ brew install petere/postgresql/postgresql@13
古いバージョンであればpetere/postgresql/postgresql@13ではなくpostgresql@13だけでもインストールできますが、最新版だった場合は同じバージョンがhomebrew/coreにも存在するため、そちらがインストールされてしまいます。
postgresql-common
複数の postgresql を扱う方法は色々あるようですが、postgresql-common を使います。
$ brew instal postgresql-commmon
postgresql-common が用意してくれてるラッパースクリプトのpg_createclusterを使いデータベースクラスターを作ります。
$ pg_createcluster 12 main
正常に作れていればpg_lsclustersで確認できます。
❯ pg_lsclusters
Ver Cluster Port Status Owner Data directory Log file
12 main 5432 online ironsand /usr/local/var/lib/postgresql/12/main /usr/local/var/log/postgresql/postgresql-12-main.log
DBの操作は pg_ctlの代わりにpg_ctlcluster を使い行います。
pg_ctlcluster 12 main start
これで特定のバージョンの Postgresql の起動が行えました。
Symbol not found に対処
私の環境では上記の方法ではrails consoleを行った時に以下のようにエラーになってしまいました。
dyld: lazy symbol binding failed: Symbol not found: _PQresultMemorySize
Referenced from: /Users/ironsand/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/pg-1.2.3/lib/pg_ext.bundle
Expected in: /usr/lib/libpq.5.dylib
dyld: Symbol not found: _PQresultMemorySize
Referenced from: /Users/ironsand/.rbenv/versions/2.6.5/lib/ruby/gems/2.6.0/gems/pg-1.2.3/lib/pg_ext.bundle
Expected in: /usr/lib/libpq.5.dylib
gemの参照関係がおかしくなっているようなのでpgを再インストールして対処しましょう。
gem uninstall pg
gem install pg