psql恢复sql时出现无效命令\N

230

我正在尝试恢复我的转储文件,但是出现了错误:

psql:psit.sql:27485: invalid command \N

有解决方案吗?我搜索过,但没有得到明确的答案。

18个回答

351

Postgres使用\N作为空值的替代符号,但所有psql命令都以反斜杠\符号开头。当COPY语句失败但转储加载继续时,您可以获得这些消息。此消息是一个虚警。如果您想查看COPY语句失败的真实原因,则必须搜索此错误之前的所有行。

是否可以将psql切换到“停止在第一个错误”模式并找到错误:

psql -v ON_ERROR_STOP=1

9
是的,这是一个非常容易犯的错误,因为无效命令错误的数量可能非常大,完全掩盖了早期出现的第一个错误。 - crowmagnumb
11
PostgreSQL 发出如此误导性的警告相当恶劣,你的回答节省了我很多时间! - Tregoreg
58
@Tregoreg - 是的,它不太友好 - 你可以在 "停留在第一个错误" 模式下运行 psql。这样可以简化诊断过程,使用命令 "psql -v ON_ERROR_STOP=1"。 - Pavel Stehule
3
可能会发生在例如开始时create table...失败,但加载仍在继续。 - JaakL
1
@PavelStehule,你应该把你的评论作为答案的一部分添加进去,因为它非常相关,很难规避这些错误。 - Le Droid
显示剩余5条评论

47
当尝试从二进制pg_dump中进行恢复时,我收到了相同的错误消息。我只需使用pg_restore来恢复我的转储,并完全避免\N错误,例如:

pg_restore -c -F t -f your.backup.tar

开关的解释:

-f, --file=FILENAME      output file name
-F, --format=c|d|t       backup file format (should be automatic)
-c, --clean              clean (drop) database objects before recreating

CPU使用率也低得多,不是吗? - catbadger
选项“-F t”解决了我的问题。 - Mehdi Rahimi

30
我知道这是一个旧帖子,但我发现另外一个解决方案:我的新版本上没有安装postgis,这导致我在pg_dump上遇到了相同的错误。

10
您可以使用 --inserts 参数,通过 INSERTS 语句生成您的转储文件。

2
这对我有效! pg_dump --inserts $DATABASE > $FILENAME - Abel

8
我曾经也遇到过这个错误。Pavel是正确的,通常这意味着pg_restore创建的脚本中的某些内容存在问题。由于所有的“/N”错误,你没有看到输出顶部的真正问题。我建议:
  1. 插入一个单独、小的表格(例如:pg_restore --table=orders full_database.dump > orders.dump
  2. 如果你没有一个小表格,则从恢复脚本中删除一堆记录 - 我只确保"./"是最后加载的行(例如,打开 orders.dump 并删除一些记录)
  3. 观察标准输出,找到问题后,你总是可以放弃该表并重新加载
在我的情况下,我还没有安装"hstore"扩展,因此脚本在顶部失败。我在目标数据库上安装了hstore,然后就恢复正常了。

5

今天我也遇到了同样的问题。我使用 --inserts 命令来处理这个问题。

我的做法是:

1)使用带有 inserts 的 pg_dump:

pg_dump dbname --username=usernamehere --password --no-owner --no-privileges --data-only --inserts -t 'schema."Table"' > filename.sql

2) psql(还原已导出的文件)

psql "dbname=dbnamehere options=--search_path=schemaname" --host hostnamehere --username=usernamehere -f filename.sql >& outputfile.txt

注意1)确认添加outputfile将增加导入速度。

注意2)在使用psql导入之前,不要忘记创建与精确相同名称和列的表格。


4
安装 postgresql-(您的版本)-postgis-scripts。

4

我的解决方案是这样的:

psql -U your_user your_db < your.file.here.sql  2>&1|more

这样我就可以阅读错误信息。

希望这能帮助其他人。


2
在我的最近经验中,当真正的问题与转义字符或新行无关时,可能会出现此错误。 在我的情况下,我使用以下命令从数据库A创建了一个转储:
pg_dump -a -t table_name > dump.sql
并尝试使用以下命令将其还原到数据库B中:
psql < dump.sql(当然在更新正确的环境变量之后)。 我最终发现的是,这个转储虽然是 data-only 类型(选项 -a,因此表结构不是转储的显式部分),但是特定于架构的。 这意味着如果不手动修改转储,则不能使用从 schema1.table_name 生成的转储来填充 schema2.table_name。 手动修改转储很容易,在前15行左右指定了模式。

2

如果有帮助的话,我想分享我的解决方案。我安装了postgis但错误没有得到解决。由于我需要复制包含数千行表的大型模式,所以--inserts选项并不可行。在同一数据库中,当在mac上运行pg_dump和psql(恢复)时,我没有看到这个问题。但是,当在linux机器上运行pg_dump并将转储文件复制到mac后尝试进行还原时,出现了问题。因此,我在VSCode中打开了转储文件。它检测到异常的行终止符并给出了删除它们的选项。在执行此操作后,转储文件恢复时就没有出现无效命令\N错误。


你在说哪个行终止符? - MorenoMdz

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