Сбой pg_restore при попытке создать таблицу ссылок на функции, которая еще не существует - PullRequest
1 голос
/ 24 июня 2019

Я использовал pg_dump --no-privileges --format custom --compress=0 some_database > my-dump.pgdump для выгрузки базы данных, но у меня возникают проблемы при попытке восстановить ее.

В частности, это похоже на загрузку определений функций перед определениями таблиц:

$ pg_restore ./my-dump.pgdump
…

create function my_function() returns …
language sql $$
  select …
  from some_table
  where …
$$;

… later in the dump …

create table some_table ( … );

…

Что вызывает ошибку при попытке восстановить дамп:

pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 4863; 0 16735 TABLE DATA some_table some_database
pg_restore: [archiver (db)] COPY failed for table "some_table": ERROR:  relation "some_table" does not exist
LINE 3:                     from some_table
                                 ^
QUERY:
                    select …
                    from some_table
                    where …

CONTEXT:  SQL function "my_function" during inlining

Что здесь происходит?Как я могу обмануть pg_dump / pg_restore, чтобы делать вещи в правильном порядке?

1 Ответ

0 голосов
/ 24 июня 2019

Это странно.С тех пор, как commit ef88199f611e625b496ff92aa17a447d254b9796 в 2003 году, pg_dump и pg_restore отправили

SET check_function_bodies = false;

Этот параметр гарантирует, что ошибка, подобная описанной вами, не произойдет, потому что PostgreSQL победил 't проверить достоверность тел функций.

Используете ли вы древнюю версию PostgreSQL или вы делаете что-то еще, что могло бы испортить это?

Если вы запускаете pg_restore на своем дампе (без указания целевой базы данных), излучает ли она строку?

...