恢复sql时psql无效命令\ N.

Viv*_*nth 120 sql postgresql dump

我正在尝试恢复我的转储文件,但它导致了一个错误:

psql:psit.sql:27485: invalid command \N
Run Code Online (Sandbox Code Playgroud)

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

Pav*_*ule 182

Postgres使用"\ N"作为NULL值的替换符号.但所有psql命令都以反斜杠"\"符号开头.因此,当可能复制语句失败时,您可以获得此消息,但转储加载仍在继续.此消息仅为虚警.您必须先搜索一行,原因是COPY语句失败.

可以将psql切换为"在第一个错误时停止"模式并查找错误:

psql -v ON_ERROR_STOP=1
Run Code Online (Sandbox Code Playgroud)

  • @Tregoreg - 是的,它不友好 - 您可以在"第一次出错时停止"模式下运行psql.它简化了诊断"psql -v ON_ERROR_STOP = 1" (49认同)
  • 是的,这是一个非常非常容易犯的错误,因为这些无效命令错误的数量可能非常大,完全掩盖了早期的第一个错误命中. (7认同)
  • PostgreSQL提出如此误导的警告是非常邪恶的,你的答案为我节省了很多时间! (5认同)
  • 当例如“ create table ...”在开始时失败,但继续加载时,可能会发生。 (2认同)

mes*_*lds 33

尝试从二进制转储还原时,我会出现相同的错误消息.我只是用来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


So4*_*4ne 9

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


ora*_*ata 7

我过去也遇到过这个错误.Pavel是正确的,它通常表明pg_restore创建的脚本中的某些内容失败了.由于所有"/ N"错误,您没有在输出的最顶部看到真正的问题.我建议:

  1. 插入一张小桌子(例如pg_restore --table=orders full_database.dump > orders.dump)
  2. 如果你没有一个小的,那么从恢复脚本中删除一堆记录 - 我只是确保./是要加载的最后一行(例如,打开orders.dump并删除一堆记录)
  3. 观察标准输出,一旦发现问题,您可以随时删除表并重新加载

在我的情况下,我还没有安装"hstore"扩展,所以脚本在顶部失败了.我在目标数据库上安装了hstore,然后我又回来了.


小智 6

您可以使用带有--inserts参数的INSERTS语句来生成转储。

  • 这对我有用!pg_dump-插入$ DATABASE> $ FILENAME (2认同)

Ekr*_*dal 5

今天同样的事情发生在我身上。我通过使用 --inserts 命令转储来处理问题。

我要做的是:

1) 带插入的 pg_dump:

pg_dump dbname --username=usernamehere --password --no-owner --no-privileges --data-only --inserts -t 'schema."Table"' > filename.sql
Run Code Online (Sandbox Code Playgroud)

2) psql (恢复你的转储文件)

psql "dbname=dbnamehere options=--search_path=schemaname" --host hostnamehere --username=usernamehere -f filename.sql >& outputfile.txt
Run Code Online (Sandbox Code Playgroud)

Note-1 ) 确保添加 outputfile 会提高导入速度。

注2)在使用psql导入之前,不要忘记创建具有完全相同名称和列的表。