如何从“设备上没有剩余空间”错误中恢复
如果不定期监控 Neo4j 服务器上的磁盘空间使用情况,可能会遇到“设备上没有剩余空间”(适用于 Linux 实现)或“磁盘空间不足”(适用于 Windows 实现)的错误。对于 Linux 实现,应主动监控磁盘空间,这可以通过类似于此处描述的方法来实现。
一旦遇到其中任一情况,应考虑以下步骤以释放足够的空间来启动数据库并允许恢复完成。请注意,由于已耗尽所有磁盘空间,不能简单地通过压缩文件来寻找更多空间,因为这需要在已满的文件系统上进行写入。
-
graph.db 路径
切勿 手动删除数据库路径中的文件,默认位置是$NEO4J_HOME/data/databases/graph.db
,conf/neo4j.conf
配置文件中的 dbms.directories.data 参数也对此进行了说明。尽管此路径可能包含大部分数据,但切勿手动删除此路径下的文件,因为手动删除文件极有可能破坏数据库并/或阻止未来启动。
但是,如果在 Neo4j 安装所在的另一个文件系统上有更多可用空间,则可以将整个目录移动到该文件系统,或者从 Neo4j 3.4 开始,可以配置 dbms.directories.tx_log 参数,该参数描述了data/databases/graph.db/neostore.transaction*
文件记录的位置。例如,如果当前的 Neo4j 安装位于磁盘空间已满的/home/software/
目录,而另一个文件系统(例如/home/disk2
)有大量空间,则可以将conf/neo4j.conf
中的dbms.directories.tx_log
参数重新配置为/home/disk2/tx_logs
,并将当前及现有的data/databases/graph.db/neostore.transaction*
文件复制到/home/disk2/tx_logs
,以释放/home/software
上的空间。同样,也可以将data/databases/graph.db
的全部内容从/home/software
复制到/home/disk2
,然后更新conf/neo4j.conf
文件中的dbms.directories.data
参数。在任何情况下都不要删除/修改 graph.db 路径下以及/或由配置参数 dbms.directories.tx_log 指定的事务日志位置下的文件。
-
本地备份副本
考虑是否曾将neo4j-admin backup
的结果写入本地文件系统。如果是,并且如果该副本对于恢复服务不是必需的,是否可以将这些文件从文件系统中移动/删除? -
Neo4j 软件的先前版本
如果过去曾多次升级 Neo4j,文件系统上可能保留了先前的软件版本。例如,如果您通常将软件安装到/usr/software/
,并从 Neo4j 3.2.1 升级到 Neo4j 3.5.0,则您可能同时拥有/usr/software/neo4j-enterprise-3.2.1
和/usr/software/neo4j-enterprise-3.5.0
。如果存在此类旧环境,并且您已在新版本上成功运行,则可以考虑移动/删除先前版本,在此示例中为/usr/software/neo4j-enterprise-3.2.1
。 -
日志文件
在 Neo4j 的正常运行过程中,诊断日志会写入$NEO4J_HOME/logs/
目录,特别是debug.log
、neo4j.log
、query.log
(前提是 dbms.logs.query.enabled=true)和security.log
(前提是 dbms.security.auth_enabled=true)。其中debug.log
可能是这些文件中最大的。鉴于这些文件是诊断日志,您可以考虑移动/删除/截断这些日志文件。 -
插件 您的
$NEO4J_HOME/plugins
目录可能包含用于 Neo4j 的自定义插件 (JAR)。检查您的插件是否向此路径写入数据,或者如果它们确实写入,请确保它们正确地管理其日志文件。此外,您可以考虑删除/移动apoc* jar
文件,因为它很容易恢复。 -
通过 Neo4j 产品裁剪事务日志文件
如果您已释放了相当多的空间,在启动之前您可能希望将conf/neo4j.conf
文件中的 dbms.tx_log.rotation.retention_policy 参数配置为一个很小的值(例如dbms.tx_log.rotation.retention_policy=100M
)。成功启动并进行后续检查点(默认为每 900 秒)后,将进行事务日志裁剪/轮换,并应删除除最后一个事务日志之外的所有日志。如果您不想等待这 900 秒(15 分钟),并且正在运行 Neo4j 3.5.6 或更高版本,则可以通过调用存储过程dbms.checkpoint()
; 手动强制执行检查点。
这种方法的一个问题是,很有可能在下一次备份时(如果是增量备份),它会回退到完整备份,因为上次备份和下一次备份之间的事务日志存在间隙。如果采用此方法,在释放了足够的磁盘空间后,应将dbms.tx_log.rotation.retention_policy
参数恢复到之前设置的值。 -
指标 从 Neo4j 3.5.0 开始,默认启用将指标记录为 CSV 文件,.CSV 文件记录在
conf/neo4j.conf
文件中由dbms.directories.metrics
参数描述的位置,该位置默认为 $NEO4J_HOM]E/metrics。此外,conf/neo4j.conf
中的 metrics.csv.rotation.keep_number 和 metrics.csv.rotation.size 参数描述了每个指标保留的 CSV 文件数量以及该指标的轮换大小。 -
准备应对增长
即使释放了足够的空间,仍然需要为未来做准备,确保有足够的磁盘空间以应对数据库的持续增长。这更多是操作系统相关的责任,但不应被忽视。 -
寻求 Neo4j 的指导 如果仍然无法释放空间,请寻求 Neo4j 的指导。
在 Neo4j 安全重启后,强烈建议您运行数据库一致性检查。这可以通过在运行的实例上运行备份命令 bin/neo4j-admin backup …. ….. --check-consistency=true
或在停止的 Neo4j 数据库上运行 bin/neo4j-admin check-consistency --database=graph.db
来执行。
此页面有帮助吗?