恢复数据库备份

命令

数据库备份工件(完整或差异)可以使用 neo4j-adminrestore 命令在相同或更高版本的 Neo4j 中恢复。

您还可以使用 neo4j-admin database load 命令加载**完整**数据库备份工件。此功能在社区版中可用。

不支持将数据库备份恢复到以前的 Neo4j 版本。

恢复操作完成后,您必须创建数据库(使用针对 system 数据库的 CREATE DATABASE 命令),除非您要替换现有数据库。neo4j-admin database restore 必须以 neo4j 用户身份调用,以确保适当的文件权限。更多信息,请参阅创建数据库

如果您正在使用 CDC,请确保您使用相同的 txLogEnrichment 值创建新数据库,并在您的 CDC 应用程序中处理 CDC 数据可能丢失或损坏的情况。更多信息,请参阅数据变更捕获 (CDC) 文档。

恢复备份链时,必须首先重放差异备份工件中包含的事务日志。此恢复操作占用大量资源,可以通过使用聚合命令将其与恢复操作解耦。

语法

neo4j-admin database restore [-h] [--expand-commands] [--verbose] [--overwrite-destination
                             [=true|false]] [--source-database[=source-database-name]]
                             [--additional-config=<file>] --from-path=<path> [,<path>...]
                             [--restore-until=<recovery-criteria>] [--temp-path=<path>]
                             [--to-path-data=<path>] [--to-path-txn=<path>] [<database>]

参数

表 1. neo4j-admin database restore 参数
参数 描述

[<database>]

恢复后的数据库名称。只有当 --from-path 选项指向单个工件的路径时,才允许使用此参数。

选项

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

--additional-config=<file>[1]

包含附加配置的配置文件。

--expand-commands

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

--from-path=<path>[,<path>…​]

路径可以指向单个备份工件、包含工件的文件夹或以逗号分隔的备份工件文件列表。工件文件可以是 1) 完整备份,在这种情况下直接恢复;或者 2) 差异备份,在这种情况下,命令首先尝试在文件夹中找到以该特定差异备份结束的备份链,然后恢复该链。可以使用适当的 URI 作为路径,从 AWS S3 存储桶、Google Cloud 存储桶和 Azure 存储桶恢复备份。

-h, --help

显示此帮助消息并退出。

--overwrite-destination[=true|false]

是否应替换现有数据库。

此选项在集群上不安全,因为集群具有与恢复的数据库不一致的附加状态。在集群中,恢复到新数据库以避免此问题。

false

--restore-until=<recovery-criteria>

差异备份工件包含事务日志,在恢复备份链时,这些日志可以重放并应用于完整备份工件中包含的存储。数据库会应用日志直到满足恢复条件。目前支持的条件是:<transactionID><timestamp>

  • 要将数据库恢复到某个事务 ID,所需的事务条件应类似于 --restore-until=123,其中 123 是提供的事务 ID。恢复操作会恢复事务日志,直到(但不包括)事务 123。

  • 要将数据库恢复到特定日期,所需的日期条件应类似于 --restore-until=2021-09-11 10:15:30,其中 2021-09-11 10:15:30 是 UTC 日期和时间。恢复操作会恢复在提供的时间戳之前提交的事务。

--source-database[=source-database-name]

2025.02 引入 源数据库名称。如果 --from-path 指向包含多个数据库备份的文件夹,您必须指定数据库名称以筛选工件。

--to-path-data=<path>

数据库的基本目录。只有当 --from-path 参数指向恰好一个目录时,才允许使用此选项。

--to-path-txn=<path>

事务日志的基本目录。只有当 --from-path 参数指向恰好一个目录时,才允许使用此选项。

--temp-path=<path>

提供一个临时空目录的路径,用于存储备份文件直到命令完成。命令完成后,文件将被删除。

--verbose

启用详细输出。

1. 更多详情请参阅Neo4j Admin 和 Neo4j CLI → 配置

--from-path=<path> 选项还可以从 AWS S3 存储桶、Google Cloud 存储桶和 Azure 存储桶加载备份。更多信息,请参阅恢复位于云存储中的备份

--temp-path 选项可以解决执行备份相关命令时(尤其是涉及云存储时)与磁盘空间相关的潜在问题。

如果未设置 --temp-path,则会在 --from-path 选项指定的目录内创建一个临时目录。

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

因此,强烈建议提供 --temp-path 选项。

示例

以下示例展示如何检查您的备份目录并恢复数据库备份(在备份在线数据库部分创建)。假定备份工件(完整备份和差异备份)位于 /path/to/mybackups 目录中。

检查备份工件

使用以下命令检查备份目录

bin/neo4j-admin database backup --inspect-path=/path/to/mybackups
示例输出
|                                                       FILE | DATABASE |                          DATABASE ID |                TIME |  FULL | COMPRESSED | LOWEST TX | HIGHEST TX |
| file:///path/to/mybackups/neo4j-2023-06-29T14-46-27.backup |    neo4j | c8368b24-55e2-474d-bb41-75657f5bfcde | 2023-06-29T13:46:27 |  true |       true |         1 |         11 |
| file:///path/to/mybackups/neo4j-2023-06-29T14-50-45.backup |    neo4j | c8368b24-55e2-474d-bb41-75657f5bfcde | 2023-06-29T13:50:45 | false |       true |        12 |         14 |
| file:///path/to/mybackups/neo4j-2023-06-29T14-51-33.backup |    neo4j | c8368b24-55e2-474d-bb41-75657f5bfcde | 2023-06-29T13:51:33 | false |       true |        15 |         18 |

