
brewでインストールしたPostgresqlがdyld Library not loadedで起動できないエラーに遭遇 -> 結局クリーンインストールで解決
brew周りのライブラリをupgradeしたりdowngradeしたりしていて、ふと最新のrails(6.0.2.2)を起動しようとしたら、
could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
というエラーが発生しました。
ん?いつもの「postgres connections on Unix domain socket "/tmp/.s.PGSQL.5432"?」じゃない??と思いつつ、一通りキャッシュを消したりbrew services restart postgresなど試したのですがうまくいかず。
あれー?という状態になり、postgresのログを確認(postgres -D /usr/local/var/postgres
)してみると、
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.66.dylib
Referenced from: /usr/local/bin/postgres
Reason: image not found
調べてみると、dyld(Dynamic Loader)というライブラリをPostgresが利用していて、それが何らかの理由でインストールされているicu4cのバージョンがずれるとこういう症状(参照できなくなっている)らしい。
というわけで、今参照しようとしている(Library not loaded)といわれてるicu4cのディレクトリを確認してみる。
$ ls /usr/local/opt/icu4c/lib/
icu libicui18n.a libicutest.64.dylib libicuuc.64.2.dylib
libicudata.64.2.dylib libicui18n.dylib libicutest.a libicuuc.64.dylib
libicudata.64.dylib libicuio.64.2.dylib libicutest.dylib libicuuc.a
libicudata.a libicuio.64.dylib libicutu.64.2.dylib libicuuc.dylib
libicudata.dylib libicuio.a libicutu.64.dylib pkgconfig
libicui18n.64.2.dylib libicuio.dylib libicutu.a
libicui18n.64.dylib libicutest.64.2.dylib libicutu.dylib
自分の場合はPostgresが使いたいバージョンが66(Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.66.dylib)で、現在のicu4cが64なので、icu4cのバージョンが追いついていない感じ。
brewで現在インストールされているicu4cのバージョンを調べます。
$ brew info icu4c
icu4c: stable 66.1 (bottled) [keg-only]
C/C++ and Java libraries for Unicode and globalization
http://site.icu-project.org/home
/usr/local/Cellar/icu4c/64.2 (257 files, 69.2MB)
Poured from bottle on 2020-04-27 at 10:49:07
/usr/local/Cellar/icu4c/66.1 (258 files, 70.3MB)
Poured from bottle on 2020-04-27 at 09:29:53
ん?あれ?66あるっぽくない? ちょっと64と66をswitchしてみる。
$ brew switch icu4c 64.2
Cleaning /usr/local/Cellar/icu4c/64.2
Cleaning /usr/local/Cellar/icu4c/66.1
Opt link created for /usr/local/Cellar/icu4c/64.2
$ brew switch icu4c 66.1
Cleaning /usr/local/Cellar/icu4c/64.2
Cleaning /usr/local/Cellar/icu4c/66.1
Opt link created for /usr/local/Cellar/icu4c/66.1
というわけでrails sしてみますが同じエラー。postgresのログを確認してみる。
$ postgres -D /usr/local/var/postgres
postgres: could not access the server configuration file "/usr/local/var/postgres/postgresql.conf":
No such file or directory
confファイルが無いと怒られるので、ひとまずtouchして、更にエラーを見てみる。
$ touch /usr/local/var/postgres/postgresql.conf
$ postgres -D /usr/local/var/postgres
2020-04-28 01:10:33.352 GMT [58517] LOG: skipping missing configuration file "/usr/local/var/postgres/postgresql.auto.conf"
2020-04-28 01:10:33.352 GMT [58517] FATAL: data directory "/usr/local/var/postgres" has invalid permissions
2020-04-28 01:10:33.352 GMT [58517] DETAIL: Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).
今度はディレクトリのパーミッションがおかしいと怒られるので、パーミッションを変更します。
$ sudo chmod 700 /usr/local/var/postgres
$ postgres -D /usr/local/var/postgres
2020-04-28 01:14:18.973 GMT [60408] LOG: skipping missing configuration file "/usr/local/var/postgres/postgresql.auto.conf"
2020-04-28 01:14:18.974 GMT [60408] FATAL: "/usr/local/var/postgres" is not a valid data directory
2020-04-28 01:14:18.974 GMT [60408] DETAIL: File "/usr/local/var/postgres/PG_VERSION" is missing.
なかなかゴールさせてくれません😇
……ここまでやってきましたが、ここまで行き着くのに既に2-3時間かかっており、早く開発したい案件があるので、クリーンインストールしたほうが早いのでは?という結論に達しました。
$ brew uninstall postgres
$ rm -rf /usr/local/var/postgres
$ brew install postgres
$ brew service restart postgres
これで無事起動しました😭 開発環境なので、こういうトラブルはサクっと初期化した方が早いですね。