MySQL Cluster Manager 8.0.31 用户手册  / 第 4 章使用 MySQL 集群管理器  / 4.6 使用 MySQL Cluster Manager 备份和恢复 MySQL NDB Cluster  /  3.6.2 使用 MySQL Cluster Manager 进行基本的 MySQL Cluster 备份和恢复

3.6.2 使用 MySQL Cluster Manager 进行基本的 MySQL Cluster 备份和恢复

本节介绍备份和恢复 MySQL 集群,以及完整和部分恢复操作的示例。请注意,backup clusterrestore cluster命令 NDB仅适用于表格;使用其他 MySQL 存储引擎(例如 InnoDBMyISAM)的表将被忽略。

出于示例的目的,我们使用名为 mycluster其进程和状态的 MySQL 集群,可以在此处看到:

mcm> show status -r mycluster;
+--------+----------+----------+---------+-----------+-----------+
| NodeId | Process  | Host     | Status  | Nodegroup | Package   |
+--------+----------+----------+---------+-----------+-----------+
| 49     | ndb_mgmd | tonfisk  | running |           | mypackage |
| 1      | ndbd     | tonfisk  | running | 0         | mypackage |
| 2      | ndbd     | tonfisk  | running | 0         | mypackage |
| 50     | mysqld   | tonfisk  | running |           | mypackage |
| 51     | mysqld   | tonfisk  | running |           | mypackage |
| 52     | ndbapi   | *tonfisk | added   |           |           |
| 53     | ndbapi   | *tonfisk | added   |           |           |
+--------+----------+----------+---------+-----------+-----------+
7 rows in set (0.08 sec)

mycluster您可以使用该 命令 查看是否存在任何现有备份 list backups,如下所示:

mcm> list backups mycluster;
+----------+--------+---------+---------------------+---------+
| BackupId | NodeId | Host    | Timestamp           | Comment |
+----------+--------+---------+---------------------+---------+
| 1        | 1      | tonfisk | 2012-12-04 12:03:52 |         |
| 1        | 2      | tonfisk | 2012-12-04 12:03:52 |         |
| 2        | 1      | tonfisk | 2012-12-04 12:04:15 |         |
| 2        | 2      | tonfisk | 2012-12-04 12:04:15 |         |
| 3        | 1      | tonfisk | 2012-12-04 12:17:41 |         |
| 3        | 2      | tonfisk | 2012-12-04 12:17:41 |         |
+----------+--------+---------+---------------------+---------+
6 rows in set (0.12 sec)

简单的备份。  要创建备份,请使用以backup cluster集群名称作为参数的命令,类似于此处显示的内容:

mcm> backup cluster mycluster;
+-------------------------------+
| Command result                |
+-------------------------------+
| Backup completed successfully |
+-------------------------------+
1 row in set (3.31 sec)

backup cluster只需要将集群的名称作为参数进行备份;有关此命令支持的其他选项的信息,请参阅 第 4.7.2 节 “backup cluster命令”。要验证 的新备份是否mycluster使用唯一 ID 创建,请检查 的输出list backups,如下所示(其中与新备份文件对应的行用强调文本表示):

mcm> list backups mycluster;
+----------+--------+---------+---------------------+---------+
| BackupId | NodeId | Host    | Timestamp           | Comment |
+----------+--------+---------+---------------------+---------+
| 1        | 1      | tonfisk | 2012-12-04 12:03:52 |         |
| 1        | 2      | tonfisk | 2012-12-04 12:03:52 |         |
| 2        | 1      | tonfisk | 2012-12-04 12:04:15 |         |
| 2        | 2      | tonfisk | 2012-12-04 12:04:15 |         |
| 3        | 1      | tonfisk | 2012-12-04 12:17:41 |         |
| 3        | 2      | tonfisk | 2012-12-04 12:17:41 |         |
| 4        | 1      | tonfisk | 2012-12-12 14:24:35 |         |
| 4        | 2      | tonfisk | 2012-12-12 14:24:35 |         |
+----------+--------+---------+---------------------+---------+
8 rows in set (0.04 sec)

如果您尝试创建 MySQL 集群的备份,其中每个节点组都没有至少一个数据节点在运行, 则会backup cluster失败并显示错误Backup cannot be performed as processes are stopped in cluster cluster_name

