upgrade: function digest does not exist

Всем привет.
Делаю upgrade c 9.4 на 9.5, но при апдейте вылазит ошибка в теме. Странно следующее: на старой базе extension pgcrypto не включён. Ладно, включаю и апгрейджу так:
1) на старой базе добавляю необходимый extension:

CREATE extension pgcrypto;

проверяю работу:

postgres=# SELECT digest('blah', 'sha1');
                   digest
--------------------------------------------
 \x5bf1fd927dfb8679496a2e6cf00cbe50c1c87145
(1 row)

2) инициализирую пустую базу для 9.5:

/usr/postgres/9.5/bin/amd64/initdb /var/postgres/9.5/data_64 -E utf8

3) на новой базе добавляю необходимый extension:

CREATE extension pgcrypto;

проверяю работу:

postgres=# SELECT digest('blah', 'sha1');
                   digest
--------------------------------------------
 \x5bf1fd927dfb8679496a2e6cf00cbe50c1c87145
(1 row)

4) запускаю upgrade:
/usr/postgres/9.5/bin/amd64/pg_upgrade -d /var/postgres/9.4/data_64 -D /var/postgres/9.5/data_64 -b /usr/postgres/9.4/bin/amd64 -B /usr/postgres/9.5/bin/amd64 -v

Вот полный текст ошибки:

pg_restore: [archiver (db)] could NOT execute query: ERROR:  FUNCTION digest(bytea, unknown) does NOT exist
LINE 2:     SELECT encode(digest(convert_to($1, 'UTF8')::bytea, 'sha...
                          ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
QUERY:
    SELECT encode(digest(convert_to($1, 'UTF8')::bytea, 'sha1'), 'hex')
 
CONTEXT:  SQL function "sha1" during inlining
    Command was:
-- For binary upgrade, must preserve pg_class oids
SELECT pg_catalog.binary_upgrade_set_next_index_pg_class_oid('553607281'...

То ли что-то забыл, то ли какой-то баг.
Заранее спасибо.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Немного продвинулся. Теперь

Немного продвинулся. Теперь понятна стала ошибка:

/usr/bin/strings pg_upgrade_dump_16420.custom | grep digest
digest("bytea", "text")
CREATE FUNCTION "digest"("bytea", "text") RETURNS "bytea"
    AS '$libdir/pgcrypto', 'pg_digest';
ALTER EXTENSION "pgcrypto" ADD FUNCTION "digest"("bytea", "text");
DROP FUNCTION "public"."digest"("bytea", "text");
digest("text", "text")
CREATE FUNCTION "digest"("text", "text") RETURNS "bytea"
    AS '$libdir/pgcrypto', 'pg_digest';
ALTER EXTENSION "pgcrypto" ADD FUNCTION "digest"("text", "text");
DROP FUNCTION "public"."digest"("text", "text");
retVal[I] := encode(digest(convert_to(lower(phrases[I]), 'UTF8')::bytea, 'sha1'), 'hex');
    SELECT encode(digest(convert_to($1, 'UTF8')::bytea, 'sha1'), 'hex')
retVal[I] := encode(digest(convert_to(lower(phrases[I]), 'UTF8')::bytea, 'sha1'), 'hex');
    SELECT encode(digest(convert_to($1, 'UTF8')::bytea, 'sha1'), 'hex')

Непонятно другое: зачем оно удаляет функцию digest?

Скорее всего, чтобы иметь

Скорее всего, чтобы иметь уверенность, что в БД будет именна та функция, которая нужна, а не та, которая существует.
А вообще не совсем понимаю зачем pg_upgrade? Почему не dump и восстановление?

Оно-то понятно, что ему не

Оно-то понятно, что ему не хватает, непонятно почему так происходит?

Решил попробовать одной командой сразу всё. pg_dumpall - это будет вторая попытка апдейтнуть.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023