还原sql时psql无效命令\ N


Answers:


198

Postgres使用“ \ N”代替NULL值。但是所有psql命令都以反斜杠“ \”符号开头。因此,当copy语句可能失败但转储继续加载时,您可以获得此消息。此消息仅是错误警报。您必须先搜索一行以了解COPY语句失败的原因。

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

psql -v ON_ERROR_STOP=1

7
是的,这是一个非常非常容易犯的错误,因为这些无效的命令错误的数量可能非常大,从而完全掩盖了第一个错误。
crowmagnumb

5
从PostgreSQL发出这样的误导性警告是很邪恶的,您的回答为我节省了很多时间!
Tregoreg 2014年

50
@Tregoreg-是的,它并不友好-您可以在“第一个错误停止”模式下运行psql。它简化了诊断“ psql -v ON_ERROR_STOP = 1”
Pavel Stehule 2014年

2
例如create table...在启动失败时可能发生,但继续加载。
JaakL

1
我来这里是因为同样的错误。我想去做的是: (pg_restore ... | psql ...) 2>&1 | less
THK

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


CPU使用率也低很多,不是吗?
catbadger,

15

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


1
真是救命!
matmat

8

过去我也遇到过此错误。Pavel是正确的,通常表明pg_restore创建的脚本中的某些操作失败。由于存在所有“ / N”错误,因此您不会在输出的最顶部看到真正的问题。我建议:

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

就我而言,我还没有安装“ hstore”扩展,因此脚本在最顶层失败了。我在目标数据库上安装了hstore,然后又恢复了业务。


“我尚未安装“ hstore”扩展名”,TNX。
阿拉什·法塔赫扎德



4

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

我要做的是:

1)带有插入的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导入之前,请不要忘记创建名称和列完全相同的表。


2

以我最近的经验,当真正的问题与转义字符或换行符无关时,可能会出现此错误。就我而言,我是使用数据库A创建了一个转储,
pg_dump -a -t table_name > dump.sql
并试图将它恢复为数据库B
psql < dump.sql(当然,在更新了正确的环境变量之后)
,我最终发现的是,尽管转储是data-only-a选项,以便表结构不是转储的明确组成部分)是特定于模式的。这意味着,如果不手动修改转储,就无法使用从生成的转储schema1.table_name来填充schema2.table_name。手动修改转储很容易,该模式在前15行左右指定。


1

大多数情况下,解决方案是安装postgres-contrib软件包。


0

对于在SUSE 12上使用postgreSQL 10的我,我invalid command \N通过增加磁盘空间解决了该错误。磁盘空间不足对我造成了错误。如果在df -h输出中查看数据将要查看的文件系统,则可以判断出磁盘空间是否不足。如果使用100%的文件系统/挂载,则在执行类似操作psql -f db.out postgres(请参阅https://www.postgresql.org/docs/current/static/app-pg-dumpall.html)之后,您可能需要增加可用磁盘空间。


0

我遇到了同样的问题,我创建了一个新数据库并invalid command \N使用psql恢复。我通过设置与旧数据库相同的表空间来解决它。

例如,旧的数据库备份具有表空间“ pg_default”,我为新数据库定义了相同的表空间,并且以上错误已消失!


0

我遵循了所有这些示例,但都因我们正在谈论的错误而失败:

将表从一个数据库复制到Postgres中的另一个数据库

起作用的是-C的语法,请参见此处:

pg_dump -C -t tableName "postgres://$User:$Password@$Host:$Port/$DBName" | psql "postgres://$User:$Password@$Host:$Port/$DBName"

另外,如果两者之间有不同的架构,我发现需要更改一个dB的架构以匹配其他dB,才能使表副本正常工作,例如:

DROP SCHEMA public;
ALTER SCHEMA originalDBSchema RENAME TO public;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.