复制数据库存储
您可以使用 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=<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 及更高版本。
参数
参数 | 描述 |
---|---|
|
源数据库的名称。 |
|
目标数据库的名称。如果与 |
从 Neo4j 5.5 开始,如果您不需要数据库的实际副本,则可以使用 <fromDatabase>
和 <toDatabase>
的相同值。该命令将用新创建的副本替换原始数据库。
选项
neo4j-admin database copy
命令具有以下选项
选项 | 描述 | 默认值 | ||
---|---|---|---|---|
|
包含附加配置的配置文件。 |
|||
|
默认情况下,节点存储在复制时不会被压缩,因为这会更改节点 ID。请使用此选项强制执行节点存储压缩。 |
|
||
|
要包含在具有指定标签的节点的副本中的属性键的逗号分隔列表。任何未明确提及的标签都将在副本中包含所有其属性。不能与 |
|||
|
标签的逗号分隔列表。所有具有任何指定标签的节点都将包含在副本中。不能与 |
|||
|
要包含在具有指定类型的关系的副本中的属性键的逗号分隔列表。任何未明确提及的关系类型都将在副本中包含所有其属性。不能与 |
|||
|
关系类型的逗号分隔列表。具有任何指定类型的所有关系都将包含在副本中。不能与 |
|||
|
在 5.20 中引入 复制模式而不是生成模式语句,这意味着索引和约束定义。索引将在数据库首次启动时构建。此选项可以将模式从任何 4.4 和 5.x 版本复制到 5.20 及更高版本。 |
|||
|
允许在配置值评估中扩展命令。 |
|||
|
即使无法验证数据库的完整性,也强制命令运行。 |
|||
|
用于读取的页面缓存的大小。
|
|
||
|
数据库目录的路径,其中包含要从中提取的数据库目录。它可以用于定位安装之外的数据库。 |
|
||
|
事务目录的路径,其中包含要从中提取的数据库的事务目录。 |
|
||
|
显示此帮助消息并退出。 |
|||
|
标签的逗号分隔列表。具有任何指定标签的节点将不会包含在副本中。不能与 |
|||
|
关系类型的逗号分隔列表。具有任何指定关系类型的关系将不会包含在副本中。不能与 |
|||
|
要忽略的标签的逗号分隔列表。 |
|||
|
要为具有指定标签的节点忽略的属性键的逗号分隔列表。不能与 |
|||
|
要忽略的属性键的逗号分隔列表。不能与 |
|||
|
要为具有指定类型的关系忽略的属性键的逗号分隔列表。不能与 |
|||
|
在 5.24 中引入 当源数据库和目标数据库相同时用作暂存区域的目录的路径。默认值为当前目录。 |
|||
|
设置新数据库的格式。必须是以下之一:
|
|
||
|
数据库目录的路径,其中包含要从中提取的目标数据库目录。 |
|
||
|
在其中创建模式命令文件的目录的路径。默认值为当前目录。 |
|||
|
事务目录的路径,其中包含要从中提取的目标数据库的事务目录。 |
|
||
|
启用详细输出。 |
示例
复制数据库的数据存储
您可以使用 neo4j-admin database copy
复制数据库的数据存储,例如,neo4j
。
-
停止名为
neo4j
的数据库STOP DATABASE neo4j
-
将数据存储从
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
-
验证数据库是否已成功复制
ls -al ../data/databases
复制数据库不会自动创建数据库。因此,如果您此时执行
SHOW DATABASES
,它将不可见。 -
创建复制的数据库。
CREATE DATABASE database-copy
-
验证新数据库是否联机。
SHOW DATABASES
-
(对于 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
的节点。
标签是独立处理的,即,过滤器会忽略任何具有标签 |
有关如何使用 |
进一步压缩现有数据库
您可以使用命令 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
在 Neo4j 5.24 中引入,可用于指定要作为临时暂存区使用的不同目录。如果省略,将使用当前工作目录。从 Neo4j 5.20 开始,您可以使用
--copy-schema
选项自动复制模式。索引将在数据库首次启动时构建。此选项可以将模式从任何 4.4 和 5.x 版本复制到 5.20 及更高版本。对于以前的版本,您需要使用保存在 <database-name>-schema.cypher 文件中的 Cypher 语句手动重新创建模式。
-
启动
neo4j
数据库。这是新创建的数据库版本。START DATABASE neo4j
-
(对于 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 小时的估算值。
MB/s = (IOPS * B) ÷ 10^6
,其中 B
是以字节为单位的块大小;在 Neo4j 的情况下,它是 8000
。然后,可以根据 (MB/s * 3600) ÷ 1000
计算 GB/小时。