我正在尝试还原我的转储文件,但是导致了错误:
psql:psit.sql:27485: invalid command \N
有解决方案吗?我进行了搜索,但没有得到明确的答案。
我正在尝试还原我的转储文件,但是导致了错误:
psql:psit.sql:27485: invalid command \N
有解决方案吗?我进行了搜索,但没有得到明确的答案。
Answers:
Postgres使用“ \ N”代替NULL值。但是所有psql命令都以反斜杠“ \”符号开头。因此,当copy语句可能失败但转储继续加载时,您可以获得此消息。此消息仅是错误警报。您必须先搜索一行以了解COPY语句失败的原因。
可以将psql切换为“在第一个错误时停止”模式并查找错误:
psql -v ON_ERROR_STOP=1
create table...
在启动失败时可能发生,但继续加载。
(pg_restore ... | psql ...) 2>&1 | less
尝试从二进制转储还原时,出现相同的错误消息。我只是用来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
过去我也遇到过此错误。Pavel是正确的,通常表明pg_restore创建的脚本中的某些操作失败。由于存在所有“ / N”错误,因此您不会在输出的最顶部看到真正的问题。我建议:
pg_restore
--table=orders full_database.dump > orders.dump
)orders.dump
并删除一堆记录)就我而言,我还没有安装“ hstore”扩展,因此脚本在最顶层失败了。我在目标数据库上安装了hstore,然后又恢复了业务。
今天我也发生了同样的事情。我通过使用--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导入之前,请不要忘记创建名称和列完全相同的表。
以我最近的经验,当真正的问题与转义字符或换行符无关时,可能会出现此错误。就我而言,我是使用数据库A创建了一个转储,
pg_dump -a -t table_name > dump.sql
并试图将它恢复为数据库B
psql < dump.sql
(当然,在更新了正确的环境变量之后)
,我最终发现的是,尽管转储是data-only
(-a
选项,以便表结构不是转储的明确组成部分)是特定于模式的。这意味着,如果不手动修改转储,就无法使用从生成的转储schema1.table_name
来填充schema2.table_name
。手动修改转储很容易,该模式在前15行左右指定。
对于在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)之后,您可能需要增加可用磁盘空间。
我遇到了同样的问题,我创建了一个新数据库并invalid command \N
使用psql恢复。我通过设置与旧数据库相同的表空间来解决它。
例如,旧的数据库备份具有表空间“ pg_default”,我为新数据库定义了相同的表空间,并且以上错误已消失!
我遵循了所有这些示例,但都因我们正在谈论的错误而失败:
起作用的是-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;