[英]psql invalid command \N while restore sql
我正在尝试恢复我的转储文件,但它导致了一个错误:
psql:psit.sql:27485: invalid command \N
有解决办法吗? 我搜索了,但我没有得到明确的答案。
Postgres 使用 "\\N" 作为 NULL 值的替代符号。 但是所有 psql 命令都以反斜杠 "" 符号开头。 当复制语句失败但转储的加载继续时,您可以获得这些消息。 此消息是误报。 如果您想查看 COPY 语句失败的真正原因,您必须搜索此错误之前的所有行。
可以将 psql 切换到“在第一个错误时停止”模式并查找错误:
psql -v ON_ERROR_STOP=1
尝试从二进制 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
我知道这是一篇旧帖子,但我遇到了另一个解决方案:postgis 没有安装在我的新版本上,这导致我在 pg_dump 上出现了同样的错误
我过去也遇到过这个错误。 Pavel 是正确的,这通常表明 pg_restore 创建的脚本中的某些内容失败了。 由于所有“/N”错误,您在输出的最顶部看不到真正的问题。 我建议:
pg_restore --table=orders full_database.dump > orders.dump
)orders.dump
并删除一堆记录)就我而言,我还没有安装“hstore”扩展,所以脚本在最顶端失败。 我在目标数据库上安装了 hstore,然后我又开始营业了。
您可以使用 INSERTS 语句和 --inserts 参数生成转储。
今天同样的事情发生在我身上。 我通过使用 --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 ) 确保添加 outputfile 会提高导入速度。
注2)在使用psql导入之前,不要忘记创建具有完全相同名称和列的表。
安装 postgresql-(你的版本)-postgis-scripts
根据我最近的经验,当真正的问题与转义字符或换行符无关时,可能会出现此错误。 就我而言,我从数据库 A 创建了一个转储pg_dump -a -t table_name > dump.sql
并试图将其恢复到数据库 B
psql < dump.sql
(当然,在更新适当的环境变量之后)
我最终发现转储是特定于模式的,尽管它只是data-only
( -a
选项,因此表结构不是转储的明确一部分)。 这意味着如果不手动修改转储,我无法使用从schema1.table_name
生成的转储来填充schema2.table_name
。 手动修改转储很容易,模式在前 15 行左右指定。
大多数情况下,解决方案是安装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 ),您可能需要增加可用的磁盘空间。
我遇到了同样的问题,我创建了一个新数据库,并在使用 psql 还原时得到了invalid command \\N
。 我通过使用旧数据库设置相同的表空间来解决它。
例如,旧数据库备份有表空间“pg_default”,我为新数据库定义了相同的表空间,并且上述错误消失了!
我遵循了所有这些示例,但它们都因我们正在谈论的错误而失败:
有效的是-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 与源数据库不同。 一旦我删除了目标数据库并重新创建它,它就可以正常工作。
就我而言,问题是我的目标机器上缺少磁盘空间。 简单地增加本地存储为我修复了它。
希望这有助于某人;)
添加我的决议,以防它帮助任何人。 我安装了 postgis,但错误没有解决。 --inserts 选项不可行,因为我必须复制一个包含数千行表的大模式。 对于同一个数据库,当 pg_dump 和 psql(恢复)在 mac 上运行时,我没有看到这个问题。 但是当 pg_dump 在 linux 机器上运行时,问题出现了,转储文件复制到 mac 并尝试恢复。 所以我在 VSCode 中打开了转储文件。 它检测到异常的线路终止符并提供删除它们的选项。 之后,转储文件恢复运行没有无效命令 \N 错误。
@farshid-ashuri 的答案对我来说很好。
我在 Almalinux 上使用 Postgres 14 并出现类似的消息。 安装 postgresql14-contrib package 后,我恢复了完整的转储,没有更多消息。
*对不起,我的英语很差。
检查表中的列和备份文件中的列是否合适
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.