教程:在集群中备份和恢复单个数据库

本教程详细示例了如何在正在运行(已升级/迁移)的 4.x 集群中备份和恢复数据库(本示例为 3.5 版本)。

以下示例假设您的数据库关联了用户和角色,并描述了如何备份数据库、将其迁移到独立实例中,然后将其恢复到正在运行的集群中。有关如何设置集群的更多信息,请参阅操作手册 → 设置本地集群

在 Neo4j DBMS 中,每个数据库都是独立备份的。因此,为每个数据库规划备份策略非常重要。有关如何为您的设置设计合适的备份策略的更多详细信息,请参阅操作手册 3.5 → 备份

准备备份数据库

在执行备份之前,最好记录下要恢复的数据库的数据和元数据。您可以使用这些信息稍后验证恢复是否成功,并重新创建数据库用户和角色。在本示例中,数据库使用 Neo4j Browser → Favorites → Example Graphs 中的电影图谱数据集。

  1. 在数据库正在运行的 3.5 Neo4j 实例中,导航到 /bin 文件夹,并使用您的凭据登录到 Cypher® Shell 命令行控制台。有关 Cypher Shell 命令行界面 (CLI) 及其使用方法的更多信息,请参阅操作手册 → Cypher Shell

    ./cypher-shell -u neo4j -p <password>
    Connected to Neo4j at neo4j://localhost:7687 as user neo4j.
    Type :help for a list of available commands or :exit to exit the shell.
    Note that Cypher queries must end with a semicolon.
  2. 运行查询以计算数据库中的节点数量。

    MATCH (n) RETURN count(n) AS countNode;
    +-----------+
    | countNode |
    +-----------+
    | 171       |
    +-----------+
    
    1 row available after 22 ms, consumed after another 1 ms
  3. 运行查询以计算关系数量。

    MATCH (n)-[r]->() RETURN count(r) AS countRelationships;
    +--------------------+
    | countRelationships |
    +--------------------+
    | 253                |
    +--------------------+
    
    1 row available after 29 ms, consumed after another 0 ms
  4. 运行以下两个查询以查看是否定义了模式。

    CALL db.constraints()
    0 rows available after 2 ms, consumed after another 0 ms

    结果显示没有定义任何约束。

    CALL db.indexes;
    +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | description              | indexName | tokenNames | properties | state    | type                  | progress | provider                              | id | failureMessage |
    +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
    | "INDEX ON :Movie(title)" | "index_1" | ["Movie"]  | ["title"]  | "ONLINE" | "node_label_property" | 100.0    | {version: "1.0", key: "native-btree"} | 1  | ""             |
    +----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

    结果显示在 :Movie 节点的 title 属性上定义了一个索引。

  5. 运行查询以列出与此数据库关联的所有用户及其角色。

    CALL dbms.security.listUsers;
    +-----------------------------------------+
    | username | roles                | flags |
    +-----------------------------------------+
    | "user1"  | ["editor", "reader"] | []    |
    | "neo4j"  | ["admin"]            | []    |
    +-----------------------------------------+
    
    2 rows available after 2 ms, consumed after another 0 ms

    结果显示两个用户 - 默认的 neo4j 用户,具有 admin 权限;以及一个自定义用户 user1,具有内置角色 editorreader 的组合权限。

  6. 退出 Cypher Shell 命令行控制台。

    :exit;
    
    Bye!

备份数据库

现在您可以备份数据库了。

导航到 /bin 文件夹,然后运行以下命令将数据库备份到目标文件夹。如果您要存放备份的文件夹不存在,则必须创建它。在此示例中,它名为 /tmp/3.5.24

./neo4j-admin backup --backup-dir=/tmp/3.5.24 --name=graphdbbackup

有关执行备份和不同命令选项的详细信息,请参阅操作手册 3.5 → 执行备份

将数据库备份迁移到 4.x 独立实例

要迁移数据库备份并升级其存储,您可以启动一个独立的 Neo4j 实例并使用 neo4j-admin restore 命令。

neo4j-admin restore 必须以 neo4j 用户身份调用,以确保适当的文件权限。有关更多信息,请参阅操作手册 → 管理命令

如果在备份数据库时禁用了 --prepare-restore 选项,则在恢复数据库之前必须运行 neo4j-admin prepare-restore 命令。这是为了应用备份时拉取但尚未应用到存储的最新事务。有关更多信息,请参阅准备恢复数据库

  1. 在 4.x 独立实例的 neo4j.conf 文件中,设置 dbms.allow_upgrade=true

  2. 启动服务器。

  3. 导航到 /bin 文件夹并运行以下命令以恢复数据库备份。

    ./neo4j-admin restore --from=/tmp/3.5.24/graphdbbackup --database=graphdbbackup
  4. 运行以下命令以验证数据库 graphdbbackup 是否存在

    ls -al ../data/databases
    total 0
    drwxr-xr-x@  6 username  staff   192  4 Dec 14:15 .
    drwxr-xr-x@  5 username  staff   160  7 Dec 09:35 ..
    drwxr-xr-x  42 username  staff  1344  4 Dec 14:15 graphdbbackup
    drwxr-xr-x  37 username  staff  1184  4 Dec 14:06 neo4j
    -rw-r--r--   1 username  staff     0  4 Dec 14:06 store_lock
    drwxr-xr-x  38 username  staff  1216  4 Dec 14:06 system

    然而,恢复数据库不会自动创建它。因此,如果您在 Cypher Shell 或 Neo4j Browser 中执行 SHOW DATABASES,它将不可见。

  5. 登录到 Cypher Shell 命令行控制台。

  6. 将活动数据库更改为 system (:USE system;),并创建 graphdbbackup 数据库。

    CREATE DATABASE graphdbbackup;
    0 rows available after 145 ms, consumed after another 0 ms
  7. 验证 graphdbbackup 数据库是否在线。

    SHOW DATABASES;
    +-------------------------------------------------------------------------------------------------------+
    | name            | address          | role         | requestedStatus | currentStatus | error | default |
    +-------------------------------------------------------------------------------------------------------+
    | "graphdbbackup" | "localhost:7687" | "standalone" | "online"        | "online"      | ""    | FALSE   |
    | "neo4j"         | "localhost:7687" | "standalone" | "online"        | "online"      | ""    | TRUE    |
    | "system"        | "localhost:7687" | "standalone" | "online"        | "online"      | ""    | FALSE   |
    +-------------------------------------------------------------------------------------------------------+
    
    3 rows available after 175 ms, consumed after another 9 ms
  8. 将活动数据库更改为 graphdbbackup,并重复准备备份数据库一节中的步骤 2、3 和 4,以验证所有数据是否已成功恢复。

