备份在线数据库

请务必仔细计划您的备份,并备份所有数据库,包括 system 数据库。

请注意,不允许对数据库别名进行备份,只能备份物理数据库。

命令

可以使用 neo4j-adminbackup 命令以在线模式备份 Neo4j 数据库。必须以 neo4j 用户身份调用该命令,以确保适当的文件权限。

最佳实践,但并非强制要求,是从与数据库位于同一网络但不在集群中的服务器执行备份。您应该在该机器上安装 Neo4j,以便可以使用 `neo4j-admin` 命令。该机器被称为备份客户端。

Neo4j 5 引入了备份命令的新版本,该版本生成不可变的备份工件(与以前版本中的可变文件夹相反)。

备份工件

`neo4j-admin database backup` 命令每次运行都会为每个数据库生成一个备份工件文件。备份工件文件是一个不可变的文件,包含给定数据库的备份数据以及一些元数据,如数据库名称和 ID、备份时间、最低/最高事务 ID 等。

备份工件可以是两种类型:

  1. 包含整个数据库存储的完整备份

  2. 包含要应用于完整备份工件中包含的数据库存储的事务日志的差异备份

备份链

第一次运行备份命令时,会为给定数据库生成一个完整备份工件。另一方面,差异备份工件是由后续运行生成的。

备份链由一个完整备份组成,后面可以选择地跟随 n 个连续的差异备份。

backup chain
图 1. 备份链

使用情况

`neo4j-admin database backup` 命令可用于从正在运行的 Neo4j Enterprise 服务器执行在线完整备份或差异备份。生成的差异备份工件包含可以在还原备份链时重播并应用于完整备份工件中包含的存储的事务日志。

必须事先在服务器上配置 Neo4j 的备份服务。该命令可以在本地和远程运行。但是,它会使用大量资源,例如内存和 CPU。因此,建议在单独的专用机器上执行备份。`neo4j-admin database backup` 命令还支持 SSL/TLS。有关更多信息,请参见在线备份配置.

`neo4j-admin database backup` 不支持 Neo4j Aura.

语法

neo4j-admin database backup [-h] [--expand-commands] [--verbose]
                            [--compress[=true|false]] [--keep-failed[=true|false]]
                            [--parallel-recovery[=true|false]]
                            [--additional-config=<file>]
                            [--include-metadata=none|all|users|roles]
                            [--inspect-path=<path>] [--pagecache=<size>] [--temp-path=<path>]
                            [--to-path=<path>] [--type=<type>] [--from=<host:port>[,<host:
                            port>...]]... [<database>...]

描述

从正在运行的 Neo4j 企业版服务器执行在线备份。必须事先在服务器上配置 Neo4j 的备份服务。

参数

表 1. `neo4j-admin database backup` 参数
参数 描述 默认值

[<database>…​]

要备份的远程数据库的名称。支持双引号内的通配符,例如 "data*"。(除非使用 `--inspect-path`,否则 <database> 是必需的。)

neo4j

如果 <database> 为 "*",则 `neo4j-admin` 将尝试备份 DBMS 的所有数据库。

选项

表 2. `neo4j-admin database backup` 选项
选项 描述 默认值

--additional-config=<file>

具有附加配置的配置文件。

--compress[=true|false]

请求压缩备份工件。压缩可以使备份工件的大小减小很多倍,但确切的缩减幅度取决于许多因素,包括数据库格式和存储的数据类型。如果禁用,生成的工件的大小将大致等于备份数据库的大小。备份操作的速度受压缩影响,但哪个更快取决于 CPU 和存储的相对性能。如果备份速度很重要,请考虑评估两种选项 - 启用压缩和禁用压缩。

true

--expand-commands

允许在配置值评估中进行命令扩展。

--from=<host:port>[,<host:port>…​]

Neo4j 实例的主机和端口的逗号分隔列表,每个实例都按顺序尝试。

-h, --help

显示此帮助消息并退出。

--include-metadata=none|all|users|roles

