复制数据库存储

您可以使用 neo4j-admin database copy 命令复制数据库,创建数据库的压缩/碎片整理副本,清理数据库不一致,或直接从 Neo4j 4.4 迁移到任何 5.x 版本。neo4j-admin database copy 会回收未使用的空间,创建 数据存储 的碎片整理副本,并创建节点标签和关系类型查找索引。

命令限制
  • neo4j-admin database copy 会保留节点 ID(除非使用 --compact-node-store),但关系会获得新的 ID。

  • neo4j-admin database copy 不支持在 system 数据库上使用。

  • neo4j-admin database copy 不支持在 复合数据库 上使用。它必须直接在与该复合数据库关联的数据库上运行。

  • neo4j-admin database copy 是一个 IOPS 密集型过程。有关更多信息,请参阅 估计处理时间

命令

neo4j-admin database copy 将现有脱机数据库的数据存储复制到新数据库。

语法

neo4j-admin database copy [-h] [--copy-schema] [--expand-commands] [--force] [--verbose] [--compact-node-store[=true|false]]
                             [--additional-config=<file>] [--from-pagecache=<size>] [--temp-path=<path>] [--to-format=<format>]
                             [--to-path-schema=<path>] [--copy-only-node-properties=<label.property>[,<label.property>...]]...
                             [--copy-only-nodes-with-labels=<label>[,<label>...]]... [--copy-only-relationship-properties=<relationship.
                             property>[,<relationship.property>...]]... [--copy-only-relationships-with-types=<type>[,<type>...]]...
                             [--ignore-nodes-with-labels=<label>[,<label>...]]... [--ignore-relationships-with-types=<type>[,<type>...]]...
                             [--skip-labels=<label>[,<label>...]]... [--skip-node-properties=<label.property>[,<label.property>...]]...
                             [--skip-properties=<property>[,<property>...]]... [--skip-relationship-properties=<relationship.property>[,
                             <relationship.property>...]]... [--from-path-data=<path> --from-path-txn=<path>] [--to-path-data=<path>
                             --to-path-txn=<path>] <fromDatabase> <toDatabase>

描述

