还原SQL时psql无效命令\ N

问题描述 投票:119回答:11

我正在尝试还原我的转储文件,但是它导致了错误:

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

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

sql postgresql dump
11个回答
179
投票

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

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

psql -v ON_ERROR_STOP=1

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
投票

我有同样的问题,我创建了一个新数据库,并在使用psql进行还原时得到了invalid command \N。我通过设置与旧数据库相同的表空间来解决它。

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


31
投票

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


9
投票

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


7
投票

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

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

就我而言,我尚未安装“ hstore”扩展名,因此脚本在最顶层失败。我在目标数据库上安装了hstore,然后又重新营业。


6
投票

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


3
投票

安装postgresql-(您的版本)-postgis-脚本


3
投票

今天我发生了同样的事情。我通过使用--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

Note-1)确保添加输出文件将提高导入速度。

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


2
投票

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


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.