Dav*_*ver 6 postgresql pg-dump 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 ( … );
…
Run Code Online (Sandbox Code Playgroud)
当我尝试恢复转储时会导致错误:
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
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?我怎样才能欺骗pg_dump/pg_restore按照正确的顺序做事?
检查您的转储文件中是否存在与 混淆的命令search_path,例如:
SELECT pg_catalog.set_config('search_path', '', false);
Run Code Online (Sandbox Code Playgroud)
我在继承的遗留项目中遇到了与您相同的错误(关系 xxx 不存在......在内联期间),即使它运行的是 PostgreSQL 9.4.x。
我将其追溯到上述命令。
我的解决方案是从转储文件中删除此命令。
完成此操作后,我能够无错误地恢复数据库。
这很奇怪。自从 2003 年提交ef88199f611e625b496ff92aa17a447d254b9796以来,pg_dump并pg_restore已发出
SET check_function_bodies = false;
Run Code Online (Sandbox Code Playgroud)
此设置可确保不会发生您所描述的错误,因为 PostgreSQL 不会检查函数体的有效性。
你使用的是古老的 PostgreSQL 版本还是你正在做任何其他可能会造成混乱的事情?
如果您pg_restore在转储上运行(未指定目标数据库),它会发出该行吗?
| 归档时间: |
|
| 查看次数: |
1648 次 |
| 最近记录: |