如何从“设备空间不足”错误中恢复
如果没有人定期监控 Neo4j 服务器上的磁盘空间使用情况,可能会遇到“设备空间不足”(对于 Linux 实现)或“磁盘空间不足”(Windows 实现)。对于 Linux 实现,应主动监控磁盘空间,这可以通过类似于此处所述的方式来完成。
遇到上述任何一种情况后,应考虑以下步骤,以便释放足够的磁盘空间以启动数据库并允许恢复完成。需要注意的是,由于您已经用尽了所有磁盘空间,因此您不能简单地压缩文件来寻找更多空间,因为这需要写入完整的文件系统。
-
graph.db 路径
**请勿**手动删除数据库路径中的文件,默认位置为$NEO4J_HOME/data/databases/graph.db
,并在 dbms.directories.data 的conf/neo4j.conf
参数中进行了说明。尽管此路径可能包含最多的数据,但请勿手动从此路径中删除文件,因为手动删除文件很可能会损坏数据库和/或阻止将来启动。
但是,如果您在 Neo4j 安装中还有另一个具有更多可用空间的文件系统,则可以将整个目录移动到另一个文件系统,或者从 Neo4j 3.4 开始,您可以配置 dbms.directories.tx_log,此参数描述了data/databases/graph.db/neostore.transaction*
文件的记录位置。例如,如果当前 Neo4j 安装位于/home/software/
(磁盘已满的位置),并且存在另一个文件系统,例如/home/disk2
,它具有大量的可用空间,则可以将dbms.directories.tx_log
的conf/neo4j.conf
参数重新配置为/home/disk2/tx_logs
的值,并将当前和现有的data/databases/graph.db/neostore.transaction*
文件复制到/home/disk2/tx_logs
,以便释放/home/software
上的空间。您也可以对data/databases/graph.db
中的所有内容进行相同的操作,将其从/home/software
复制到/home/disk2
,并依次更新dbms.directories.data
的conf/neo4j.conf
参数。在任何情况下,您都不得删除/修改 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 文件记录在
dbms.directories.metrics
的 conf/neo4j.conf 参数所描述的位置,默认为 $NEO4J_HOM]E/metrics。此外,metrics.csv.rotation.keep_number
和metrics.csv.rotation.size
的 conf/neo4j.conf 参数描述了对于给定指标要保留的 CSV 文件数量以及该指标的轮换大小。 -
准备应对增长
即使在释放了足够的磁盘空间后,您仍然需要为未来做好准备,以确保您有足够的磁盘空间来持续数据库增长。这更多是与操作系统相关的责任,但不能忽视。 -
寻求 Neo4j 的指导如果您仍然无法释放空间,请寻求 Neo4j 的指导。
Neo4j 安全重启后,强烈建议您运行数据库一致性检查。这可以通过在正在运行的实例上运行备份 bin/neo4j-admin backup …. ….. --check-consistency=true
或在停止的 Neo4j 数据库上运行 bin/neo4j-admin check-consistency --database=graph.db
来执行。
此页面是否有帮助?