本节介绍备份和恢复 MySQL 集群,以及完整和部分恢复操作的示例。请注意,backup cluster
和restore
cluster
命令
NDB
仅适用于表格;使用其他 MySQL 存储引擎(例如
InnoDB
或
MyISAM
)的表将被忽略。
出于示例的目的,我们使用名为
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 集群的完整还原,请按照此处列出的步骤操作:
确定要使用的备份。
在此示例中,我们使用 ID 为 4 的备份,该备份是
mycluster
为本节之前创建的。擦除 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)
恢复备份。
这是使用
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客户端获取表
列表,您可以使用多个
语句或一个查询,例如:
NDB
NDB
SHOW 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 cluster
start cluster
--initial
mycluster
mycluster
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
如本节前面所述。