在文件中包含元数据。这不能用于备份 `system` 数据库。可能的值为

  • `roles` - 包含创建角色和权限(针对数据库和图)的命令,这些角色和权限会影响数据库的使用。

  • `users` - 包含创建可以使用数据库的用户及其角色分配的命令。

  • `all` - 包含 `roles` 和 `users`。

  • `none` - 不包含任何元数据。

    特定于 DBMS 而不是备份数据库的权限不会包含在备份中。例如,`GRANT ROLE MANAGEMENT ON DBMS TO $role` 不会被备份。

相应地,没有数据库相关权限的 `roles` 和 `users` 不会包含在备份中(例如,只有 DBMS 权限或没有权限的那些)。

建议使用 `SHOW USERS`、`SHOW ROLES` 和 `SHOW ROLE $role PRIVILEGES AS COMMANDS` 获取这些情况下的用户、角色和权限的完整列表。

all

--inspect-path=<path>

列出并显示备份工件的元数据。接受文件夹或文件。

--keep-failed[=true|false]

请求保留失败的备份以供进一步的故障后分析。如果启用,将保留包含失败备份数据库的目录。

false

--pagecache=<size>

用于备份过程的页面缓存的大小。

--parallel-recovery[=true|false]

允许多个线程并行将拉取的事务应用于备份。对于某些数据库和工作负载,这可能会显着减少备份时间。注意:这是一个实验性选项。使用前请咨询 Neo4j 支持。

false

--temp-path=<path>

在 5.24 中引入 提供一个指向临时空目录的路径,用于在命令完成之前存储备份文件。这些文件将在命令完成后被删除。

--to-path=<path>

放置备份的目录(除非使用 `--inspect-path`,否则是必需的)。可以使用适当的 URI 作为路径将数据库备份到 AWS S3 存储桶、Google Cloud 存储桶和 Azure 中。

--type=<type>

要执行的备份类型。可能的值为:`FULL`、`DIFF`、`AUTO`。如果没有指定,则根据现有备份自动确定类型。如果要强制执行完整备份,请使用 `FULL`。

AUTO

--verbose

启用详细输出。

`--to-path=<path>` 选项还可以将数据库备份到 AWS S3 存储桶(从 Neo4j 5.19 开始)、Google Cloud 存储桶(从 Neo4j 5.21 开始)和 Azure 存储桶(从 5.24 开始)。有关更多信息,请参见将数据库备份到云存储.

Neo4j 5.24 引入了 `--temp-path` 选项来解决在执行与备份相关的命令时可能发生的磁盘空间问题,尤其是在涉及云存储时。

如果未设置 `--temp-path`,则将在 `--path` 选项指定的目录中创建临时目录。

如果您没有提供 `--path` 选项,或者提供的路径指向云存储桶,则将在 Neo4j 的当前工作目录中创建临时文件夹。此备用选项可能会导致问题,因为本地文件系统(或安装 Neo4j 的分区)可能没有足够的可用磁盘空间来容纳中间计算。

因此,强烈建议在执行与备份相关的命令时提供 `--temp-path` 选项,尤其是如果 `--path` 选项中提供的文件夹指向云存储桶时。

退出代码

根据备份是否成功,`neo4j-admin database backup` 会以不同的代码退出。错误代码包含遇到什么错误的详细信息。

表 3. 备份一个数据库时 Neo4j Admin 备份退出代码
代码 描述

0

成功。

1

备份失败,或者成功但遇到问题,例如某些服务器无法访问。查看日志以获取更多详细信息。

表 4. 备份多个数据库时 Neo4j Admin 备份退出代码
代码 描述

0

所有数据库都成功备份。

1

一个或多个备份失败,或者成功但遇到问题。

在线备份配置

检查点

当请求完整备份时,它总是会触发检查点。在检查点完成之前,备份无法继续。

在服务器进行检查点时,备份作业不会接收任何数据,这可能会导致备份超时。要延长备份超时时间,请修改`dbms.cluster.catchup.client_inactivity_timeout` 设置,该设置限制了网络空闲时间。它控制追赶协议的超时持续时间,追赶协议是包括备份在内的多个追赶过程的底层协议。

您还可以调整检查点设置 或检查磁盘是否足够高效以处理负载。有关更多信息,请参见检查点 IOPS 限制.

要详细了解检查点,请参见数据库内部 → 检查点和日志修剪.

服务器配置

