我曾经使用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
以正确的顺序做事?
答案 0 :(得分:0)
这很奇怪。自2003年提交ef88199f611e625b496ff92aa17a447d254b9796以来,pg_dump
和pg_restore
发出了
SET check_function_bodies = false;
此设置可确保不会发生您所描述的错误,因为PostgreSQL不会检查函数体的有效性。
您是否正在使用古老的PostgreSQL版本,或者是否正在做其他可能会破坏该版本的事情?
如果您在转储上运行pg_restore
(未指定目标数据库),它会发出这一行吗?
答案 1 :(得分:0)
检查转储文件中是否有与search_path
混淆的命令,例如:
SELECT pg_catalog.set_config('search_path', '', false);
即使我运行的是PostgreSQL 9.4.x,我在继承的旧项目中也遇到了与您相同的错误(内联时xxx不存在...)。
我跟踪到上面的命令。
对我来说,解决方案是从转储文件中删除此命令。
完成此操作后,我可以无错误地还原数据库。