知识库

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 用于创建和存储临时文件的目录。一些系统管理员在遵循安全最佳实践以限制其攻击面时,确保/tmpnoexec选项挂载。此选项提示内核拒绝允许对该位置执行任何代码执行或存储操作。

一种故障排除方法

检查是否设置了此选项。例如在 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.