无法访问文件"$libdir/plpgsql":没有这个文件或目录。

13

我很困惑,我在我的本地Postgres服务器(postgres.app, Mac OS X 10.7)上创建存储过程时遇到了问题,如下:

$ psql
psql (9.3.0)
Type "help" for help.

dchaston=# CREATE OR REPLACE FUNCTION table_update()
dchaston-# RETURNS TRIGGER AS $$
dchaston$# BEGIN
dchaston$#   NEW.last_edit = now();
dchaston$#   RETURN NEW;
dchaston$# END;
dchaston$# $$ language 'plpgsql';
ERROR:  could not access file "$libdir/plpgsql": No such file or directory

I've checked the following:

Languages installed:

dchaston=# select * from pg_language;
lanname  | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl
---------+----------+---------+--------------+---------------+-----------+--------------+--------
internal |       10 | f       | f            |             0 |         0 |         2246 | 
c        |       10 | f       | f            |             0 |         0 |         2247 | 
sql      |       10 | f       | t            |             0 |         0 |         2248 | 
plpgsql  |       10 | t       | t            |         12019 |     12020 |        12021 | 
(4 rows)

lib目录(同时也是pkglibdir):

$ pg_config --libdir
/Applications/Postgres.app/Contents/MacOS/lib
$ pg_config --pkglibdir
/Applications/Postgres.app/Contents/MacOS/lib

文件已存在:

$ cd /Applications/Postgres.app/Contents/MacOS/lib; ls plpg*
plpgsql.so

正确设置DLSUFFIX:

lib/pgxs/src/Makefile.shlib:135:    DLSUFFIX        = .so

我已尝试卸载并重新安装,但没有任何改变。有什么建议吗?

3个回答

16

你在同一台机器上安装了多个Postgres实例(不同版本或同一版本的多个实例)吗?标准的Postgres并不适合这种情况。Debian或Ubuntu有额外的基础设施,可以允许多个版本并行运行。我不知道OS X是否有这样的功能。

在标准的Postgres中,路径$libdir是编译进程序中的。多个版本不能共存。
当你执行pg_config --pkglibdir时,请确保它与你的安装关联。运行:

which pg_config

小笔记:

  • 9.3.0?建议始终升级到最新的点版本,目前是 9.3.2。也许当前版本可以解决您的问题。

  • 还要检查您的设置是否使用了您认为使用的$libdir

SELECT * FROM pg_settings WHERE  name ~~* '%lib%';
  • 不要引用语言名称 'plpgsql'(尽管可以容忍),它是一个标识符:plpgsql

  • 使用 plpgsql 赋值运算符 :=。虽然 = 可以被接受但未经记录。
    自 Postgres9.4开始,:==都有记录。

  • 否则,您的函数定义是正确的,而这并不是问题的根本原因:

    CREATE OR REPLACE FUNCTION table_update()
      RETURNS trigger AS
    $func$
    BEGIN
       NEW.last_edit := now();
       RETURN NEW;
    END
    $func$  LANGUAGE plpgsql;
    

    多次安装方面做得很好。我从我的第一个数据库中打开了一个会话,所以当我认为我已经卸载它时,我只是在其上重新安装了9.3.1版本。清除了会话,现在一切都很好。 - CaffeinatedDave

    2
    这篇文章与被采纳的答案有关。
    我在执行brew update时,遇到了libdir问题,这是在MacOS Catalina 10.15.7上发生的。由于brew update失败,并且我注意到Postgresql是它正在尝试更新的许多软件包之一,因此上面的答案提供了一个有关多个安装的好提示。
    我验证了系统上没有任何其他版本的postgresql。因此,简单地重启服务对我很有帮助: brew services restart postgresql@10

    0

    我使用FreeBSD,并找到了一个简单的解决方法,只需从另一台服务器复制库并粘贴到/usr/local/lib/postgresql/中,这是$libdir的方式。尽管PostgreSQL的版本不同,但一切都正常工作,我再也没有遇到问题。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接