复制数据库存储
您可以使用 neo4j-admin database copy
命令来复制数据库、创建压缩/碎片整理后的数据库副本、清理数据库不一致性,或者从 Neo4j 4.4 直接迁移到任何 5.x 版本。neo4j-admin database copy
命令会回收未使用的空间,创建数据存储的碎片整理副本,并创建节点标签和关系类型查找索引。
命令
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,label
、My.property
。将创建一个名为 <database-name>-schema.cypher 的文件,其中包含在副本上重新创建索引/约束所需的 schema 命令。
您可以使用 --copy-schema
选项自动复制 schema。索引将在数据库首次启动时构建。此选项可以将 schema 从任何 4.4 和 5.x 版本复制到 5.26 LTS 及更高版本。
参数
参数 | 描述 |
---|---|
|
源数据库的名称。 |
|
目标数据库的名称。如果与 |
如果您不需要数据库的实际副本,则可以将 <fromDatabase>
和 <toDatabase>
设置为相同的值。该命令将用新创建的副本替换原始数据库。
选项
neo4j-admin database copy
命令有以下选项
选项 | 描述 | 默认值 | ||
---|---|---|---|---|
|
包含附加配置的配置文件。 |
|||
|
默认情况下,节点存储在复制时不会压缩,因为这会改变节点 ID。请使用此选项强制执行节点存储压缩。 |
|
||
|
一个逗号分隔的属性键列表,用于包含在具有指定标签的节点副本中。任何未明确提及的标签都将包含其所有属性在副本中。不能与 |
|||
|
一个逗号分隔的标签列表。所有具有指定标签中任何一个的节点都将包含在副本中。不能与 |
|||
|
一个逗号分隔的属性键列表,用于包含在具有指定类型的关系副本中。任何未明确提及的关系类型都将包含其所有属性在副本中。不能与 |
|||
|
一个逗号分隔的关系类型列表。所有具有指定类型中任何一个的关系都将包含在副本中。不能与 |
|||
|
复制 schema 而不是生成 schema 语句,即索引和约束定义。索引将在数据库首次启动时构建。 |
|||
|
允许在配置值评估中进行命令扩展。 |
|||
|
即使无法验证数据库的完整性,也强制运行该命令。 |
|||
|
数据库目录的路径,其中包含要从中获取数据的数据库目录。它可用于定位安装外部的数据库。 |
|
||
|
事务目录的路径,其中包含要从中获取数据的数据库事务目录。 |
|
||
|
显示此帮助消息并退出。 |
|||
|
一个逗号分隔的标签列表。具有指定标签中任何一个的节点将不包含在副本中。不能与 |
|||
|
一个逗号分隔的关系类型列表。具有指定关系类型中任何一个的关系将不包含在副本中。不能与 |
|||
|
2025.01 版本引入 neo4j-admin 可用于各种数据结构和缓存以提高性能的最大内存量。值可以是纯数字,例如 10000000,或 20G 表示 20 GB。也可以指定为可用内存的百分比,例如 70%。 |
|
||
|
一个逗号分隔的要忽略的标签列表。 |
|||
|
一个逗号分隔的属性键列表,用于忽略具有指定标签的节点。不能与 |
|||
|
一个逗号分隔的要忽略的属性键列表。不能与 |
|||
|
一个逗号分隔的属性键列表,用于忽略具有指定类型的关系。不能与 |
|||
|
用作暂存区域的目录路径,当源数据库和目标数据库相同时使用。默认是当前目录。 |
|||
|
设置新数据库的格式。必须是
|
|
||
|
数据库目录的路径,其中包含要作为目标数据库的目录。 |
|
||
|
创建 schema 命令文件的目录路径。默认是当前目录。 |
|||
|
事务目录的路径,其中包含要作为目标数据库的事务目录。 |
|
||
|
启用详细输出。 |
|||
1. 有关详细信息,请参阅Neo4j Admin 和 Neo4j CLI → 配置。 |
Neo4j 2025.01 引入了一个双命名选项 新选项确定复制过程中可用于读写的最大堆外内存量,而不是指定读取源时分配多少缓存。 有关详细信息,请参阅提高性能。 请注意, |
示例
复制数据库的数据存储
您可以使用 neo4j-admin database copy
命令复制数据库(例如 neo4j
)的数据存储。
-
停止名为
neo4j
的数据库STOP DATABASE neo4j
-
将数据存储从
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
-
验证数据库是否已成功复制
ls -al ../data/databases
复制数据库不会自动创建它。因此,如果您此时执行
SHOW DATABASES
,它将不可见。 -
创建复制的数据库。
CREATE DATABASE database-copy
-
验证新数据库是否在线。
SHOW DATABASES
复制数据库时过滤数据
您可以使用 neo4j-admin database copy
命令在复制数据库时过滤掉任何不需要的数据,例如通过移除节点、标签、属性和关系。
bin/neo4j-admin database copy neo4j copy --ignore-nodes-with-labels="Cat,Dog"
该命令创建 neo4j
数据库的副本,但不会包含带有 :Cat
和 :Dog
标签的节点。
标签是独立处理的,即过滤器会忽略任何带有 |
有关如何使用 |
进一步压缩现有数据库
您可以使用 neo4j-admin database copy
命令和 -compact-node-store
参数来进一步压缩现有数据库的存储。
本示例对 <toDatabase>
和 <fromDatabase>
使用相同的值,这意味着该命令将通过创建数据库的新版本来就地压缩数据库。运行命令后,您需要使用生成的脚本重新创建索引。如果数据库属于集群,您还需要从该服务器重新播种集群。有关更多信息,请参阅指定种子节点。
请注意,即使最终只有一个数据库副本,但在操作过程中您仍然需要双倍的空间。 |
-
停止名为
neo4j
的数据库STOP DATABASE neo4j
-
使用该命令压缩
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。
-
启动
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%
MB/s = (IOPS * B) ÷ 10^6
,其中 B
是以字节为单位的块大小;在 Neo4j 的情况下,此值为 8000
。GB/小时可以根据 (MB/s * 3600) ÷ 1000
计算得出。