下表列出了与备份相关的基本服务器参数。请注意,默认情况下,备份服务已启用,但仅侦听本地主机 (127.0.0.1)。如果要从另一台机器进行备份,则需要更改此设置。

表 5. 用于备份的服务器参数
参数名称 默认值 描述

server.backup.enabled

true

启用对运行在线备份的支持。

server.backup.listen_address

127.0.0.1:6362

用于在线备份的侦听服务器。

内存配置

以下选项可用于配置分配给备份客户端的内存

  • 配置备份的堆大小:

`HEAP_SIZE` 配置为备份过程分配的最大堆大小。这可以通过在启动操作之前设置环境变量 `HEAP_SIZE` 来完成。如果未指定,则 Java 虚拟机将根据服务器资源选择一个值。

  • 配置备份的页面缓存:

可以使用 `neo4j-admin database backup` 命令的 `--pagecache` 选项来配置页面缓存大小。

您应该尽可能多地为 Neo4J 页面缓存提供内存,只要它满足以下约束

Neo4J 页面缓存 + 操作系统页面缓存 < 可用 RAM,其中 2 到 4 GB 应专用于操作系统的页面缓存。

例如,如果当前数据库根据 `debug.log` 的 `Total mapped size` 为 `128GB`,并且您有足够的可用空间(这意味着您已为操作系统留出了 2 到 4 GB),那么您可以将 `--pagecache` 设置为 `128GB`。

计算资源配置

事务日志文件

用于跟踪最近更改的事务日志文件会根据提供的配置进行轮换和修剪。例如,设置 db.tx_log.rotation.retention_policy=3 文件会在备份中保留 3 个事务日志文件。由于恢复的服务器不需要已经应用的所有事务日志文件,因此可以通过将文件大小缩减到最少来进一步减小存储空间。这可以通过设置 db.tx_log.rotation.size=1Mdb.tx_log.rotation.retention_policy=3 文件来实现。您可以使用 --additional-config 参数来覆盖 neo4j.conf 文件中的配置。

手动删除事务日志会导致备份损坏。

安全配置

使用 SSL 策略和防火墙保护您的备份网络通信可以防止数据遭到意外入侵和泄漏。在使用 neo4j-admin database backup 命令时,您可以配置备份服务器以要求 SSL/TLS,并让备份客户端使用兼容的策略。有关如何在 Neo4j 中配置 SSL 的更多信息,请参阅 SSL 框架

备份服务器的配置应添加到 neo4j.conf 文件中,而备份客户端的配置应添加到 neo4j-admin.conf 文件中。为了确保兼容性,应在两者之间设置相同的 SSL 设置。

默认备份端口为 6362,使用键 server.backup.listen_address 配置。SSL 配置策略的键为 dbms.ssl.policy.backup

例如,将以下内容添加到您的 neo4j.confneo4j-admin.conf 文件中

dbms.ssl.policy.backup.enabled=true
dbms.ssl.policy.backup.tls_versions=TLSv1.2
dbms.ssl.policy.backup.ciphers=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
dbms.ssl.policy.backup.client_auth=REQUIRE

Neo4j 5.24 还支持 TLSv1.3。要同时使用 TLSv1.2 和 TLSv1.3 版本,必须为每个版本指定要强制执行的密码。否则,Neo4j 可能会对这些版本使用 JVM 中的每个可用密码,从而导致配置安全性较低。

有关 Neo4j 中安全性的详细建议列表,请参阅 安全清单

务必确保没有外部访问设置 server.backup.listen_address 指定的端口。如果无法保护此端口,可能会留下安全漏洞,使未经授权的用户能够将数据库复制到其他机器上。在生产环境中,应通过防火墙阻止对备份端口的外部访问。

集群配置

在集群拓扑中,可以从任何托管要备份的数据库的服务器进行备份,并且每个服务器都有两个可配置的端口,能够提供备份。这些端口分别由 server.backup.listen_addressserver.cluster.listen_address 配置。在功能上,它们对于备份来说是等效的,但将它们分开可以提供一些操作灵活性,而只使用一个端口可以简化配置。通常建议选择辅助服务器作为备份服务器,因为在典型的集群部署中,它们比主服务器多。此外,由大型备份引起的辅助服务器上的性能问题不会影响主服务器的性能或冗余性。如果辅助服务器不可用,则可以根据诸如物理位置、带宽、性能和存活性等因素选择主服务器。

