当恢复sql时,psql无效命令\N

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

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

有解决办法吗?我找了,但没有得到明确的答案。

136946 次浏览

Postgres使用\N作为NULL值的替代符号。但是所有psql命令都以反斜杠\符号开始。当复制语句失败,但转储的加载仍在继续时,您可以获得这些消息。这条消息是假警报。如果希望看到COPY语句失败的真正原因,则必须搜索此错误之前的所有行。

是否可以将psql切换为“第一次错误就停止”;模式和查找错误:

psql -v ON_ERROR_STOP=1

我过去也遇到过这种错误。Pavel是正确的,这通常是pg_restore创建的脚本中某些东西失败的标志。由于所有的“/N”错误,您在输出的顶部看不到真正的问题。我建议:

  1. 插入一个单独的小表(例如,pg_restore . 0) ——表full_database =订单。转储祝辞订单。Dump )
  2. 如果你没有一个小的记录,那么从恢复脚本中删除一堆记录-我只是确保./是最后一行被加载(例如,打开orders.dump并删除一堆记录)
  3. 查看标准输出,一旦发现问题,就可以随时删除 表和重载

在我的情况下,我还没有安装“hstore”扩展,所以脚本在顶部失败。我在目标数据库上安装了hstore,然后就可以继续工作了。

当我试图从二进制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
根据我最近的经验,当真正的问题与转义字符或换行符无关时,可能会得到这个错误。在我的例子中,我用
从数据库a创建了一个转储 pg_dump -a -t table_name > dump.sql
并且尝试用
将其恢复到数据库B psql < dump.sql(当然是在更新了正确的env变量之后)
我最终弄清楚的是,转储,虽然它是data-only (-a选项,因此表结构不是显式转储的一部分),是特定于模式的。这意味着如果不手动修改转储,我就不能使用从schema1.table_name生成的转储来填充schema2.table_name。手动修改转储很容易,模式在前15行左右指定

可以使用INSERTS语句和——INSERTS参数生成转储。

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

安装postgresql-(你的版本)-postgis-scripts

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

对于我来说,在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)的操作后,您可能需要增加可用的磁盘空间。

今天我也遇到了同样的事。我通过使用——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导入之前,不要忘记创建具有完全相同名称和列的表。

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

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

我遵循了所有这些例子,它们都失败了,出现了我们正在谈论的错误:

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

有效的是- c的语法,参见这里:

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

此外,如果两者之间有不同的模式,我发现改变一个dB的模式以匹配其他的表副本是必要的,例如:

DROP SCHEMA public;
ALTER SCHEMA originalDBSchema RENAME TO public;

我的解决办法是:

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

这样我就可以读取错误消息

我希望这能对大家有所帮助。

对我来说,这是与源数据库不同的ENCODING和LOCALE。 一旦我删除了目标DB并重新创建它,它就可以正常工作

在我的例子中,问题是在我的目标计算机上缺少磁盘空间。简单地增加本地存储为我解决了它。

希望这能帮助到一些人;)

加上我的决心,希望能帮助到任何人。我安装了postgis,但错误没有解决。——inserts选项是不可行的,因为我必须复制一个包含数千行表的大模式。对于同一个数据库,当pg_dump和psql(还原)在mac上运行时,我没有看到这个问题。但是当pg_dump在linux机器上运行时,转储文件复制到mac并尝试还原。所以我在VSCode中打开了转储文件。它可以检测到不寻常的行终止符,并给出删除它们的选项。这样做之后,转储文件恢复运行没有无效的命令\N错误。

检查表中的列和备份文件中的列是否合适