知识库

如何从 “设备上没有剩余空间” 中恢复

如果不对 Neo4j 服务器上的磁盘空间使用情况进行例行监控,可能会遇到“No space left on device”(Linux 实现)或“Low Disk Space”(Windows 实现)的错误。对于 Linux 系统,应主动监控磁盘空间,这可以通过此处所述的方法实现。

一旦遇到这些情况,应考虑采取以下步骤以释放足够的空间来启动数据库并完成恢复。需要注意的是,由于磁盘空间已耗尽,不能简单地通过压缩文件来查找更多空间,因为这需要向已满的文件系统写入数据。

  1. 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 指定的事务日志位置中的文件。

  2. 本地备份副本
    检查您是否将 neo4j-admin backup 的结果写入了本地文件系统。如果是,并且该副本对于恢复服务并非必要,那么这些文件是否可以从文件系统中移走或删除?

  3. 旧版本的 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

  4. 日志文件
    在 Neo4j 的正常运行期间,诊断日志会写入到 $NEO4J_HOME/logs/,具体包括 debug.logneo4j.logquery.log(前提是 dbms.logs.query.enabled=true)以及 security.log(前提是 dbms.security.auth_enabled=true),其中 debug.log 可能是这些文件中最大的。鉴于这些是诊断日志,您可以考虑移走/删除/截断这些日志文件。

  5. 插件:您的 $NEO4J_HOME/plugins 目录可能包含 Neo4j 的自定义插件(JAR)。检查插件是否正在写入此路径,如果是,请确保它们正确管理了各自的日志文件。此外,您可以考虑移走/删除 apoc* jar 包,因为它们可以很容易地恢复。

  6. 通过 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 参数恢复为之前设置的值。

  7. 指标(Metrics):从 Neo4j 3.5.0 开始,默认启用指标的 CSV 日志记录。这些 .CSV 文件记录在 conf/neo4j.confdbms.directories.metrics 参数所指定的位置(默认为 $NEO4J_HOME/metrics)。此外,conf/neo4j.conf 中的 metrics.csv.rotation.keep_numbermetrics.csv.rotation.size 参数描述了每个指标要保留的 CSV 文件数量以及该指标的轮转大小。

  8. 为增长做准备
    即使在释放了足够的空间之后,您仍需为未来做准备,确保有足够的磁盘空间供数据库持续增长。这更多属于操作系统层面的职责,但不应被忽视。

  9. 寻求 Neo4j 的指导:如果您仍然无法释放空间,请寻求 Neo4j 的指导。

在 Neo4j 安全重启后,强烈建议运行一次数据库一致性检查。可以通过在运行中的实例上执行 bin/neo4j-admin backup …. …. --check-consistency=true,或者在停止的 Neo4j 数据库上运行 bin/neo4j-admin check-consistency --database=graph.db 来完成。

© . This site is unofficial and not affiliated with Neo4j, Inc.