备份已迁移的数据库

要在集群中恢复已迁移的数据库,您需要创建其备份。

导航到 /bin 文件夹,然后运行以下命令将数据库备份到目标文件夹。如果您要存放备份的文件夹不存在,则必须创建它。在此示例中,它名为 /tmp/4.0.11

./neo4j-admin backup --backup-dir=/tmp/4.0.11 --database=graphdbbackup

有关执行备份和不同命令选项的详细信息,请参阅操作手册 → 备份在线数据库

现在您可以将已迁移的数据库备份恢复到正在运行的集群中了。

在所有集群成员上恢复已迁移的数据库

在每个集群成员上,导航到 /bin 文件夹,然后运行以下命令以恢复已迁移数据库的备份。有关执行恢复和不同命令选项的详细信息,请参阅操作手册 → 恢复命令

./neo4j-admin restore --from=/tmp/4.0.11/graphdbbackup --database=graphdbbackup

然后,在每个集群成员上,运行以下命令以验证数据库 graphdbbackup 是否存在

ls -al ../data/databases
total 0
drwxr-xr-x@  6 username  staff   192  7 Dec 09:41 .
drwxr-xr-x@  5 username  staff   160  4 Dec 14:17 ..
drwxr-xr-x  38 username  staff  1216  7 Dec 09:41 graphdbbackup
drwxr-xr-x  37 username  staff  1184  7 Dec 08:57 neo4j
-rw-r--r--   1 username  staff     0  4 Dec 14:17 store_lock
drwxr-xr-x  38 username  staff  1216  7 Dec 08:56 system

在集群主节点上创建数据库备份

仅在其中一个集群成员上使用 CREATE DATABASE 命令创建数据库备份。该命令会自动路由到主节点,然后从主节点路由到其他集群成员。

  1. 在其中一个集群成员的 Cypher Shell 命令行控制台中,使用 system 数据库并创建 graphdbbackup 数据库。

    CREATE DATABASE graphdbbackup;
    0 rows available after 132 ms, consumed after another 0 ms
  2. 验证 graphdbbackup 数据库在所有成员上均已在线。

    SHOW DATABASES;
    +-----------------------------------------------------------------------------------------------------+
    | name            | address          | role       | requestedStatus | currentStatus | error | default |
    +-----------------------------------------------------------------------------------------------------+
    | "graphdbbackup" | "localhost:7689" | "follower" | "online"        | "online"      | ""    | FALSE   |
    | "graphdbbackup" | "localhost:7688" | "leader"   | "online"        | "online"      | ""    | FALSE   |
    | "graphdbbackup" | "localhost:7687" | "follower" | "online"        | "online"      | ""    | FALSE   |
    | "neo4j"         | "localhost:7689" | "leader"   | "online"        | "online"      | ""    | TRUE    |
    | "neo4j"         | "localhost:7688" | "follower" | "online"        | "online"      | ""    | TRUE    |
    | "neo4j"         | "localhost:7687" | "follower" | "online"        | "online"      | ""    | TRUE    |
    | "system"        | "localhost:7689" | "leader"   | "online"        | "online"      | ""    | FALSE   |
    | "system"        | "localhost:7688" | "follower" | "online"        | "online"      | ""    | FALSE   |
    | "system"        | "localhost:7687" | "follower" | "online"        | "online"      | ""    | FALSE   |
    +-----------------------------------------------------------------------------------------------------+
  3. 将活动数据库更改为 graphdbbackup,并完成准备备份数据库一节中的步骤 2、3 和 4,以验证所有数据是否已成功恢复。

重新创建数据库用户和角色

在所有集群成员上,使用您在准备备份数据库一节步骤 5 中记录的笔记和Cypher 手册 → Cypher 管理命令,手动重新创建已恢复数据库的所有用户和角色。

示例 1. 对 system 数据库运行以下命令,以重新创建 graphdbbackup 数据库的自定义用户和角色。
  1. 创建用户 user1

    CREATE USER user1 IF NOT EXISTS
    SET PASSWORD 'password'
    SET STATUS ACTIVE;
  2. 授予用户 user1 reader 角色。

    GRANT ROLE reader TO user1;
  3. 授予用户 user1 editor 角色。

    GRANT ROLE editor TO user1;
  4. 验证用户 user1 是否具有与数据库备份中相同的角色。

    SHOW USERS;
    +---------------------------------------------------------------------+
    | user    | roles                | passwordChangeRequired | suspended |
    +---------------------------------------------------------------------+
    | "neo4j" | ["admin"]            | FALSE                  | FALSE     |
    | "user1" | ["editor", "reader"] | TRUE                   | FALSE     |
    +---------------------------------------------------------------------+
© . All rights reserved.