Ошибка pg_restore при попытке создать таблицу ссылок на функции, которая еще не существует

Я использовал 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 выполнять действия в правильном порядке?


person David Wolever    schedule 24.06.2019    source источник


Ответы (2)


Проверьте файл дампа на наличие команд, которые путаются с search_path, например:

SELECT pg_catalog.set_config('search_path', '', false);

Я столкнулся с той же ошибкой, что и вы (отношение xxx не существует... во время встраивания) в устаревшем проекте, который я унаследовал, хотя он работает под управлением PostgreSQL 9.4.x.

Я проследил это до приведенной выше команды.

Решением для меня было удалить эту команду из файла дампа.

После того, как я это сделал, я смог восстановить базу данных без ошибок.

person jdhildeb    schedule 07.10.2019