概述
本章,您将学习到 MySQL NDB Cluster 的数据恢复功能。
数据恢复的前提条件
- 管理节点的全局配置文件 config.ini 至少需要一个空的 "[mysqld]",以保留给其他应用程序使用,例如
ndb_restore命令 - 前面文章提到,在管理节点执行备份交互命令后,相关的文件默认保存在数据节点的数据目录下(所有数据节点的数据目录为 /usr/local/mysql/data/),作者建议指定单独的备份目录
- 所有管理服务器(管理节点)的对应进程必须处于运行状态
-
恢复需要按照顺序依次执行:
- 关闭所有数据服务器(数据节点)处于活跃状态的 ndbd 进程。因数据服务器(数据节点)的 ndbd 进程处于完全停止的状态,所以所有的 SQL 服务器(SQL 节点)处于休眠的状态,休眠指的是 SQL 服务器(SQL 节点)对应的 mysqld 进程还在运行,只是还没有连接
- 将每个数据服务器(数据节点)的数据目录清空
- 每个数据服务器以
ndbd --initial形式启动 ndbd 进程,直到所有数据服务器的 ndbd 进程启动完毕 - 开始使用
ndb_restore命令
目前管理服务器(管理节点)全局配置文件的内容如下:
Shell (192.168.100.10)> cat /etc/mysql-cluster/config.ini
[ndbd default]
NoOfReplicas=2
DataMemory=98M
CompressedBackup=1
[ndb_mgmd]
HostName=192.168.100.10
DataDir=/var/log/mysql-cluster
NodeId=1
[ndbd]
HostName=192.168.100.12
NodeId=2
DataDir=/usr/local/mysql/data
[ndbd]
HostName=192.168.100.14
NodeId=3
DataDir=/usr/local/mysql/data
[ndbd]
HostName=192.168.100.18
NodeId=4
DataDir=/usr/local/mysql/data
[ndbd]
HostName=192.168.100.20
NodeId=5
DataDir=/usr/local/mysql/data
[mysqld]
HostName=192.168.100.16
NodeId=6
配置 config.ini
# 编辑管理节点的全局配置文件
Shell (192.168.100.10)> vim /etc/mysql-cluster/config.ini
[ndbd default]
NoOfReplicas=2
DataMemory=98M
CompressedBackup=1
BackupDataDir=/mysql-cluster-backup
[ndb_mgmd]
HostName=192.168.100.10
DataDir=/var/log/mysql-cluster
NodeId=1
[ndbd]
HostName=192.168.100.12
NodeId=2
DataDir=/usr/local/mysql/data
[ndbd]
HostName=192.168.100.14
NodeId=3
DataDir=/usr/local/mysql/data
[ndbd]
HostName=192.168.100.18
NodeId=4
DataDir=/usr/local/mysql/data
[ndbd]
HostName=192.168.100.20
NodeId=5
DataDir=/usr/local/mysql/data
[mysqld]
HostName=192.168.100.16
NodeId=6
[mysqld]
[mysqld]
执行第一次备份后,若备份 ID 为 1 ,则相关的文件存放在每个数据节点的 /mysql-cluster-backup/BACKUP/BACKUP-1/ 目录下。
创建相应的备份目录
在每个数据节点中创建对应的备份目录:
Shell (192.168.100.12)> mkdir -p /mysql-cluster-backup
Shell (192.168.100.14)> mkdir -p /mysql-cluster-backup
Shell (192.168.100.18)> mkdir -p /mysql-cluster-backup
Shell (192.168.100.20)> mkdir -p /mysql-cluster-backup
因为修改了管理节点的 config.ini,因此需要滚动重启所有节点,让配置生效:
- 完成集群中每个管理节点的滚动重启
- 完成集群中每个数据节点的滚动重启
- 完成集群中每个 SQL 节点的滚动重启
Shell (192.168.100.10) > killall ndb_mgmd && sleep 30s && ndb_mgmd --configdir=/etc/mysql-cluster/ -f /etc/mysql-cluster/config.ini --initial
# 数据节点的滚动重启(除了 kill 或 killall 命令之外的另外一种方式)
Shell (192.168.100.10) > ndb_mgm -e "all restart"
# SQL 节点的滚动重启
Shell (192.168.100.16) > killall mysqld && sleep 5s && /usr/local/mysql/support-files/mysql.server start
ndb_restore 命令
前文介绍了 MySQL NDB Cluster 的在线备份,若需要使用将数据从备份中恢复过来,则需要使用 ndb_restore 命令,常见选项有:
-n #或--nodeid=#- 指定还原的节点 ID--backupid=#或-b #- 指定备份 ID--restore-meta或-m- 还原元数据--restore-data或-r- 还原表记录以及事务日志--backup-path=DIR- 指定备份目录路径--include-databases=LIST- 要还原的库,多个库使用逗号分隔--exclude-databases=LIST- 要排除还原的库,多个库使用逗号分隔--include-tables=LIST- 要还原的表,多个表使用逗号分隔。必须以库名开始--exclude-tables=LIST- 要排除还原的表,多个表使用逗号分隔。必须以库名开始
比如:
ndb_restore ... --include-databases=db1 --exclude-tables=db1.t1- 表示还原 db1 库中的所有表,但 t1 表除外ndb_restore ... --exclude-tables=db1.t1 --include-databases=db1- 表示还原 db1 库中的所有表。因为 --include-databases 选项在最右边
数据的完整恢复过程
准备数据
在任意一个 SQL 节点上登录并执行以下的 SQL 语句:
Shell (192.168.100.16)> /usr/local/mysql/bin/mysql -h localhost -u root --password="Google-,Bing500"
MySQL > create database db1;
MySQL > use db1;
MySQL > create table if not exists t1(
id int unsigned primary key auto_increment,
name varchar(6) not null
) engine=ndbcluster ;
MySQL > insert into t1 values(null,'Jack'),(null,'Jason'),(null,'Tom');
MySQL > select * from t1;
+----+-------+
| id | name |
+----+-------+
| 2 | Jason |
| 1 | Jack |
| 3 | Tom |
+----+-------+
3 rows in set (0.01 sec)
MySQL > quit;
在线备份数据
Shell (192.168.100.10)> ndb_mgm
ndb_mgm> start backup encrypt password="Vc.Code.12"
Connected to management server at localhost port 1186 (using cleartext)
Waiting for completed, this may take several minutes
Node 2: Backup 1 started from node 1
Node 2: Backup 1 started from node 1 completed
StartGCP: 188 StopGCP: 191
#Records: 17 #LogRecords: 0
Data: 3332 bytes Log: 0 bytes
ndb_mgm> quit
开始数据恢复
假设 db1 这个库丢失:
Shell (192.168.100.16)> /usr/local/mysql/bin/mysql -h localhost -u root --password="Google-,Bing500"
MySQL > drop database db1;
MySQL > quit;
首先将所有在线的数据节点关闭(ALL 关键字表示所有的数据节点):
# NDB Cluster 处于正常运行状态
Shell (192.168.100.10)> ndb_mgm -e "show"
Connected to management server at localhost port 1186 (using cleartext)
Cluster Configuration
---------------------
[ndbd(NDB)] 4 node(s)
id=2 @192.168.100.12 (mysql-8.4.8 ndb-8.4.8, Nodegroup: 0, *)
id=3 @192.168.100.14 (mysql-8.4.8 ndb-8.4.8, Nodegroup: 0)
id=4 @192.168.100.18 (mysql-8.4.8 ndb-8.4.8, Nodegroup: 1)
id=5 @192.168.100.20 (mysql-8.4.8 ndb-8.4.8, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.100.10 (mysql-8.4.8 ndb-8.4.8)
[mysqld(API)] 3 node(s)
id=6 @192.168.100.16 (mysql-8.4.8 ndb-8.4.8)
id=7 (not connected, accepting connect from any host)
id=8 (not connected, accepting connect from any host)
# 停止所有的数据节点
Shell (192.168.100.10)> ndb_mgm -e "all stop"
# 192.168.100.16 的 mysqld 进程还在
Shell (192.168.100.10)> ndb_mgm -e "show"
Connected to management server at localhost port 1186 (using cleartext)
Cluster Configuration
---------------------
[ndbd(NDB)] 4 node(s)
id=2 (not connected, accepting connect from 192.168.100.12)
id=3 (not connected, accepting connect from 192.168.100.14)
id=4 (not connected, accepting connect from 192.168.100.18)
id=5 (not connected, accepting connect from 192.168.100.20)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.100.10 (mysql-8.4.8 ndb-8.4.8)
[mysqld(API)] 3 node(s)
id=6 (not connected, accepting connect from 192.168.100.16)
id=7 (not connected, accepting connect from any host)
id=8 (not connected, accepting connect from any host)
对每个数据节点的数据目录进行清空:
Shell (192.168.100.12) > rm -rf /usr/local/mysql/data/*
Shell (192.168.100.14) > rm -rf /usr/local/mysql/data/*
Shell (192.168.100.18) > rm -rf /usr/local/mysql/data/*
Shell (192.168.100.20) > rm -rf /usr/local/mysql/data/*
以初始化方式启动所有的 ndbd 进程:
Shell (192.168.100.12)> ndbd --initial
Shell (192.168.100.14)> ndbd --initial
Shell (192.168.100.18)> ndbd --initial
Shell (192.168.100.20)> ndbd --initial
开始全库的数据恢复(-m 选项只能出现一次):
# 在节点 ID 为 2 的数据节点上执行以下命令:
Shell (192.168.100.12)> /usr/local/src/mysql-cluster-8.4.8-linux-glibc2.28-x86_64/bin/ndb_restore -c 192.168.100.10 \
--decrypt --backup-password="Vc.Code.12" --nodeid=2 --backupid=1 -m -r --backup_path=/mysql-cluster-backup/BACKUP/BACKUP-1/
# 在节点 ID 为 3 的数据节点上执行以下命令:
Shell (192.168.100.14)> /usr/local/src/mysql-cluster-8.4.8-linux-glibc2.28-x86_64/bin/ndb_restore -c 192.168.100.10 \
--decrypt --backup-password="Vc.Code.12" --nodeid=3 --backupid=1 -r --backup_path=/mysql-cluster-backup/BACKUP/BACKUP-1/
# 在节点 ID 为 4 的数据节点上执行以下命令:
Shell (192.168.100.18)> /usr/local/src/mysql-cluster-8.4.8-linux-glibc2.28-x86_64/bin/ndb_restore -c 192.168.100.10 \
--decrypt --backup-password="Vc.Code.12" --nodeid=4 --backupid=1 -r --backup_path=/mysql-cluster-backup/BACKUP/BACKUP-1/
# 在节点 ID 为 5 的数据节点上执行以下命令:
Shell (192.168.100.20)> /usr/local/src/mysql-cluster-8.4.8-linux-glibc2.28-x86_64/bin/ndb_restore -c 192.168.100.10 \
--decrypt --backup-password="Vc.Code.12" --nodeid=5 --backupid=1 -r --backup_path=/mysql-cluster-backup/BACKUP/BACKUP-1/
使用上面选项的 ndb_restore 命令的输出如下:
Nodeid = 2
Backup Id = 1
backup path = /mysql-cluster-backup/BACKUP/BACKUP-1/
Parallelism for single restore instance is 128
2026-04-24 18:53:15 [restore_metadata] Read meta data file header
2026-04-24 18:53:15 Opening file '/mysql-cluster-backup/BACKUP/BACKUP-1/BACKUP-1.2.ctl'
2026-04-24 18:53:15 File size 4608 bytes
2026-04-24 18:53:15 Backup from version : mysql-8.4.8 ndb-8.4.8 file format : 6030b
2026-04-24 18:53:15 [restore_metadata] Load content
2026-04-24 18:53:15 Stop GCP of Backup: 191
2026-04-24 18:53:15 Start GCP of Backup: 188
2026-04-24 18:53:15 [restore_metadata] Get number of Tables
2026-04-24 18:53:15 [restore_metadata] Validate Footer
2026-04-24 18:53:16 Connected to NDB
2026-04-24 18:53:16 [restore_metadata] Restore objects (tablespaces, ..)
2026-04-24 18:53:16 [restore_metadata] Restoring tables
2026-04-24 18:53:16 Successfully created table db1/def/t1
2026-04-24 18:53:16 Successfully restored table `db1/def/t1`
2026-04-24 18:53:16 [restore_metadata] Save foreign key info
2026-04-24 18:53:16 Successfully created index `PRIMARY` on `t1`
2026-04-24 18:53:16 Create foreign keys
2026-04-24 18:53:16 Create foreign keys done
2026-04-24 18:53:16 [restore_data] Start restoring table data
2026-04-24 18:53:16 [restore_data] Read data file header
2026-04-24 18:53:16 Opening file '/mysql-cluster-backup/BACKUP/BACKUP-1/BACKUP-1-0.2.Data'
2026-04-24 18:53:16 File size 1024 bytes
2026-04-24 18:53:16 [restore_data] Restore fragments
2026-04-24 18:53:16 _____________________________________________________
Processing data in table: mysql/def/ndb_index_stat_sample(8) fragment 0
2026-04-24 18:53:16 Skipping fragment
2026-04-24 18:53:16 _____________________________________________________
Processing data in table: sys/def/NDB$EVENTS_0(3) fragment 0
2026-04-24 18:53:16 Skipping fragment
2026-04-24 18:53:16 _____________________________________________________
Processing data in table: mysql/def/ndb_apply_status(10) fragment 0
2026-04-24 18:53:16 Skipping fragment
2026-04-24 18:53:16 _____________________________________________________
Processing data in table: mysql/def/ndb_index_stat_head(7) fragment 0
2026-04-24 18:53:16 Skipping fragment
2026-04-24 18:53:16 _____________________________________________________
Processing data in table: db1/def/t1(13) fragment 0
2026-04-24 18:53:16 _____________________________________________________
Processing data in table: mysql/def/NDB$BLOB_4_3(5) fragment 0
2026-04-24 18:53:16 Skipping fragment
2026-04-24 18:53:16 _____________________________________________________
Processing data in table: mysql/def/ndb_schema_result(6) fragment 0
2026-04-24 18:53:16 Skipping fragment
2026-04-24 18:53:16 _____________________________________________________
Processing data in table: sys/def/SYSTAB_0(2) fragment 0
2026-04-24 18:53:16 _____________________________________________________
Processing data in table: mysql/def/ndb_sql_metadata(11) fragment 0
2026-04-24 18:53:16 Skipping fragment
2026-04-24 18:53:16 _____________________________________________________
Processing data in table: mysql/def/ndb_schema(4) fragment 0
2026-04-24 18:53:16 Skipping fragment
2026-04-24 18:53:16 [restore_log] Read log file header
2026-04-24 18:53:16 Opening file '/mysql-cluster-backup/BACKUP/BACKUP-1/BACKUP-1.2.log'
2026-04-24 18:53:16 File size 1024 bytes
2026-04-24 18:53:16 [restore_log] Restore log entries
2026-04-24 18:53:16 Restored 0 tuples and 0 log entries
2026-04-24 18:53:16 Data and log restore successful
验证
使用 SQL 节点进行登录:
Shell (192.168.100.16) > /usr/local/mysql/bin/mysql -h localhost -u root --password="Google-,Bing500"
MySQL > show databases;
+--------------------+
| Database |
+--------------------+
| db1 |
| information_schema |
| mysql |
| ndbinfo |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
MySQL > show tables from db1;
+---------------+
| Tables_in_db1 |
+---------------+
| t1 |
+---------------+
1 row in set (0.00 sec)
MySQL > select * from db1.t1;
+----+-------+
| id | name |
+----+-------+
| 2 | Jason |
| 1 | Jack |
| 3 | Tom |
+----+-------+
3 rows in set (0.06 sec)
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论










