Невозможно установить какой-либо язык с Postgres 9.2 - PullRequest
0 голосов
/ 13 декабря 2018

Я уже некоторое время использую Postgres 9.2 на нескольких разных серверах, но на одной конкретной базе данных на одном конкретном экземпляре Postgres я не могу установить ни один язык.

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

Это показывает internal, sql, c и plpgsql.

Если я подключусь к myDb и попытаюсь снова:

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

Я вижу только internal, sql и c.Я попытался установить язык, используя 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.

Документация и форумы не решают эту проблему.

1 Ответ

0 голосов
/ 14 декабря 2018

Похоже, что ваш 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;
...