示例输出显示备份工件是备份链的一部分。第一个工件是完整备份,另外两个是差异备份。LOWEST TXHIGHEST TX 列显示备份工件中第一个和最后一个事务的事务 ID。这意味着,如果您恢复 neo4j-2023-06-29T14-50-45.backup,您的数据库将把 14 作为最后一个事务 ID。

恢复数据库备份

以下示例假设您希望将数据恢复到一个名为 mydatabase 的新数据库中。如果您想替换现有数据库,您需要先停止它,并在恢复命令中添加选项 --overwrite-destination=true

  1. 通过运行以下命令恢复数据库备份

    bin/neo4j-admin database restore --from-path=/path/to/backups/neo4j-2023-06-29T14-51-33.backup mydatabase

    --from-path= 参数必须包含备份链中最后一个备份的路径,在此示例中为 neo4j-2023-06-29T14-51-33.backup

    如果您想同时恢复多个数据库,您必须先停止它们,然后可以通过指定逗号分隔的备份工件路径列表来修改命令,并移除 <database> 参数。如果您正在替换现有数据库,您还应该跳过后续的 CREATE DATABASE 步骤。

  2. 使用针对 system 数据库的 CREATE DATABASE 命令创建新数据库。

    CREATE DATABASE mydatabase

恢复数据到特定日期

要将数据恢复到特定日期,您需要传入包含该日期之前数据的备份工件。

此示例假设您希望将数据恢复到一个名为 mydatabase 的新数据库中。如果您想替换现有数据库,您需要先停止它,并在恢复命令中添加选项 --overwrite-destination=true

  1. 从包含所需日期之前数据的备份中恢复。

    bin/neo4j-admin database restore --from-path=/path/to/mybackups/neo4j-2023-06-29T14-50-45.backup --restore-until="2023-06-29 13:50:45" mydatabase

    --from-path= 参数必须包含完整备份或差异备份工件的路径。--restore-until= 参数必须包含 UTC 日期和时间。恢复操作会恢复在提供的日期和时间之前提交的所有事务。

    如果您想同时恢复多个数据库,您必须先停止它们,然后可以通过指定逗号分隔的备份工件路径列表来修改命令,并移除 <database> 参数。如果您正在替换现有数据库,您还应该跳过后续的 CREATE DATABASE 步骤。

    如果您知道在您想要恢复到的日期之前提交的最后一个事务的事务 ID,您可以使用 --restore-until= 参数,将事务 ID 而不是日期作为其值。例如,--restore-until=123

  2. 使用针对 system 数据库的 CREATE DATABASE 命令创建新数据库

    CREATE DATABASE mydatabase;

恢复位于云存储中的备份

在 Neo4j 2025.03 中,引入了新的云集成设置,以更好地支持云生态系统中的部署和管理。详情请参阅配置设置 → 云存储集成设置

以下示例展示了如何使用 --from-path 选项恢复位于云存储桶中的数据库。

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 restore 命令以恢复位于您的 AWS S3 存储中的数据库。该示例假定您的备份工件位于存储桶中的 myBucket/myDirectory 文件夹中。

    bin/neo4j-admin database restore --from-path=s3://myBucket/myDirectory/myBackup.backup 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 restore 命令以恢复位于您的 Google 存储桶中给定文件夹中的数据库。该示例假定您的备份工件位于存储桶中的 myBucket/myDirectory 文件夹中。

    bin/neo4j-admin database restore --to-path=gs://myBucket/myDirectory/myBackup.backup 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 官方文档:默认 Azure 凭据

    az login

    然后您就可以在 neo4j 或 neo4j-admin 中使用 Azure URL 了。

  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 restore 命令以恢复位于您的 Azure Blob 存储容器中给定文件夹中的数据库。该示例假定您的备份工件位于 myStorageAccount/myContainer/myDirectory 文件夹中。

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

在集群中恢复数据库备份

要在集群中恢复数据库备份,请指定其中一台服务器作为种子服务器,并在该服务器上恢复数据库备份。然后,使用该服务器在集群中的其他服务器上创建恢复的数据库。更多信息,请参阅指定种子服务器

恢复用户和角色元数据

如果您使用 --include-metadata 选项备份了数据库,您可以手动恢复用户和角色元数据。

<NEO4J_HOME> 目录中,您可以使用Cypher Shell 运行 neo4j-admin database restore 命令输出的 Cypher 脚本 data/databases/databasename/tools/metadata_script.cypher

使用 cat (UNIX)

cat data/databases/databasename/tools/metadata_script.cypher | bin/cypher-shell -u user -p password -a ip_address:port -d system --param "database => 'databasename'"

使用 type (Windows)

type data\databases\databasename\tools\metadata_script.cypher | bin\cypher-shell.bat -u user -p password -a ip_address:port -d system --param "database => 'databasename'"