一、前言
在使用 MySQL 时,我们经常会通过 mysqldump 将已有数据库导出为一个 .sql 文件,之后在其他机器或新环境中快速恢复数据库结构和数据。
那么 Neo4j 是否也可以做到类似的事情呢?
答案是:可以。
Neo4j 也支持将已有数据库导出为一个文件,并通过该文件快速恢复数据库。常用方式主要有两种:
-
使用
neo4j-admin database dump/load导出和恢复数据库; -
使用 APOC 插件导出 Cypher 脚本,再通过
cypher-shell执行恢复。
其中,如果目标是完整、快速地恢复 Neo4j 数据库,最推荐使用 neo4j-admin database dump/load 方式。
二、Neo4j 常见导出方式对比
Neo4j 中常见的数据库导出方式如下表所示。
| 方式 | 导出结果 | 是否适合完整恢复 | 适用场景 |
|---|---|---|---|
neo4j-admin database dump |
.dump 文件 |
适合 | 完整备份、迁移、快速恢复 |
apoc.export.cypher.all |
.cypher 脚本文件 |
一般适合 | 小规模数据、需要查看或修改导出语句 |
apoc.export.csv.all |
CSV 文件 | 不适合直接完整恢复 | 数据分析、数据交换 |
| Neo4j Browser 手动导出 | 查询结果文件 | 不适合 | 少量查询结果导出 |
如果你的需求是:
将 Neo4j 中已有数据库的完整结构和数据导出为一个文件,之后可以用这个文件快速恢复数据库。
那么建议优先使用:
neo4j-admin database dump
neo4j-admin database load
三、方式一:使用 neo4j-admin 导出和恢复数据库
1. 适用场景
neo4j-admin database dump/load 类似于 MySQL 中的备份恢复方式,适合用于:
-
迁移 Neo4j 数据库;
-
备份当前图数据库;
-
在另一台机器上快速复原数据库;
-
保存实验数据或项目数据快照;
-
完整恢复节点、关系、属性、索引和约束等内容。
这种方式导出的文件通常是:
neo4j.dump
其中 neo4j 是数据库名称。
四、导出前准备
1. 确认数据库名称
Neo4j 默认数据库名通常是:
neo4j
如果你使用的是多数据库环境,也可以在 Neo4j Browser 中执行:
SHOW DATABASES;
查看当前有哪些数据库。
结果中可以看到类似:
name currentStatus
neo4j online
system online
一般情况下,我们要导出的就是 neo4j 数据库。
2. 停止 Neo4j 服务
使用 neo4j-admin database dump 导出数据库时,通常要求数据库处于离线状态。
如果是 Windows 服务安装的 Neo4j,可以在命令行中执行:
neo4j stop
或者在 Windows 服务管理器中手动停止 Neo4j 服务。
如果使用的是 Neo4j Desktop,则直接停止对应的数据库实例即可。
五、导出 Neo4j 数据库为 dump 文件
假设:
-
数据库名为:
neo4j -
备份目录为:
D:\neo4j_backup
需要先确保备份目录已经存在。
Windows 下执行命令
进入 Neo4j 安装目录的 bin 文件夹,例如:
cd D:\neo4j-community-5.x.x\bin
然后执行:
neo4j-admin.bat database dump neo4j --to-path=D:\neo4j_backup --overwrite-destination=true
执行完成后,会在备份目录下生成:
D:\neo4j_backup\neo4j.dump
其中:
-
neo4j:表示要导出的数据库名称; -
--to-path:表示导出文件保存目录; -
--overwrite-destination=true:表示如果目标文件已经存在,则允许覆盖。
Linux 下执行命令
Linux 环境下可以执行:
cd /path/to/neo4j/bin
然后执行:
./neo4j-admin database dump neo4j --to-path=/home/neo4j_backup --overwrite-destination=true
执行完成后会生成:
/home/neo4j_backup/neo4j.dump
六、使用 dump 文件恢复 Neo4j 数据库
当需要在当前机器或另一台机器上恢复数据库时,可以使用 neo4j-admin database load 命令。
假设 dump 文件路径为:
D:\neo4j_backup\neo4j.dump
Windows 下恢复命令
同样进入 Neo4j 的 bin 目录:
cd D:\neo4j-community-5.x.x\bin
执行:
neo4j-admin.bat database load neo4j --from-path=D:\neo4j_backup --overwrite-destination=true
其中:
-
neo4j:表示恢复后的数据库名称; -
--from-path:表示.dump文件所在目录; -
--overwrite-destination=true:表示允许覆盖已有数据库。
恢复完成后,重新启动 Neo4j:
neo4j start
Linux 下恢复命令
Linux 环境下执行:
./neo4j-admin database load neo4j --from-path=/home/neo4j_backup --overwrite-destination=true
然后启动 Neo4j:
./neo4j start
七、验证数据库是否恢复成功
启动 Neo4j 后,可以进入 Neo4j Browser,执行以下命令查看数据库状态:
SHOW DATABASES;
然后查看节点数量:
MATCH (n) RETURN count(n);
查看关系数量:
MATCH ()-[r]->() RETURN count(r);
如果节点数和关系数与原数据库一致,说明数据已经恢复成功。
也可以查看索引和约束:
SHOW INDEXES;
SHOW CONSTRAINTS;
八、完整操作示例
假设当前数据库名为 neo4j,希望导出到:
D:\neo4j_backup
完整流程如下。
1. 停止 Neo4j
neo4j stop
2. 导出数据库
neo4j-admin.bat database dump neo4j --to-path=D:\neo4j_backup --overwrite-destination=true
导出后得到:
D:\neo4j_backup\neo4j.dump
3. 在目标环境中恢复数据库
neo4j-admin.bat database load neo4j --from-path=D:\neo4j_backup --overwrite-destination=true
4. 启动 Neo4j
neo4j start
5. 验证数据
MATCH (n) RETURN count(n);
MATCH ()-[r]->() RETURN count(r);
九、方式二:导出为 Cypher 脚本文件
除了 .dump 文件外,Neo4j 也可以导出为类似 .sql 的文本脚本文件。
这种方式需要使用 APOC 插件。
1. 导出整个数据库为 Cypher 文件
在 Neo4j Browser 中执行:
CALL apoc.export.cypher.all("all.cypher", {
format: "cypher-shell"
})
YIELD file, nodes, relationships, properties
RETURN file, nodes, relationships, properties;
执行后会生成一个 all.cypher 文件。
该文件中保存的是重建数据库所需的 Cypher 语句,包括节点、关系、属性、索引等信息。
2. 使用 cypher-shell 导入 Cypher 文件
Windows 下可以执行:
type all.cypher | cypher-shell.bat -a bolt://localhost:7687 -u neo4j -p your_password
Linux 下可以执行:
cat all.cypher | ./cypher-shell -a bolt://localhost:7687 -u neo4j -p your_password
其中:
-
neo4j是用户名; -
your_password是数据库密码; -
bolt://localhost:7687是 Neo4j 的 Bolt 连接地址。
十、dump 方式和 Cypher 脚本方式如何选择
如果是完整备份和恢复,建议使用 .dump 方式。
原因是:
-
恢复速度更快;
-
更适合大规模图数据;
-
更接近数据库级别备份;
-
操作简单,不需要逐条执行 Cypher;
-
更适合迁移和环境复现。
如果只是小规模数据,或者希望人工查看、修改导出的语句,可以使用 Cypher 脚本方式。
简单来说:
完整迁移、快速恢复、大数据量:使用 dump/load
小数据量、可读脚本、便于修改:使用 APOC 导出 Cypher
十一、常见问题
1. 执行 dump 时提示数据库正在使用怎么办?
一般是因为 Neo4j 服务没有停止。
需要先停止数据库:
neo4j stop
或者在 Neo4j Desktop 中关闭对应数据库实例。
2. 恢复时报数据库已经存在怎么办?
如果目标数据库已经存在,可以使用:
--overwrite-destination=true
例如:
neo4j-admin.bat database load neo4j --from-path=D:\neo4j_backup --overwrite-destination=true
这会覆盖已有数据库。
注意:覆盖前请确认已有数据库不再需要,避免误删数据。
3. dump 文件可以直接复制到其他机器吗?
可以。
只需要将生成的 .dump 文件复制到目标机器,然后在目标机器上执行:
neo4j-admin database load
即可恢复数据库。
4. dump 是否包含所有用户和权限?
一般情况下,dump/load 主要用于导出和恢复具体数据库的数据内容,包括节点、关系、属性、索引和约束等。
但是用户、角色、权限等系统级信息不一定都包含在普通数据库 dump 中。如果涉及生产环境迁移,需要单独考虑 system 数据库、用户权限和配置文件等内容。
5. Neo4j Desktop 可以使用这种方式吗?
可以。
Neo4j Desktop 中的数据库本质上也是 Neo4j 数据库实例。可以找到对应数据库的安装路径和 bin 目录,然后使用 neo4j-admin 命令。
不过在执行 dump/load 之前,需要先停止对应数据库实例。
十二、总结
Neo4j 可以像 MySQL 一样,将已有数据库导出为一个文件,并通过该文件快速恢复数据库。
如果目的是完整备份、迁移和恢复,推荐使用:
neo4j-admin database dump
neo4j-admin database load
核心命令如下:
neo4j-admin.bat database dump neo4j --to-path=D:\neo4j_backup --overwrite-destination=true
neo4j-admin.bat database load neo4j --from-path=D:\neo4j_backup --overwrite-destination=true
如果想导出为类似 .sql 的文本脚本,可以使用 APOC:
CALL apoc.export.cypher.all("all.cypher", {
format: "cypher-shell"
})
YIELD file, nodes, relationships, properties
RETURN file, nodes, relationships, properties;
总体来说:
-
.dump文件方式更适合完整恢复和迁移; -
.cypher脚本方式更适合小规模数据和人工查看修改; -
生产环境中需要额外关注用户、权限和配置文件等系统级信息。
对于大多数项目实验、数据迁移和本地环境复现,使用 .dump 文件是最方便、最稳妥的方式。