目标
已经通过软件包的形式安装了 PostgreSQL 17,现在需要安装 PostGIS 插件
过程
-
使用 brew 命令安装插件
brew install postgis
-
做软连接
sudo ln -s /opt/homebrew/Cellar/postgis/3.5.3/share/postgresql@17/extension/postgis.control /Library/PostgreSQL/17/share/postgresql/extension/ sudo ln -s /opt/homebrew/Cellar/postgis/3.5.3/share/postgresql@17/extension/postgis--3.5.3.sql /Library/PostgreSQL/17/share/postgresql/extension/ sudo ln -s /opt/homebrew/Cellar/postgis/3.5.3/lib/postgresql@17/postgis-3.dylib /Library/PostgreSQL/17/lib/postgresql
-
重启服务
sudo -u postgres pg_ctl -D /Library/PostgreSQL/17/data restart
-
启用扩展
-- 进入指定库 psql -U postgres -d [dbname]; -- 启用扩展 CREATE EXTENSION postgis;
一切顺利的话,上述过程就可以达成目标了
接下来是这个过程中遇到的坑。。。
踩坑过程
-
在 brew 命令安装完插件之后,未做任何软连接,直接进入数据库执行命令
CREATE EXTENSION postgis;
报错,错误信息为:ERROR: extension "postgis" is not available DETAIL: Could not open extension control file "/Library/PostgreSQL/17/share/postgresql/extension/postgis.control": No such file or directory. HINT: The extension must first be installed on the system where PostgreSQL is running.
一番检索之后,做了第一个软连接
-
第一个软连接做了之后,进入数据库执行命令
CREATE EXTENSION postgis;
报错,错误信息为:ERROR: extension "postgis" has no installation script nor update path for version "3.5.3"
一番检索之后,做了第二个软连接
-
第二个软连接做了之后,进入数据库执行命令
CREATE EXTENSION postgis;
报错,错误信息为:ERROR: could not access file "$libdir/postgis-3": No such file or directory
一番检索之后,做了第三个软连接
其中,如何获取$libdir
呢?可以使用命令pg_config --pkglibdir
- 这期间,几乎每个错误的检索结果中都包含 PostgreSQL 和 PostGIS 插件的版本不匹配,实际上是匹配的。。。
- 这期间,几乎每个错误的检索结果中都包含要重启服务,于是重启服务无数次。。。
-
如何重启服务
首先排除 brew 方式,因为我不是 brew 方式安装的 PostgreSQLbrew services stop postgresql brew services start postgresql brew services restart postgresql
然后用
pg_ctl
命令,其格式为:pg_ctl -D /usr/local/var/postgres [stop | start | restart]
其中,命令中的路径,是 PostgreSQL 的数据目录
那么,如何确定数据库的数据目录呢?可以在进入数据库之后,使用命令:SHOW data_directory;
有了数据目录之后,完整命令如下:
pg_ctl -D /Library/PostgreSQL/17/data restart
但是执行时报错:
pg_ctl: could not open PID file "/Library/PostgreSQL/17/data/postmaster.pid": Permission denied
既然权限不足,想当然的在前面加
sudo
,依然报错:pg_ctl: cannot be run as root Please log in (using, e.g., "su") as the (unprivileged) user that will own the server process.
既然不能用
root
,就看了看数据目录里的权限
(其实,根据进入数据库的命令psql -U postgres -d [dbname]
也知道用户是啥了,但当时就没有想到):sudo ls -l /Library/PostgreSQL/17/data
发现是
postgres
权限,于是命令变成了:sudo -u postgres pg_ctl -D /Library/PostgreSQL/17/data restart
终于可以了,擦咧。。。