PostgreSQL:从转储文件中恢复时出现错误:“关系“ sequence”不存在”。

9

在服务器上从转储文件还原数据库时,我遇到了以下错误:

ERROR:关系“table_id_seq”不存在
LINE 1: SELECT pg_catalog.setval('table_id_seq', 362, true);

  • 我的本地psql版本为10.2
  • 服务器psql版本为9.6.8

以下是我的转储命令:

pg_dump -U username -h localhost db_name > filename.sql

这是我在服务器上的恢复命令:

psql -U username -h localhost db_name < filename.sql

请帮忙,谢谢。

(这段文字无需翻译)

你检查了序列的转储吗?输出中还有其他错误吗? - clemens
@clemens 我不确定我的转储文件是否有序列。你能帮忙吗? - Saly
重复?https://stackoverflow.com/a/49252654/2235885 - joop
3个回答

14

在得到了 @clemens 的信息并进行了一些研究后,我发现在我的转储文件中,CREATE SEQUENCE table_id_seq 部分有一个 AS integer 语句,这就是为什么当我恢复到新的数据库时,它没有为序列创建 nextval()。如果我从 CREATE SEQUENCE 部分中删除 AS integer 语句,它就能正常工作。

在我的转储文件中:

CREATE SEQUENCE table_id_seq
    AS integer
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

从转储文件中删除 AS integer

CREATE SEQUENCE table_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

7
问题在于您在Postgres 10上生成了转储文件,然后将其恢复到低版本上,而该版本不支持语法“AS data_type”。 - gagalago
@gagalago 谢谢您的指令。下次我会注意版本问题。 - Saly

5
在我的情况下,序列检查是区分大小写的。这就是为什么我一直收到关系错误的原因。因此,也许这可以帮助像我这样绝望地到这里来的人。我在SQL语句中使用了单引号内的双引号。
SELECT nextval('"USER_ID_seq"');

官方文档中有一些示例: https://www.postgresql.org/docs/9.1/functions-sequence.html


1
这确实为我节省了很多时间。谢谢! - Tony
哦,这对我来说就是答案,谢谢兄弟。 - Amon

4

您可以使用任何文本编辑器(如记事本、Vim等)打开转储文件。搜索 table_id_seq。您应该会找到类似于以下语句:

CREATE SEQUENCE table_id_seq ...

如果缺少该文件,则您的转储文件可能存在问题。您可以通过添加该文件来解决该问题。
CREATE SEQUENCE table_id_seq;

语句的前面立刻

SELECT pg_catalog.setval('table_id_seq', 362, true);

从错误信息中可以看出问题所在。

但这只是一个hack。你应该找出导致dump出错的原因,但这需要更多的信息。


我的转储文件中有CREATE SEQUENCE table_id_seq...但仍然出现错误。 - Saly
@Saly:所以你应该查看输出是否有任何错误。你可以添加“SET client_min_messages TO NOTICE”来增加日志级别。 - clemens

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接