重新创建数据库

重建过程

重建过程允许您执行以下操作:

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

  • 在数据库丢失(例如,由于灾难)后,使其重新变为可写状态。更多信息,请参阅 灾难恢复

  • 2025.02 引入 删除数据库的数据和模式,同时保留分配给每个角色的数据库权限。

  • 2025.04 引入 在清除数据和模式时更改数据库存储格式。

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

请记住,重建过程会导致存储更新期间出现停机。停机时间是不确定的,可能取决于多种因素,例如存储大小、网络速度等。

在 Neo4j 2025.04 中,dbms.cluster.recreateDatabase() 过程已被弃用,建议改用 dbms.recreateDatabase()

语法

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

输入参数包括数据库名称以及用于重建数据库的种子设定(seeding)和拓扑选项。

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

seedingServers

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

seedURI

通过 URI 指定的外部源。

clearData 2025.02 引入

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

storeFormat 2025.04 引入

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

primaries

重建数据库的主副本分配数量。如果您设置了主副本数量而未设置从副本,则从副本数被设置为 0。更多细节,请参阅 更改拓扑

secondaries

重建数据库的从副本分配数量。如果不设置主副本,则无法设置从副本。

先决条件与注意事项

重建时,相关数据库可以处于 online(在线)或 offline(离线)状态,但无论其先前状态如何,成功执行操作后数据库都将启动。

如果您的数据库启用了变更数据捕获 (CDC),则在重建数据库时 CDC 链将停止,即使在重建后的数据库中 CDC 仍然保持启用状态。要恢复 CDC 功能,请遵循关于如何从现有数据库初始化 CDC 应用程序的指南。

在重建数据库之前,需要先处理任何已隔离的状态。更多信息,请参阅 标准数据库 → 错误处理

运行重建过程需要具备 CREATE DATABASEDROP DATABASE 权限

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

但是请注意,存储格式(在 Neo4j 2025.04 之前)、访问权限和富集(enrichment)无法在重建期间更改。从 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 将选择当前已启用且未被隔离 (non-cordoned) 的服务器上该数据库的所有分配(主副本和从副本)作为种子来源。

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

要确定数据库的分配位置,请使用 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"});