复制数据库存储

您可以使用 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, --max-off-heap-memory=<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,labelMy.property。将创建一个名为 <database-name>-schema.cypher 的文件,其中包含在副本上重新创建索引/约束所需的 schema 命令。

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

参数

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

<fromDatabase>

源数据库的名称。

<toDatabase>

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

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

选项

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

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

--additional-config=<file>[1]

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

--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

复制 schema 而不是生成 schema 语句,即索引和约束定义。索引将在数据库首次启动时构建。

--expand-commands

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

--force

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

--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 结合使用。

--from-pagecache, --max-off-heap-memory=<size>

2025.01 版本引入 neo4j-admin 可用于各种数据结构和缓存以提高性能的最大内存量。值可以是纯数字,例如 10000000,或 20G 表示 20 GB。也可以指定为可用内存的百分比,例如 70%。

90%

--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>

用作暂存区域的目录路径,当源数据库和目标数据库相同时使用。默认是当前目录。

--to-format=<format>

设置新数据库的格式。必须是 samestandardhigh_limitalignedblock 之一。same 将使用与源相同的格式。

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

same

--to-path-data=<path>

数据库目录的路径,其中包含要作为目标数据库的目录。

server.directories.data/databases

--to-path-schema=<path>

创建 schema 命令文件的目录路径。默认是当前目录。

--to-path-txn=<path>

事务目录的路径,其中包含要作为目标数据库的事务目录。

server.directories.transaction.logs.root

--verbose

启用详细输出。

1. 有关详细信息,请参阅Neo4j Admin 和 Neo4j CLI → 配置

块格式是所有新创建数据库的默认格式,只要它们未指定 db.format 设置。有关块格式的更多信息,请参阅存储格式

Neo4j 2025.01 引入了一个双命名选项 --from-pagecache, --max-off-heap-memory=<size>,它增强了 --from-pagecache=<size> 选项的功能。

新选项确定复制过程中可用于读写的最大堆外内存量,而不是指定读取源时分配多少缓存。

有关详细信息,请参阅提高性能

请注意,--from-pagecache 选项可能会在未来版本中移除。

示例

复制数据库的数据存储

您可以使用 neo4j-admin database copy 命令复制数据库(例如 neo4j)的数据存储。

  1. 停止名为 neo4j 的数据库

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

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

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

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

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

    ls -al ../data/databases

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

  4. 创建复制的数据库。

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

    SHOW DATABASES

复制数据库时过滤数据

您可以使用 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 可用于指定一个不同的目录作为临时暂存区域。如果省略,将使用当前工作目录。

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

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

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

    START DATABASE neo4j

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

估算处理时间

neo4j-admin database copy 命令所需时间的估算可以基于以下因素进行:

  • 与其他许多数据库一样,Neo4j 以 8K 页进行 I/O 操作。

  • 您的磁盘制造商将提供其可处理的最大 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 小时的估算。

提高性能

您可以通过指定内存限制来提高复制过程的性能。Neo4j 2025.01 引入了一个选项 --from-pagecache, --max-off-heap-memory=<size>,以取代旧的 --from-pagecache=<size> 选项。

新选项控制复制过程除了 JVM 已分配的堆大小之外,还可以使用多少堆外内存。值可以是纯数字,例如 10000000,或 20G 表示 20 GB。也可以指定为可用内存的百分比,例如 70%。

从 2025.01 版本开始,要配置堆外内存值,您可以使用旧名称 --from-pagecache=<size> 或新名称 --max-off-heap-memory=<size>

使用 --from-pagecache=<size>
bin/neo4j-admin database copy neo4j copy --from-pagecache=95%
使用 --max-off-heap-memory=<size>
bin/neo4j-admin database copy neo4j copy --max-off-heap-memory=95%

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