Macで複数のバージョンのpostgresqlをインストールして使う
最近のプログラミング言語は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