PostgreSQL 安装 PostGIS 插件

Jul 1, 2025


目标

已经通过软件包的形式安装了 PostgreSQL 17,现在需要安装 PostGIS 插件

过程

  1. 使用 brew 命令安装插件

     brew install postgis
    
  2. 做软连接

     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
    
  3. 重启服务

     sudo -u postgres pg_ctl -D /Library/PostgreSQL/17/data restart
    
  4. 启用扩展

     -- 进入指定库
     psql -U postgres -d [dbname];
     -- 启用扩展
     CREATE EXTENSION postgis;
    

一切顺利的话,上述过程就可以达成目标了
接下来是这个过程中遇到的坑。。。

踩坑过程

  1. 在 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.
    

    一番检索之后,做了第一个软连接

  2. 第一个软连接做了之后,进入数据库执行命令CREATE EXTENSION postgis;报错,错误信息为:

     ERROR:  extension "postgis" has no installation script nor update path for version "3.5.3"
    

    一番检索之后,做了第二个软连接

  3. 第二个软连接做了之后,进入数据库执行命令CREATE EXTENSION postgis;报错,错误信息为:

     ERROR:  could not access file "$libdir/postgis-3": No such file or directory
    

    一番检索之后,做了第三个软连接
    其中,如何获取$libdir呢?可以使用命令pg_config --pkglibdir

  4. 这期间,几乎每个错误的检索结果中都包含 PostgreSQL 和 PostGIS 插件的版本不匹配,实际上是匹配的。。。
  5. 这期间,几乎每个错误的检索结果中都包含要重启服务,于是重启服务无数次。。。
  6. 如何重启服务
    首先排除 brew 方式,因为我不是 brew 方式安装的 PostgreSQL

     brew 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
    

    终于可以了,擦咧。。。