使用 SHOW DATABASES 命令了解哪个数据库托管在哪个服务器上。

为了避免从落后的集群成员进行备份,您可以通过公开 Neo4j 指标或通过 Neo4j 浏览器查看事务 ID。要在 Neo4j 浏览器中查看最新处理的事务 ID(以及其他指标),请在提示符下键入 :sysinfo

定位多个服务器

建议在从集群进行备份时提供多个目标服务器的列表,因为即使某些服务器出现故障或并非所有数据库都托管在同一个服务器上,也可能允许备份成功。如果命令找到一个或多个未响应的服务器,它将继续尝试从其他服务器进行备份,并继续备份其他请求的数据库,但命令的退出代码将为非零值,以提醒用户存在问题。如果将名称模式与多个目标服务器一起用于数据库,则所有服务器都将为匹配的数据库列表做出贡献。

示例

以下是如何执行单个数据库和多个数据库备份的示例。目标目录 /mnt/backups/neo4j 必须在调用命令之前存在,并且数据库必须处于联机状态。

备份单个数据库

您不需要使用 --type 选项来指定备份类型。默认情况下,类型会根据现有备份自动确定。

bin/neo4j-admin database backup --to-path=/path/to/backups/neo4j neo4j

强制执行单个数据库的完整备份。

如果您想在执行多个差异备份后强制执行完整备份,可以使用 --type=full 选项。

bin/neo4j-admin database backup --type=full --to-path=/path/to/backups/neo4j neo4j

备份多个数据库

要备份与数据库模式匹配的多个数据库,可以使用名称通配符。例如,要备份三节点集群中所有以 n 开头的数据库,请运行以下命令

bin/neo4j-admin database backup --from=192.168.1.34:6362,192.168.1.35:6362,192.168.1.36:6362 --to-path=/mnt/backups/neo4j --pagecache=4G "n*"

备份数据库列表

要按名称备份多个数据库,可以提供数据库名称列表。

neo4j-admin database backup --from=192.168.1.34:6362,192.168.1.35:6362,192.168.1.36:6362 --to-path=/mnt/backups/neo4j --pagecache=4G "test*" "neo4j"

将数据库备份到云存储

以下示例演示了如何使用 --to-path 选项将数据库备份到云存储桶。

  • AWS S3
  • Google cloud storage
  • Azure cloud storage

