从 URI 创建数据库

此方法使用由 URI 指定的外部来源中的相同种子(seed)来初始化所有数据库。

您可以在 CREATE DATABASE 命令中指定种子 URI 作为参数。

CREATE DATABASE foo OPTIONS { existingData: 'use', seedURI:'s3://myBucket/myBackup.backup' }
CREATE DATABASE foo OPTIONS { seedURI:'s3://myBucket/myBackup.backup' }

在 Cypher 5 中需要 existingData 选项,而在 Cypher 25 中该选项已被弃用。

种子的下载和验证仅在新数据库启动时执行。如果失败,数据库将不可用,并且 SHOW DATABASES 命令会显示 statusMessage 为:Unable to start database

SHOW DATABASES 的失败输出示例
| name    | type       | aliases | access       | address          | role      | writer | requestedStatus | currentStatus | statusMessage                                            | default | home  | constituents |
+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| "seed3" | "standard" | []      | "read-write" | "localhost:7682" | "unknown" | FALSE  | "online"        | "offline"     | "Unable to start database `DatabaseId{3fe1a59b[seed3]}`" | FALSE   | FALSE | []           |

要确定问题原因,请检查 debug.log 文件。

从 Neo4j 2025.01 开始,基于 URI 的种子还可以与 CREATE OR REPLACE DATABASE 结合使用。

Neo4j 中的种子提供程序

种子可以是完整备份、增量备份(请参阅 CloudSeedProvider)或现有数据库的转储文件(dump)。当使用 CloudSeedProvider 时,URI 还可以指向包含备份链的文件夹。这些种子来源被称为种子提供程序

备份文件具有 .backup 扩展名,而转储文件可以使用用户选择的任何扩展名。例如,备份文件可以命名为 myBackup.backup,而转储文件可以命名为 myDump.dumpmyBackup.backup,或是任何其他名称。

该机制是可插拔的,允许支持新的种子来源(有关详细信息,请参阅 Java 参考 → 实现自定义种子提供程序)。

该产品内置了对以下挂载文件系统(file)、FTP 服务器、HTTP/HTTPS 服务器、Amazon S3、Google Cloud Storage 和 Azure Cloud Storage 的种子支持。

默认支持 Amazon S3、Google Cloud Storage 和 Azure Cloud Storage,但其他提供程序需要配置 dbms.databases.seed_from_uri_providers

FileSeedProvider

FileSeedProvider 支持

  • file

本地文件路径必须是绝对路径。

URLConnectionSeedProvider

URLConnectionSeedProvider 支持以下协议

  • ftp

  • http

  • https

从 Neo4j 2025.01 开始,URLConnectionSeedProvider 不再支持 file。这适用于 Cypher 5 和 Cypher 25。

CloudSeedProvider

CloudSeedProvider 支持

  • s3

  • gs

  • azb

CloudSeedProvider 支持使用 增量备份 文件作为种子。使用提供的增量备份文件时,CloudSeedProvider 会在包含增量备份文件的目录中搜索以该增量备份结尾的 备份链,然后使用此备份链进行种子初始化。

Neo4j 使用 AWS SDK v2 通过 AWS URL 调用 AWS 上的 API。或者,您可以使用系统变量 aws.endpointUrls3aws.endpointUrlS3aws.endpointUrl,或环境变量 AWS_ENDPOINT_URL_S3AWS_ENDPOINT_URL 来覆盖端点,以便 AWS SDK 可以与 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 命令设置您的 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. myBackup.backup 创建数据库。此备份可以是完整备份、增量备份或转储文件。

    使用 Cypher 5

    CREATE DATABASE foo OPTIONS { existingData: 'use', seedURI: 's3://myBucket/myBackup.backup' }

    使用 Cypher 25 引入于 2025.06

    CREATE DATABASE foo OPTIONS { seedURI: 's3://myBucket/myBackup.backup' }
  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. myBackup.backup 创建数据库。此备份可以是完整备份、增量备份或转储文件。

    使用 Cypher 5

    CREATE DATABASE foo OPTIONS { existingData: 'use', seedURI: 'gs://myBucket/myBackup.backup' }

    使用 Cypher 25 引入于 2025.06

    CREATE DATABASE foo OPTIONS { seedURI: 'gs://myBucket/myBackup.backup' }
  1. 确保您拥有 Azure 帐户、Azure 存储帐户和 blob 容器。

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

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

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

  3. 使用默认 Azure 凭据针对 Azure 对 neo4j 或 neo4j-admin 进程进行身份验证。
    有关详细信息,请参阅 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. myBackup.backup 创建数据库。此备份可以是完整备份、增量备份或转储文件。

    使用 Cypher 5

    CREATE DATABASE foo OPTIONS { existingData: 'use', seedURI: 'azb://myStorageAccount/myContainer/myBackup.backup' }

    使用 Cypher 25 引入于 2025.06

    CREATE DATABASE foo OPTIONS { seedURI: 'azb://myStorageAccount/myContainer/myBackup.backup' }