此命令将创建数据库的副本。如果您的标签、属性或关系包含点或逗号,则可以使用 ` 进行转义,例如 My,label. property 。将创建一个名为 <database-name>-schema.cypher 的文件,其中包含在副本上重新创建索引/约束所需的模式命令。

从 Neo4j 5.20 开始,您可以使用 --copy-schema 选项自动复制模式。索引将在数据库首次启动时构建。此选项可以将模式从任何 4.4 和 5.x 版本复制到 5.20 及更高版本。

参数

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

<fromDatabase>

源数据库的名称。

<toDatabase>

目标数据库的名称。如果与 <fromDatabase> 相同,则默认情况下,它将被复制到临时位置(当前工作目录或由 --temp-path 定义的路径),然后再移动到替换原始数据库。

从 Neo4j 5.5 开始,如果您不需要数据库的实际副本,则可以使用 <fromDatabase><toDatabase> 的相同值。该命令将用新创建的副本替换原始数据库。

选项

neo4j-admin database copy 命令具有以下选项

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

--additional-config=<file>

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

--compact-node-store[=true|false]

默认情况下,节点存储在复制时不会被压缩,因为这会更改节点 ID。请使用此选项强制执行节点存储压缩。

false

--copy-only-node-properties=<label.property>[,<label.property>…​]

要包含在具有指定标签的节点的副本中的属性键的逗号分隔列表。任何未明确提及的标签都将在副本中包含所有其属性。不能与 --skip-properties--skip-node-properties 组合使用。

--copy-only-nodes-with-labels=<label>[,<label>…​]

标签的逗号分隔列表。所有具有任何指定标签的节点都将包含在副本中。不能与 --ignore-nodes-with-labels 组合使用。

--copy-only-relationship-properties=<relationship.property>[,<relationship.property>…​]

要包含在具有指定类型的关系的副本中的属性键的逗号分隔列表。任何未明确提及的关系类型都将在副本中包含所有其属性。不能与 --skip-properties--skip-relationship-properties 组合使用。

--copy-only-relationships-with-types=<type>[,<type>…​]

关系类型的逗号分隔列表。具有任何指定类型的所有关系都将包含在副本中。不能与 --ignore-relationships-with-types 组合使用。

--copy-schema

在 5.20 中引入 复制模式而不是生成模式语句,这意味着索引和约束定义。索引将在数据库首次启动时构建。此选项可以将模式从任何 4.4 和 5.x 版本复制到 5.20 及更高版本。

--expand-commands

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

--force

即使无法验证数据库的完整性,也强制命令运行。

--from-pagecache=<size>

用于读取的页面缓存的大小。

您可以使用 --from-pagecache 选项通过指定读取时要分配多少缓存来加快复制操作的速度。--from-pagecache 应分配您可以空闲的任何内存,因为 Neo4j 会从源进行随机读取。

8m

--from-path-data=<path>

数据库目录的路径,其中包含要从中提取的数据库目录。它可以用于定位安装之外的数据库。

server.directories.data/databases

--from-path-txn=<path>

事务目录的路径,其中包含要从中提取的数据库的事务目录。

server.directories.transaction.logs.root

-h, --help

显示此帮助消息并退出。

--ignore-nodes-with-labels=<label>[,<label>…​]

标签的逗号分隔列表。具有任何指定标签的节点将不会包含在副本中。不能与 --copy-only-nodes-with-labels 组合使用。

--ignore-relationships-with-types=<type>[,<type>…​]

关系类型的逗号分隔列表。具有任何指定关系类型的关系将不会包含在副本中。不能与 --copy-only-relationships-with-types 组合使用。

--skip-labels=<label>[,<label>…​]

要忽略的标签的逗号分隔列表。

--skip-node-properties=<label.property>[,<label.property>…​]

要为具有指定标签的节点忽略的属性键的逗号分隔列表。不能与 --skip-properties--copy-only-node-properties 组合使用。

--skip-properties=<property>[,<property>…​]

要忽略的属性键的逗号分隔列表。不能与 --skip-node-properties--copy-only-node-properties--skip-relationship-properties--copy-only-relationship-properties 组合使用。

--skip-relationship-properties=<relationship.property>[,<relationship.property>…​]

要为具有指定类型的关系忽略的属性键的逗号分隔列表。不能与 --skip-properties--copy-only-relationship-properties 组合使用。

--temp-path=<path>

在 5.24 中引入 当源数据库和目标数据库相同时用作暂存区域的目录的路径。默认值为当前目录。

--to-format=<format>

设置新数据库的格式。必须是以下之一:samestandardhigh_limitalignedblocksame 将使用与源相同的格式。

如果您从 high_limit 转到 standardaligned,则不会验证数据是否实际适合。

same

--to-path-data=<path>

数据库目录的路径,其中包含要从中提取的目标数据库目录。

server.directories.data/databases

--to-path-schema=<path>

在其中创建模式命令文件的目录的路径。默认值为当前目录。

--to-path-txn=<path>

事务目录的路径,其中包含要从中提取的目标数据库的事务目录。

server.directories.transaction.logs.root

--verbose

启用详细输出。

块格式是在 Neo4j 5.14 中引入的,从 Neo4j 5.22 开始,是所有新创建数据库的默认格式,只要它们没有指定 db.format 设置。有关块格式的更多信息,请参阅 存储格式

示例

复制数据库的数据存储

您可以使用 neo4j-admin database copy 复制数据库的数据存储,例如,neo4j

  1. 停止名为 neo4j 的数据库

    STOP DATABASE neo4j
  2. 将数据存储从 neo4j 复制到名为 database-copy 的新数据库。

    如果您不需要数据库的实际副本,则可以使用 <fromDatabase><toDatabase> 的相同值。该命令将用新创建的副本替换原始数据库。

    从 Neo4j 5.20 开始,您可以使用 --copy-schema 选项自动复制模式。索引将在数据库首次启动时构建。此选项会将模式从任何 4.4 和 5.x 版本复制到 5.20 及更高版本。

    对于以前的版本,您需要使用保存在 <database-name>-schema.cypher 文件中的 Cypher 语句手动重新创建模式。

    bin/neo4j-admin database copy neo4j database-copy
  3. 验证数据库是否已成功复制

    ls -al ../data/databases

    复制数据库不会自动创建数据库。因此,如果您此时执行 SHOW DATABASES,它将不可见。

  4. 创建复制的数据库。

    CREATE DATABASE database-copy
  5. 验证新数据库是否联机。

    SHOW DATABASES
  6. (对于 Neo4j 5.20 之前的版本) 如果您的原始数据库定义了模式,请将您的活动数据库更改为复制的数据库,并使用保存在 <database-name>-schema.cypher 文件中的模式命令重新创建模式。

复制数据库时过滤数据

您可以使用 neo4j-admin database copy 在复制数据库时过滤掉任何不需要的数据,例如,通过删除节点、标签、属性和关系。

bin/neo4j-admin database copy neo4j copy --ignore-nodes-with-labels="Cat,Dog"

该命令创建数据库 neo4j 的副本,但不包含具有标签 :Cat:Dog 的节点。

标签是独立处理的,即,过滤器会忽略任何具有标签 :Cat:Dog 或两者都有的节点。

有关如何使用 neo4j-admin database copy 过滤数据以对数据库进行分片的详细示例,请参阅 使用 copy 命令对数据进行分片

进一步压缩现有数据库

您可以使用命令 neo4j-admin database copy 以及参数 -compact-node-store 来进一步压缩现有数据库的存储。
此示例使用相同的 <toDatabase><fromDatabase> 值,这意味着该命令将通过创建数据库的新版本来就地压缩数据库。运行命令后,您需要使用生成的脚本重新创建索引。如果数据库属于集群,您还需要从该服务器重新播种集群。有关更多信息,请参阅 指定播种器.

请注意,即使最终只有一个数据库副本,您在操作期间仍然需要两倍的空间。

  1. 停止名为 neo4j 的数据库

    STOP DATABASE neo4j
  2. 使用以下命令压缩 neo4j 数据库

    bin/neo4j-admin database copy neo4j neo4j --compact-node-store --temp-path=<my-prefered-staging-area>

    --temp-path 在 Neo4j 5.24 中引入,可用于指定要作为临时暂存区使用的不同目录。如果省略,将使用当前工作目录。

    从 Neo4j 5.20 开始,您可以使用 --copy-schema 选项自动复制模式。索引将在数据库首次启动时构建。此选项可以将模式从任何 4.4 和 5.x 版本复制到 5.20 及更高版本。

    对于以前的版本,您需要使用保存在 <database-name>-schema.cypher 文件中的 Cypher 语句手动重新创建模式。

  3. 启动 neo4j 数据库。这是新创建的数据库版本。

    START DATABASE neo4j
  4. (对于 Neo4j 5.20 之前的版本)如果您的原始数据库定义了模式,请使用保存在文件 <database-name>-schema.cypher 中的模式命令重新创建模式。

有关如何回收未用空间的详细示例,请参阅 回收未用空间.

估计处理时间

可以根据以下内容估算 neo4j-admin database copy 命令需要多长时间

  • Neo4j 与许多其他数据库一样,以 8K 页进行 IO。

  • 您的磁盘制造商将提供其可以处理的最大 IOPS 值。

例如,如果您的磁盘制造商提供了 5000 IOPS 的最大值,您就可以合理地预期每秒最多有 5000 次这样的页面操作。因此,您可以在该磁盘上预期获得的最大理论吞吐量为 40MB/s(或 144 GB/小时)。然后,您可以假设在该 5000 IOPS 磁盘上运行 neo4j-admin database copy 的最佳情况是处理 144 GB 数据库至少需要 1 个小时。 [1]

但是,重要的是要记住,该过程必须从源数据库读取 144 GB,并且还必须写入目标存储(假设目标存储的大小相当)。此外,复制过程中的内部过程会多次读取/修改/写入存储。因此,在额外增加 144 GB 的读取和写入的情况下,在 5000 IOPS 磁盘上运行 neo4j-admin database copy 的最佳情况是,处理 144 GB 数据库至少需要 3 个小时

最后,还要注意,在几乎所有云环境中,发布的 IOPS 值可能与实际值不同,或者可能无法持续保持最大可能的 IOPS。此示例的实际处理时间可能远高于 3 小时的估算值。


1. 计算基于 MB/s = (IOPS * B) ÷ 10^6,其中 B 是以字节为单位的块大小;在 Neo4j 的情况下,它是 8000。然后,可以根据 (MB/s * 3600) ÷ 1000 计算 GB/小时。