简单的完全恢复。  要从具有给定 ID 的备份执行 MySQL 集群的完整还原,请按照此处列出的步骤操作:

  1. 确定要使用的备份。

    在此示例中,我们使用 ID 为 4 的备份,该备份是mycluster为本节之前创建的。

  2. 擦除 MySQL 集群数据。

    执行此操作的最简单方法是停止然后执行集群的初始启动,如此处所示,使用 mycluster

    mcm> stop cluster mycluster;
    +------------------------------+
    | Command result               |
    +------------------------------+
    | Cluster stopped successfully |
    +------------------------------+
    1 row in set (15.24 sec)
    
    mcm> start cluster --initial mycluster;
    +------------------------------+
    | Command result               |
    +------------------------------+
    | Cluster started successfully |
    +------------------------------+
    1 row in set (34.47 sec)
  3. 恢复备份。

    这是使用restore cluster命令完成的,该命令需要备份 ID 和集群名称作为参数。因此,您可以将备份 4 恢复mycluster为如下所示:

    mcm> restore cluster --backupid=4 mycluster;
    +--------------------------------+
    | Command result                 |
    +--------------------------------+
    | Restore completed successfully |
    +--------------------------------+
    1 row in set (16.78 sec)

部分恢复——丢失的图像。  可以使用 MySQL Cluster Manager 执行 MySQL Cluster 的部分恢复,即从一个或多个数据节点的备份映像不可用的备份中恢复。如果我们希望恢复 mycluster到备份编号 6,这是必需的,因为此备份的映像仅可用于节点 1,如mcm客户端(强调文本) 的输出list backups中所示:

mcm> list backups mycluster;
+----------+--------+---------+---------------------+---------+
| BackupId | NodeId | Host    | Timestamp           | Comment |
+----------+--------+---------+---------------------+---------+
| 1        | 1      | tonfisk | 2012-12-04 12:03:52 |         |
| 1        | 2      | tonfisk | 2012-12-04 12:03:52 |         |
| 2        | 1      | tonfisk | 2012-12-04 12:04:15 |         |
| 2        | 2      | tonfisk | 2012-12-04 12:04:15 |         |
| 3        | 1      | tonfisk | 2012-12-04 12:17:41 |         |
| 3        | 2      | tonfisk | 2012-12-04 12:17:41 |         |
| 4        | 1      | tonfisk | 2012-12-12 14:24:35 |         |
| 4        | 2      | tonfisk | 2012-12-12 14:24:35 |         |
| 5        | 1      | tonfisk | 2012-12-12 14:31:31 |         |
| 5        | 2      | tonfisk | 2012-12-12 14:31:31 |         |
| 6        | 1      | tonfisk | 2012-12-12 14:32:09 |         |
+----------+--------+---------+---------------------+---------+
11 rows in set (0.08 sec)

要仅恢复我们有图像的那些节点(在本例中,仅节点 1),我们可以 --skip-nodeid在执行 restore cluster命令时使用该选项。此选项会导致在执行还原时跳过一个或多个节点。假设mycluster已清除数据(如本节前面所述),我们可以执行跳过节点 2 的恢复,如下所示:

mcm> restore cluster --backupid=6 --skip-nodeid=2 mycluster;
+--------------------------------+
| Command result                 |
+--------------------------------+
| Restore completed successfully |
+--------------------------------+
1 row in set (17.06 sec)

因为我们从恢复过程中排除了节点 2,所以没有数据分发给它。为了在部分恢复后将 MySQL 集群数据分发到任何此类排除或跳过的节点,有必要通过 在mysql客户端中为集群中的每个 表执行ALTER ONLINE TABLE ... REORGANIZE PARTITION语句来 手动重新分发数据。要从mysql客户端获取表 列表,您可以使用多个 语句或一个查询,例如: NDBNDBSHOW TABLES

SELECT CONCAT('' TABLE_SCHEMA, '.', TABLE_NAME)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE ENGINE='ndbcluster';

您可以使用刚刚显示的查询的更详细版本生成必要的 SQL 语句,例如此处使用的查询:

mysql> SELECT
    ->     CONCAT('ALTER ONLINE TABLE `', TABLE_SCHEMA,
    ->            '`.`', TABLE_NAME, '` REORGANIZE PARTITION;')
    ->     AS Statement
    -> FROM INFORMATION_SCHEMA.TABLES
    -> WHERE ENGINE='ndbcluster';
+--------------------------------------------------------------------------+
| Statement                                                                |
+--------------------------------------------------------------------------+
| ALTER ONLINE TABLE `mysql`.`ndb_apply_status` REORGANIZE PARTITION;      |
| ALTER ONLINE TABLE `mysql`.`ndb_index_stat_head` REORGANIZE PARTITION;   |
| ALTER ONLINE TABLE `mysql`.`ndb_index_stat_sample` REORGANIZE PARTITION; |
| ALTER ONLINE TABLE `db1`.`n1` REORGANIZE PARTITION;                      |
| ALTER ONLINE TABLE `db1`.`n2` REORGANIZE PARTITION;                      |
| ALTER ONLINE TABLE `db1`.`n3` REORGANIZE PARTITION;                      |
| ALTER ONLINE TABLE `test`.`n1` REORGANIZE PARTITION;                     |
| ALTER ONLINE TABLE `test`.`n2` REORGANIZE PARTITION;                     |
| ALTER ONLINE TABLE `test`.`n3` REORGANIZE PARTITION;                     |
| ALTER ONLINE TABLE `test`.`n4` REORGANIZE PARTITION;                     |
+--------------------------------------------------------------------------+
10 rows in set (0.09 sec)

