TL;DR
If you are using brew
to manage your postgresql/postgis install, and you suddenly cannot access any postgis functionality, with the error that rtpostgis-2.0.so
cannot be found, check your json-c
version, I had to do
brew switch json-c 0.10
to get it working.
The long and dirty story
I had created a new database, but for some reason I could not add a geometry column, so I was thinking, maybe, somehow my POSTGIS
extension needs to be (re)activated. And when I tried this I got the the obscure error
could not load library "/usr/local/Cellar/postgresql/9.2.3/lib/rtpostgis-2.0.so": dlopen(/usr/local/Cellar/postgresql/9.2.3/lib/rtpostgis-2.0.so, 10): Library not loaded: /usr/local/opt/sqlite/lib/libsqlite3.0.8.6.dylib Referenced from: /usr/local/lib/libgdal.1.dylib
Whaaaaaattttt????
Maybe my postgis installation is somehow corrupt, so I tried brew install postgis
. Wronggggg move. Suddenly I am installing postgresql 9.3.4
too?
Ok. I did not see an alternative. This of course ment I should upgrade my database. First step: install postgresql 9.3.4 and postgis. Then I tried to follow this upgrade procedure. In short I issued the following commands:
initdb /usr/local/var/postgres9.3 -E utf8
pg_upgrade -d /usr/local/var/postgres -D /usr/local/var/postgres9.3 -b /usr/local/Cellar/postgresql/9.2.3/bin/ -B /usr/local/Cellar/postgresql/9.3.4/bin/ -v
and that failed? I got almost the same error, but now a bit more verbose:
PG::UndefinedFile: ERROR: could not load library "/usr/local/Cellar/postgresql/9.2.3/lib/postgis-2.0.so":
dlopen(/usr/local/Cellar/postgresql/9.2.4/lib/postgis-2.0.so, 10): Symbol not found: _json_tokener_errors
Referenced from: /usr/local/Cellar/postgresql/9.2.4/lib/postgis-2.0.so
Expected in: /usr/local/lib/libjson.0.dylib
in /usr/local/Cellar/postgresql/9.2.4/lib/postgis-2.0.so
What? Json? And that led me to the answer: I had to switch my json-c
version:
brew switch json-c 0.10
Restarted my pg_upgrade
which now seemed to work, but failed at the end, that postgis-2.0.so
and rtpostgis-2.0.so
were not loadable. Sigh. These were of course compiled against the new json-c
(I think?).
I switched the json-c
version back to 0.11 and then I started my postgres process again. This showed my that my databases were NOT upgraded.
This almost feels like dll hell al over again.
Should I uninstall postgis, do db_upgrade
and install it again? Go back to 9.2.3?
For the moment I switched back to 9.2.3 and opened an issue on the homebrew. I hope somebody can help me.
brew switch postgresql 9.2.3
brew switch json-c 0.10
Not sure what will break, because something needed to install json-c 0.11
? At least for now I am good. I hope.
[UPDATE] Nope. It only partly works now. The errors I saw were:
after brew switch json-c 0.10
:
PG::UndefinedFile: ERROR: could not load library "/usr/local/Cellar/postgresql/9.2.3/lib/rtpostgis-2.0.so": dlopen(/usr/local/Cellar/postgresql/9.2.3/lib/rtpostgis-2.0.so, 10): Library not loaded: /usr/local/lib/libjson-c.2.dylib Referenced from: /usr/local/opt/liblwgeom/lib/liblwgeom-2.1.1.dylib Reason: image not found
after brew switch json-c 0.11
PG::UndefinedFile: ERROR: could not load library "/usr/local/Cellar/postgresql/9.2.3/lib/postgis-2.0.so": dlopen(/usr/local/Cellar/postgresql/9.2.3/lib/postgis-2.0.so, 10): Symbol not found: _json_tokener_errors Referenced from: /usr/local/Cellar/postgresql/9.2.3/lib/postgis-2.0.so Expected in: /usr/local/lib/libjson.0.dylib in /usr/local/Cellar/postgresql/9.2.3/lib/postgis-2.0.so
So I was stuck. Reverting to the old version did not fix it.
I was able to get my situation rectified by doing a "clean" install of postgresql92
which installed postgresql 9.2.8.
brew install postgresql92
brew link --overwrite postgresql92
brew install postgis20
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
And now I am good. On version 9.2.8. Hehe.
conclusion
I have no clear conclusion or solution. Somehow my json-c
got upgraded, which messed up my postgis installation. I guess installing the new version of postgis, messed up my old version of postgis (since now one file was linked to json-c.0.11 and the other against json-c.0.10).
However I did find a clean solution: upgrading to postgresql92 and postgis20, now nicely linked against json-c 0.11.
If you encounter the same error: switch your json-c
version, before trying anything else, and then I hope you should be good to go (no need to upgrade).