知识库

neo4j-admin load 导致 “Not a valid Neo4j archive”

在使用 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.
© . This site is unofficial and not affiliated with Neo4j, Inc.