首页 > 解决方案 > 无法使用 Postgres 9.2 安装任何语言

问题描述

一段时间以来,我一直在几台不同的服务器上使用 Postgres 9.2,但在一个特定的 Postgres 实例上的一个特定数据库上,我无法安装任何语言。

$ sudo su - postgres
$ psql
postgres=# select * from pg_language;

这显示internalsqlcplpgsql

如果我连接并重myDb试:

postgres=# \connect myDb
You are now connected to database "myDb" as user "postgres".
postgres=# select * from pg_language;

我只看到internal,sqlc。我尝试使用createlang他们的文档中显示的安装语言并收到错误:

$ createlang plpgsql myDb
createlang: language installation failed: ERROR:  language validation function 2247 called for language 13 instead of 1

我可以看到它plpgsql.so在正确的位置 - 它必须是postgres数据库才能拥有它。

这也不是plpgsql特定的,因为我收到相同的错误消息plpythonu。我可以安装在postgres数据库中,但不能安装在myDb数据库中。

文档和论坛没有解决这个问题。

标签: postgresqlplpgsql

解决方案


您的目录似乎pl_language已损坏。

您应该看到以下内容:

SELECT oid, * FROM pg_language ;

  oid  | lanname  | lanowner | lanispl | lanpltrusted | lanplcallfoid | laninline | lanvalidator | lanacl 
-------+----------+----------+---------+--------------+---------------+-----------+--------------+--------
    12 | internal |       10 | f       | f            |             0 |         0 |         2246 | 
    13 | c        |       10 | f       | f            |             0 |         0 |         2247 | 
    14 | sql      |       10 | f       | t            |             0 |         0 |         2248 | 
(3 rows)

相反,您输入的c语言(OID 13)似乎有 1 而不是 2247 lanvalidator。知道这是怎么发生的吗?你操纵目录了吗?

看看你的pg_language.

继续进行的安全方法是到pg_dump您的数据库,删除并重新创建它并加载转储。这应该处理所有目录操作。

如果您喜欢危险的生活,您可以以超级用户身份尝试以下操作:

UPDATE pg_language SET lanvalidator = 2247 WHERE oid = 13;

推荐阅读