知识库

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

如果不定期监控 Neo4j 服务器上的磁盘空间使用情况,可能会遇到“设备上没有剩余空间”(适用于 Linux 实现)或“磁盘空间不足”(适用于 Windows 实现)的错误。对于 Linux 实现,应主动监控磁盘空间,这可以通过类似于此处描述的方法来实现。

一旦遇到其中任一情况,应考虑以下步骤以释放足够的空间来启动数据库并允许恢复完成。请注意,由于已耗尽所有磁盘空间,不能简单地通过压缩文件来寻找更多空间,因为这需要在已满的文件系统上进行写入。

  1. graph.db 路径
    切勿 手动删除数据库路径中的文件,默认位置是 $NEO4J_HOME/data/databases/graph.dbconf/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 升级到 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

  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. 指标 从 Neo4j 3.5.0 开始,默认启用将指标记录为 CSV 文件,.CSV 文件记录在 conf/neo4j.conf 文件中由 dbms.directories.metrics 参数描述的位置,该位置默认为 $NEO4J_HOM]E/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 来执行。