部分恢复——添加数据节点。  当备份后将新数据节点添加到 MySQL 集群时,也可以执行部分​​恢复。--skip-nodeid在这种情况下,您可以在执行 restore cluster命令时排除使用的新节点 。考虑如以下命令 mycluster 的输出所示 命名的 MySQL 集群:show status

mcm> show status -r mycluster;
+--------+----------+----------+---------+-----------+-----------+
| NodeId | Process  | Host     | Status  | Nodegroup | Package   |
+--------+----------+----------+---------+-----------+-----------+
| 49     | ndb_mgmd | tonfisk  | stopped |           | mypackage |
| 1      | ndbd     | tonfisk  | stopped | 0         | mypackage |
| 2      | ndbd     | tonfisk  | stopped | 0         | mypackage |
| 50     | mysqld   | tonfisk  | stopped |           | mypackage |
| 51     | mysqld   | tonfisk  | stopped |           | mypackage |
| 52     | ndbapi   | *tonfisk | added   |           |           |
| 53     | ndbapi   | *tonfisk | added   |           |           |
+--------+----------+----------+---------+-----------+-----------+
7 rows in set (0.03 sec)

的输出list backups 向我们展示了该集群的可用备份映像:

mcm> list backups mycluster;
+----------+--------+---------+---------------------+---------+
| BackupId | NodeId | Host    | Timestamp           | Comment |
+----------+--------+---------+---------------------+---------+
| 1        | 1      | tonfisk | 2012-12-04 12:03:52 |         |
| 1        | 2      | tonfisk | 2012-12-04 12:03:52 |         |
| 2        | 1      | tonfisk | 2012-12-04 12:04:15 |         |
| 2        | 2      | tonfisk | 2012-12-04 12:04:15 |         |
| 3        | 1      | tonfisk | 2012-12-04 12:17:41 |         |
| 3        | 2      | tonfisk | 2012-12-04 12:17:41 |         |
| 4        | 1      | tonfisk | 2012-12-12 14:24:35 |         |
| 4        | 2      | tonfisk | 2012-12-12 14:24:35 |         |
+----------+--------+---------+---------------------+---------+
8 rows in set (0.06 sec)

现在假设,在稍后的某个时间点,mycluster使用 add process命令添加了 2 个数据节点。现在的 show status输出 mycluster如下所示:

mcm> show status -r mycluster;
+--------+----------+----------+---------+-----------+-----------+
| NodeId | Process  | Host     | Status  | Nodegroup | Package   |
+--------+----------+----------+---------+-----------+-----------+
| 49     | ndb_mgmd | tonfisk  | running |           | mypackage |
| 1      | ndbd     | tonfisk  | running | 0         | mypackage |
| 2      | ndbd     | tonfisk  | running | 0         | mypackage |
| 50     | mysqld   | tonfisk  | running |           | mypackage |
| 51     | mysqld   | tonfisk  | running |           | mypackage |
| 52     | ndbapi   | *tonfisk | added   |           |           |
| 53     | ndbapi   | *tonfisk | added   |           |           |
| 3      | ndbd     | tonfisk  | running | 1         | mypackage |
| 4      | ndbd     | tonfisk  | running | 1         | mypackage |
+--------+----------+----------+---------+-----------+-----------+
9 rows in set (0.01 sec)

由于节点 3 和 4 未包含在备份中,因此我们需要在执行还原时将它们排除在外。您可以 通过使用该选项restore cluster指定以逗号分隔的节点 ID 列表来跳过多个数据节点。--skip-nodeid假设我们刚刚使用mcm客户端命令 清除mycluster了 MySQL 集群数据, 如本节前面所述;然后我们可以从备份编号 4(当只有编号为 1 和 2 的 2 个数据节点 时创建)恢复(现在有编号为 1、2、3 和 4 的 4个数据节点),如下所示:stop clusterstart cluster --initialmyclustermycluster

mcm> restore cluster --backupid=4 --skip-nodeid=3,4 mycluster;
+--------------------------------+
| Command result                 |
+--------------------------------+
| Restore completed successfully |
+--------------------------------+
1 row in set (17.61 sec)

没有数据分发到跳过的(新)节点;您必须强制节点 3 和 4 包含在数据的重新分配中, ALTER ONLINE TABLE ... REORGANIZE PARTITION如本节前面所述。