知识库

neo4j-admin load 导致“不是有效的 Neo4j 归档文件”

使用 neo4j-admin load 加载 .dump 文件时,会观察到以下错误

$ neo4j-admin load --from=/var/lib/neo4j/neo4j.dump --database=neo4j --force --verbose
org.neo4j.cli.CommandFailedException: Not a valid Neo4j archive: /
Caused by: org.neo4j.dbms.archive.IncorrectFormat: /var/lib/neo4j/neo4j.dump
at org.neo4j.dbms.archive.Loader.openArchiveIn(Loader.java:172)
at org.neo4j.dbms.archive.Loader.load(Loader.java:74)
at org.neo4j.commandline.dbms.LoadCommand.load(LoadCommand.java:131)
... 11 more
Caused by: java.util.zip.ZipException: Not in GZIP format

有时,这与 .dump 文件的格式无关,就像 Not in GZIP format 提示的那样,而是由于操作系统设置干扰了 Java 系统属性。

Java 使用系统属性 java.io.tmpdir,在大多数 Linux 系统中,这通常默认为 /tmp。此位置是 JVM 用于创建和存储临时文件的目录。一些系统管理员在遵循安全最佳实践以限制攻击面时,会确保 /tmp 挂载时带有 noexec 选项。此选项会提示内核拒绝允许在此位置执行任何代码或存储任何内容。

一种故障排除方法

检查此选项是否已设置。例如,在 RHEL 服务器上

$ mount | grep /tmp
tmpfs on /tmp type tmpfs (rw,noexec,relatime,seclabel,size=524288k)

因此,在此机器上,/tmp 已设置为带有 noexec 选项。

修复/解决方法

java.io.tmpdir 的默认设置从 /tmp 覆盖为另一个位置,然后运行 neo4j-admin load

例如

$ export _JAVA_OPTIONS="-Djava.io.tmpdir=/var/lib/neo4j/import/temp"
$ neo4j-admin load --from=/var/lib/neo4j/neo4j.dump --database=neo4j --force
Done: 34 files, 971.0KiB processed.
© . All rights reserved.