如何从 “设备上没有剩余空间” 中恢复
如果不对 Neo4j 服务器上的磁盘空间使用情况进行例行监控,可能会遇到“No space left on device”(Linux 实现)或“Low Disk Space”(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 升级到了 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参数恢复为之前设置的值。 -
指标(Metrics):从 Neo4j 3.5.0 开始,默认启用指标的 CSV 日志记录。这些 .CSV 文件记录在
conf/neo4j.conf中dbms.directories.metrics参数所指定的位置(默认为 $NEO4J_HOME/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 来完成。
此页面有帮助吗?