重新创建数据库

重新创建过程

重新创建过程允许您

  • 将数据库存储更改为指定的备份,同时保留数据库的所有相关权限。

  • 在数据库丢失(例如,由于灾难)后,使其再次可写入。有关更多信息,请参阅灾难恢复

  • 2025.02 新增 删除数据库的数据和架构,同时保留分配给每个角色的数据库权限。

  • 2025.04 新增 清除数据和架构时更改数据库存储格式。

重新创建过程仅适用于真实用户数据库,不适用于复合数据库或 system 数据库。

请记住,重新创建过程会导致存储更新期间的停机。时间是无限制的,可能取决于不同因素——例如,存储大小、网络速度等。

在 Neo4j 2025.04 中,dbms.cluster.recreateDatabase() 过程已被弃用,取而代之的是 dbms.recreateDatabase()

语法

dbms.recreateDatabase(database :: STRING, options = {} :: MAP)

输入参数是数据库名称以及用于重新创建数据库的种子和拓扑选项列表。

表 1. 重新创建过程的种子和拓扑选项
选项 描述

seedingServers

可能的种子服务器列表。您可以定义可用服务器或提供空列表。有关详细信息,请参阅使用可用服务器作为种子

seedURI

通过 URI 指定的外部源。

clearData 2025.02 新增

允许您删除数据库的数据和架构,同时保留分配给每个角色的数据库权限。

storeFormat 2025.04 新增

允许您在清除数据和架构时更改数据库存储格式。

primaries

重新创建的数据库的主分配数。如果设置了 primaries 而未设置 secondaries,则 secondaries 将设置为 0。有关更多详细信息,请参阅更改拓扑

secondaries

重新创建的数据库的辅助分配数。您不能在没有 primaries 的情况下设置 secondaries。

先决条件和注意事项

重新创建时,相关数据库可以是 onlineoffline 状态,但成功的操作将启动数据库,无论其之前的状态如何。

如果您的数据库启用了变更数据捕获 (CDC),则在重新创建数据库时,CDC 链将停止,即使在重新创建的数据库中 CDC 仍然启用。要恢复 CDC 功能,请按照指南了解如何从现有数据库初始化 CDC 应用程序

在重新创建数据库之前,需要处理任何可能存在的隔离状态。有关更多信息,请参阅标准数据库 → 错误处理

您需要CREATE DATABASEDROP DATABASE 权限才能运行重新创建过程。

此外,在集群部署中,您可以在重新创建过程中选择修改拓扑

但是,请注意,在重新创建期间,存储格式(直到 Neo4j 2025.04)、访问和富集无法更改。从 2025.04 开始,只有在使用 clearData 选项时才能更改存储格式。

要检查重新创建是否成功,请使用 SHOW DATABASES 命令并验证所有分配均已启动。

种子选项

重新创建数据库时使用的存储可以通过不同方式定义。一种方法使用备份,而其他方法使用集群中的可用分配。

您可以使用 seedURIseedingServers 来指定应从中重新创建数据库的源。

  • 如果两者都不定义,则会抛出错误。

  • 如果两者都定义,则 seedingServers 必须是一个空列表。有关详细信息,请参阅未定义服务器与回退备份

  • 如果 seedingServers 不为空且 seedURI 也已定义,则会发生错误。

使用备份作为种子

如果您提供备份或转储的 URI,则所有分配上的存储将由给定 URI 处的备份或转储替换。新的分配可以放置在集群中的任何 ENABLED 服务器上。有关更多详细信息,请参阅从 URI 种子

CALL dbms.recreateDatabase("neo4j", {seedURI: "s3://myBucket/myBackup.backup"});

使用可用服务器作为种子

重新创建完成后,数据库将拥有来自种子服务器的最新数据存储。

重新创建基于可用剩余存储或用户明确指定的特定存储。丢失或未明确指定的存储将从重新创建过程中排除。因此,如果排除的存储包含比所用存储更新的数据,则可能会发生数据丢失。

指定服务器

您可以指定一组可用服务器。所有分配上的存储将同步到来自已定义服务器的最新存储。定义的服务器数量不能超过所需拓扑中的总分配数量。

CALL dbms.recreateDatabase("neo4j", {seedingServers: ["serverId1", "serverId2", "serverId3"]});
未定义服务器

如果您提供一个空的种子服务器列表并且未指定 seedURI,Neo4j 将选择当前已启用且未隔离的服务器上的数据库所有分配(primaries 和 secondaries)作为种子源。

在运行过程之前,请确保所有不可用服务器都已隔离;否则,该过程将失败。

要确定数据库的分配位置,请使用 SHOW DATABASES 命令。要识别托管所需数据库的所有已启用和可用服务器,请运行 SHOW SERVERS 命令。服务器必须显示 health = Availablestatus = Enabled。通过运行 dbms.cluster.cordonServer() 过程来隔离所有不可达服务器。

然后 Neo4j 将选择集群中最新的可用种子源来重新创建数据库。

CALL dbms.recreateDatabase("neo4j", {seedingServers: []});
未定义服务器与回退备份

如果同时提供了空的种子服务器列表和 seedURI,Neo4j 将查找数据库的所有分配并将其用作种子源。不可用服务器必须被隔离。

但是,如果找不到可用服务器,数据库将根据 URI 指定的备份或转储重新创建。这意味着如果最新种子源可用,则存储将由其替换;否则,将使用备份。

CALL dbms.recreateDatabase("neo4j", {seedingServers: [], seedURI: "s3://myBucket/myBackup.backup"});

更改拓扑

在集群部署中,重新创建数据库时可以选择定义新拓扑。这在灾难期间可能很有益,如果无法获得足够的服务器来以原始拓扑重新创建数据库。在重新创建期间减少总分配数量时,请务必记住种子服务器的数量不能超过数据库的总分配数量。在使用空种子列表进行重新创建时也同样适用。如果集群中托管数据库的可用服务器数量多于新分配的数量,则重新创建将失败。

CALL dbms.recreateDatabase("neo4j", {seedingServers: [], primaries: 3, secondaries: 0});

清除数据选项

在 Neo4j 2025.02 中,clearData 选项被添加到重新创建过程中。此选项允许您删除数据库的数据(例如,节点和关系)和架构(例如,约束和索引)。这意味着您将得到一个空的存储,但与其他重新创建数据库选项一样,所有与数据库关联的权限都将被保留。

使用清除数据选项意味着数据和架构将被永久删除。如果您希望以后能够恢复它们,请务必在清除数据库之前进行备份。有关更多信息,请参阅在线备份

更改数据库存储格式

在 Neo4j 2025.04 中,数据库存储格式也可以在重新创建期间更改,但仅当指定了 clearData 选项时。

有关 Neo4j 中可用数据库存储格式的更多详细信息,请参阅存储格式。如果未定义存储格式选项,则重新创建的数据库将保留与重新创建之前相同的存储格式。

CALL dbms.recreateDatabase("neo4j", {clearData: true, storeFormat: "block"});
© . All rights reserved.