将包括系统数据库在内的所有数据库的最近备份存储在一个安全的位置是非常重要的。这确保了在发生数据丢失或损坏时,能够迅速恢复数据库到最近的状态,减少可能的业务影响。对于不同的数据库环境(开发、测试或生产),根据其重要性和数据变更频率,制定合适的备份策略至关重要。同时,考虑到备份过程对系统性能的影响,建议在非高峰时段执行备份任务,并定期检查备份的有效性和完整性。
为什么?
备份 Neo4j 数据库并将其存储在安全的异地位置有两个主要原因:
- 在发生故障时快速恢复数据,例如与硬件、人为错误或自然灾害相关的故障。
- 执行例行管理作,例如将数据库从一个实例移动到另一个实例、升级或回收空间。
设计备份策略时,需要考虑的因素
- 环境类型:确定是开发、测试还是生产环境。生产环境通常需要更频繁和严格的备份与恢复计划。
- 评估数据量:大数据量可能需要考虑增量或差异备份以减少存储需求和备份时间。
- 统计数据库数量:了解系统中包含的数据库总数有助于规划资源分配和管理复杂度。
- 分析可用系统资源:评估CPU、内存、存储等资源,确保有足够的能力执行备份操作而不影响其他服务。
- 确定停机时间容忍度:根据业务需求设定可接受的停机时间,对于关键应用应尽量采用无停机或极短停机的备份方案。
- 考虑备份对性能的影响:安排在非高峰时段进行备份以最小化对性能的影响,特别是在高负载情况下。
- 定义数据丢失容忍度:设定RPO(恢复点目标)以决定可以接受的数据丢失量,进而指导备份频率的选择。
- 评估故障停机容忍度:设置RTO(恢复时间目标),即从故障发生到恢复正常运行所需的时间,这将影响备份和恢复策略的选择。对停机时间和数据丢失持零容忍态度,则可能需要考虑执行联机备份。
- 监控数据库更新频率:高更新率的数据库可能需要更频繁的备份来保证数据的最新性。
- 选择适当的备份和恢复方法:根据需求选择联机或脱机备份方式,以及是否需要完整、差异或增量备份,是否启用SSL/TLS加密传输。
- 决定保留的备份数量:根据法规要求和业务需求确定需保留的备份数量和期限。
- 选择合适的备份存储位置:本地/远程服务器、云存储、不同的数据中心、不同的位置等,推荐异地存储以增加数据安全性,避免本地灾难导致的数据丢失。
- 定期测试恢复流程:至少每年一次,理想情况下每季度或每月测试恢复过程,确保能够成功恢复数据。
Neo4j 的备份及还原
不支持文件系统复制和粘贴数据库,这可能会导致不需要的行为,例如存储损坏。
Neo4j 支持备份和恢复在线和离线数据库。 它使用 Neo4j 管理工具命令,这些命令可以从实时运行,也可以从离线 Neo4j DBMS 运行。 所有命令都必须以用户身份调用,以确保具有适当的文件权限。
neo4j-admin database backup/restore(仅限 Enterprise)
-- 用于执行在线备份(完整和差异)和还原作。neo4j-admin database dump/load
-- 用于执行脱机转储和加载作。 需要转储的数据库必须处于离线模式。只能从服务器命令行调用,适用于不考虑停机时间的环境。neo4j-admin database copy
-- 用于复制脱机数据库或备份。 此命令可用于清理数据库不一致和回收未使用的空间。
选择要备份的数据库
一个 Neo4j DBMS 数据库管理系统可以托管多个数据库。无论是Neo4j社区版还是企业版,都有一个默认的用户数据库,称为neo4j,以及一个系统数据库(system database),后者包含配置信息,例如数据库的操作状态、安全配置、模式定义、登录凭证和角色等。在企业版中,你还可以创建额外的用户数据库。这些数据库各自独立备份。
其他需要备份的文件
除了数据库之外,还需要单独备份以下文件以确保系统的完整性和安全性:
-
neo4j.conf 文件:这是Neo4j的配置文件。如果你有一个集群部署,应该为每个集群成员分别备份其配置文件。这是因为不同节点可能有不同的配置设置。
-
加密使用的全部文件:包括私钥、公钥证书以及信任和吊销目录中的内容。这些文件的位置在SSL框架中有描述。对于集群环境来说,也需要分别为每个集群成员备份这些文件,以防止由于密钥丢失导致的安全问题。
-
自定义插件:如果使用了任何自定义插件,确保将这些插件安全地存储在一个可靠的位置。这有助于在系统恢复或重建时能够快速重新部署这些插件,保证功能完整性。
-
Bloom或GDS Enterprise的许可证密钥文件:如果使用了这些高级功能或工具,也需要备份相应的许可证密钥文件。这对于保持软件的合法使用权及其功能访问权限非常重要。
定期检查并更新这些备份文件是至关重要的,尤其是在进行了任何配置更改、更新了加密材料或者修改了插件之后。确保所有关键数据和配置都得到了妥善保护,可以在发生意外情况时最小化数据丢失和服务中断的风险。
数据存储
在考虑备份存储时,确保数据与生产系统分开存放是非常重要的,理想情况下应存放在没有共同依赖关系的异地位置。这样做可以有效防止由于物理损坏、自然灾害或安全事故导致的数据丢失风险。
备份模式
Neo4j的备份客户端可以以两种不同的模式运行:全量备份和差异备份。
全量备份(Full Backup)
- 全量备份会复制数据库中的所有数据。这种方式提供了完整的数据保护,因为它是独立的,不需要依赖其他备份来恢复数据。
- 适用于首次备份或周期性地创建一个全新的备份集,以便简化恢复过程。缺点是需要更多的存储空间,并且执行时间较长,特别是对于大型数据库。
- 离线备份
sh
bin/neo4j-admin database dump neo4j --to-path=/full/path/to/dumps
neo4j-admin database dump
命令用于执行离线数据库的全量备份。它将数据库导出为一个单一文件归档,通常命名为 <database>.dump
,并存储在<NEO4J_HOME>/data目录下。此命令特别适用于需要对数据库进行完整备份但数据库处于离线状态的情况。
此外,neo4j-admin database dump
还支持将导出的数据流式传输到标准输出,这使得输出可以直接被管道传输到另一个程序处理。例如,可以将导出的数据直接通过管道传输给neo4j-admin database load
命令来加载到另一个Neo4j实例中。这种方式在迁移或恢复数据时,能够简化操作流程并提高效率。
-
导出路径 :你可以指定一个目标目录
<to-path>
,在这种情况下,会创建一个名为<database>.dump
的文件。如果希望将输出直接发送到标准输出(stdout),可以使用--to-stdout
选项。 -
自动使用配置 :如果没有提供
--to-path
或--to-stdout
,系统将使用server.directories.dumps.root
设置作为默认的目标位置。 -
限制条件:需要注意的是,不能导出一个挂载在正在运行的Neo4j服务器上的数据库。这意味着在执行导出操作之前,必须确保目标数据库已经停止服务,以避免数据不一致或其他问题。
- 离线加载数据库
bash
bin/neo4j-admin database load --from-path=/full-path/data/dumps neo4j --overwrite-destination=true
neo4j-admin database load
命令用于从使用 neo4j-admin database dump
命令创建的归档文件,或者由 Neo4j Enterprise 版本中的 neo4j-admin database backup
命令创建的全量备份工件中加载数据库。这一过程允许你将数据恢复到一个Neo4j实例中,是数据库迁移、恢复或复制的重要步骤。
- 在执行加载操作之前,确保目标数据库实例处于离线状态。这是因为直接在运行中的数据库上执行此操作可能会导致数据不一致或其他问题。
- 根据需要调整命令中的参数,如数据库名称和源文件路径等。
- 确保有足够的磁盘空间和系统资源来处理加载操作,特别是在处理大型数据库时。
- 在线备份(仅企业版)
sh
export HEAP_SIZE=2G
mkdir /mnt/backups
bin/neo4j-admin database backup --from=192.168.1.34 --to-path=/mnt/backups/neo4j --pagecache=4G neo4j
在线差异备份(Differential Backup)
- 差异备份只包含自上次全量备份以来更改的数据。这意味着它比全量备份更快、占用更少的存储空间。
- 适用于日常备份策略中,可以在不影响性能的情况下频繁执行,以减少数据丢失的风险。
首次全量备份之后,后续的备份尝试使用差异模式。在这种模式下,仅传输自上次备份以来事务日志的增量(即变化的部分),并用这些日志创建差异备份文件(存储在目标位置)。这些差异备份文件形成一个备份链。
sh
export HEAP_SIZE=2G
bin/neo4j-admin database backup --from=192.168.1.34 --to-path=/mnt/backups/neo4j --pagecache=4G neo4j
如果这篇文章对您有所帮助,欢迎点赞、分享和留言,让更多的人受益。感谢您的细心阅读,如果发现了任何错误或需要补充的地方,请随时告诉我,我会尽快处理 _