S3SeedProvider

S3SeedProvider 支持

  • s3: 5.26 中弃用

Neo4j 捆绑了 AWS S3 连接所需的库。因此,如果您使用 S3SeedProvider,则不需要像使用 CloudSeedProvider 那样配置 aws cli

S3SeedProvider 需要额外的配置。这是通过 seedConfig 选项指定的,该选项接受逗号分隔的配置列表。每个配置项均以 key=value 的格式指定,如下所示

CREATE DATABASE foo OPTIONS {
    existingData: 'use',
    seedURI: 's3://myBucket/myBackup.backup',
    seedConfig: 'region=eu-west-1'
}

S3SeedProvider 还需要传入凭据。这些凭据通过 seedCredentials 选项指定。种子凭据会从 Cypher 命令安全地传递给托管数据库的每个服务器。为了使其生效,必须在集群中的每个服务器上将 Neo4j 配置为具有相同的密钥库(keystore)。这与远程别名所需的配置相同,请参阅 配置带有远程数据库别名的 DBMS。如果没有此配置,seedCredentials 选项将会失败。

CREATE DATABASE foo OPTIONS {
    existingData: 'use',
    seedURI: 's3://myBucket/myBackup.backup',
    seedConfig: 'region=eu-west-1',
    seedCredentials: <accessKey>;<secretKey>
}

其中 <accessKey><secretKey> 由 AWS 提供。

种子提供程序参考

URL 方案 种子提供程序 URI 示例

file

FileSeedProvider

file:/tmp/backup1.backup file:/tmp/backup1.dump

ftp

URLConnectionSeedProvider

ftp://myftp.com/backups/backup1.backup ftp://myftp.com/backups/backup1.dump

http

URLConnectionSeedProvider

http://myhttp.com/backups/backup1.backup http://myhttp.com/backups/backup1.dump

https

URLConnectionSeedProvider

https://myhttp.com/backups/backup1.backup https://myhttp.com/backups/backup1.dump

s3

S3SeedProvider 5.26 中弃用,
CloudSeedProvider

s3://mybucket/backups/backup1.backup s3://mybucket/backups/backup1.dump s3://mybucket/backups/ (包含备份链的文件夹,仅由 CloudSeedProvider 使用)

gs

CloudSeedProvider

gs://mybucket/backups/backup1.backup gs://mybucket/backups/backup1.dump gs://mybucket/backups/ (包含备份链的文件夹)

azb

CloudSeedProvider

azb://mystorageaccount.blob/backupscontainer/backup1.backup azb://mystorageaccount.blob/backupscontainer/backup1.dump azb://mystorageaccount.blob/backupscontainer/ (包含备份链的文件夹)

支持基于日期或事务 ID 进行种子初始化

从 Neo4j 2025.01 开始,在创建数据库时,可以通过 seedRestoreUntil 选项将种子初始化到特定日期或事务 ID。

CloudSeedProviderFileSeedProvider 支持 seedRestoreUntil 选项。

初始化到特定日期

要初始化到特定日期,请提供包含该日期之前数据的增量备份。

CREATE DATABASE foo OPTIONS {
    existingData: 'use',
    seedURI: 's3://myBucket/myBackup.backup',
    seedRestoreUntil: datetime('2019-06-01T18:40:32.142+0100')
}
CREATE DATABASE foo OPTIONS {
    seedURI: 's3://myBucket/myBackup.backup',
    seedRestoreUntil: datetime('2019-06-01T18:40:32.142+0100')
}

这将使用在提供的日期之前提交的事务来初始化数据库。

初始化到特定事务 ID

要初始化到特定事务 ID,请提供包含该事务 ID 之前数据的增量备份。

CREATE DATABASE foo OPTIONS {
    existingData: 'use',
    seedURI: 's3://myBucket/myBackup.backup',
    seedRestoreUntil: 123
}
CREATE DATABASE foo OPTIONS {
    seedURI: 's3://myBucket/myBackup.backup',
    seedRestoreUntil: 123
}

这将使用事务 123 之前(不包括 123)的事务来初始化数据库。