恢复数据库备份

命令

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

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

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

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

如果您使用 CDC,请确保使用相同的txLogEnrichment值创建此新数据库,并在您的 CDC 应用程序中处理 CDC 数据的潜在丢失或损坏,请参阅更改数据捕获手册→恢复备份和快照

恢复备份链时,首先必须重放差异备份构件中包含的事务日志。此恢复操作需要大量资源,并且可以通过使用aggregate命令将其与恢复操作分离。

语法

neo4j-admin database restore [-h] [--expand-commands]
                             [--verbose] [--overwrite-destination[=true|false]]
                             [--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>

包含其他配置的配置文件。

--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 日期和时间。恢复将恢复在提供的日期时间之前提交的事务。

--to-path-data=<path>

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

--to-path-txn=<path>

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

--temp-path=<path>

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

--verbose

启用详细输出。

--from-path=<path> 选项还可以从 AWS S3 存储桶(从 Neo4j 5.19 开始)、Google Cloud 存储桶(从 Neo4j 5.21 开始)和 Azure 存储桶(从 Neo4j 5.24 开始)加载备份。有关更多信息,请参见恢复位于云存储中的备份

Neo4j 5.24 引入了--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,则数据库的最后一个事务 ID 将为14

恢复数据库备份

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

恢复完整备份

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

    bin/neo4j-admin database restore --from-path=/path/to/backups/neo4j-2023-05-05T11-26-38.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;

恢复位于云存储中的备份

以下示例显示了如何使用--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 官方文档 — 使用 AWS CLI 使用 Amazon S3使用 AWS CLI 使用高级(s3)命令

  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 官方文档中的说明安装gcloudCLI — 安装 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 对gcloudCLI 进行身份验证

      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 Cloud Storage 存储桶中给定文件夹中的数据库。此示例假设您的备份工件位于存储桶中的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

    然后,您应该准备好使用 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 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/scripts/databasename/restore_metadata.cypher

使用cat(UNIX)

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

使用type(Windows)

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