Neo4j 使用 AWS SDK v2 通过 AWS URL 调用 AWS 上的 API。或者,您可以覆盖端点,以便 AWS SDK 可以使用系统变量 aws.endpointUrls3aws.endpointUrlS3aws.endpointUrl,或环境变量 AWS_ENDPOINT_URL_S3AWS_ENDPOINT_URL 与其他存储系统(例如 Ceph、Minio 或 LocalStack)进行通信。

  1. 按照 AWS 官方文档中的说明安装 AWS CLI — 安装 AWS CLI 版本 2

  2. 使用 AWS CLI 创建 S3 存储桶和用于存储备份文件的目录

    aws s3 mb --region=us-east-1 s3://myBucket
    aws s3api put-object --bucket myBucket --key myDirectory/

    有关如何创建存储桶和使用 AWS CLI 的更多信息,请参阅 AWS 官方文档 — 使用 Amazon S3 与 AWS CLI 以及 使用高级(s3)命令与 AWS CLI

  3. 通过运行以下命令验证 ~/.aws/config 文件是否正确

    cat ~/.aws/config

    输出应如下所示

    [default]
    region=us-east-1
  4. 通过在 ~/.aws/credentials 文件中设置 aws_access_key_idaws_secret_access_key 以及(如有必要)使用存储桶策略来配置对 AWS S3 存储桶的访问。例如

    1. 使用 aws configure set aws_access_key_id aws_secret_access_key 命令从 AWS 设置您的 IAM 凭据,并验证 ~/.aws/credentials 是否正确

      cat ~/.aws/credentials

      输出应如下所示

      [default]
      aws_access_key_id=this.is.secret
      aws_secret_access_key=this.is.super.secret
    2. 此外,您可以使用基于资源的策略来授予对您的 S3 存储桶及其中的对象的访问权限。创建包含以下内容的策略文档,并将其附加到存储桶。请注意,两个资源条目对于能够下载和上传文件都非常重要。

      {
          "Version": "2012-10-17",
          "Id": "Neo4jBackupAggregatePolicy",
          "Statement": [
              {
                  "Sid": "Neo4jBackupAggregateStatement",
                  "Effect": "Allow",
                  "Action": [
                      "s3:ListBucket",
                      "s3:GetObject",
                      "s3:PutObject",
                      "s3:DeleteObject"
                  ],
                  "Resource": [
                      "arn:aws:s3:::myBucket/*",
                      "arn:aws:s3:::myBucket"
                  ]
              }
          ]
      }
  5. 运行 neo4j-admin database backup 命令将您的数据库备份到您的 AWS S3 存储桶

    bin/neo4j-admin database backup --to-path=s3://myBucket/myDirectory/ mydatabase
  1. 确保您拥有 Google 帐户以及在 Google Cloud Platform (GCP) 中创建的项目。

    1. 按照 Google 官方文档中的说明安装 gcloud CLI — 安装 gcloud CLI

    2. 使用 Google 官方文档创建服务帐户和服务帐户密钥 — 创建服务帐户 以及 创建和管理服务帐户密钥

    3. 下载服务帐户的 JSON 密钥文件。

    4. GOOGLE_APPLICATION_CREDENTIALSGOOGLE_CLOUD_PROJECT 环境变量分别设置为 JSON 密钥文件的路径和项目 ID

      export GOOGLE_APPLICATION_CREDENTIALS="/path/to/keyfile.json"
      export GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID
    5. 使用您创建的服务帐户的电子邮件地址、JSON 密钥文件的路径和项目 ID 对 gcloud CLI 进行身份验证

      gcloud auth activate-service-account service-account@example.com --key-file=$GOOGLE_APPLICATION_CREDENTIALS --project=$GOOGLE_CLOUD_PROJECT

      有关更多信息,请参阅 Google 官方文档 — gcloud auth activate-service-account

    6. 使用 Google 官方文档在 Google Cloud Storage 中创建存储桶 — 创建存储桶

    7. 通过运行以下命令验证存储桶是否已创建

      gcloud storage ls

      输出应列出已创建的存储桶。

  2. 运行 neo4j-admin database backup 命令将您的数据库备份到您的 Google 存储桶

    bin/neo4j-admin database backup --to-path=gs://myBucket/myDirectory/ mydatabase
  1. 确保您拥有 Azure 帐户、Azure 存储帐户和 Blob 容器。

    1. 您可以使用 Azure 门户创建存储帐户。
      有关更多信息,请参阅 Azure 官方文档 — 创建存储帐户

    2. 在 Azure 门户中创建 Blob 容器。
      有关更多信息,请参阅 Azure 官方文档 — 快速入门:使用 Azure 门户上传、下载和列出 Blob

  2. 按照 Azure 官方文档中的说明安装 Azure CLI — Azure 官方文档

  3. 使用默认的 Azure 凭据对 neo4j 或 neo4j-admin 进程进行身份验证。
    有关更多信息,请参阅 Azure 官方文档 — 默认 Azure 凭据

    az login

    然后,您应该准备好使用 Azure URL 在 neo4j 或 neo4j-admin 中进行操作。

  4. 要验证您是否可以使用登录凭据访问容器,请运行以下命令

    # Upload a file:
    az storage blob upload --file someLocalFile  --account-name accountName - --container someContainer --name remoteFileName  --auth-mode login
    
    # Download the file
    az storage blob download  --account-name accountName --container someContainer --name remoteFileName --file downloadedFile --auth-mode login
    
    # List container files
    az storage blob list  --account-name someContainer --container someContainer  --auth-mode login
  5. 运行 neo4j-admin database backup 命令将您的数据库备份到您的 Azure 容器

    bin/neo4j-admin database backup --to-path=azb://myStorageAccount/myContainer/myDirectory/ mydatabase