MySQL Cluster篇14 — 数据恢复

概述

本章,您将学习到 MySQL NDB Cluster 的数据恢复功能。

数据恢复的前提条件

  1. 管理节点的全局配置文件 config.ini 至少需要一个空的 "[mysqld]",以保留给其他应用程序使用,例如 ndb_restore 命令
  2. 前面文章提到,在管理节点执行备份交互命令后,相关的文件默认保存在数据节点的数据目录下(所有数据节点的数据目录为 /usr/local/mysql/data/),作者建议指定单独的备份目录
  3. 所有管理服务器(管理节点)的对应进程必须处于运行状态
  4. 恢复需要按照顺序依次执行:

    1. 关闭所有数据服务器(数据节点)处于活跃状态的 ndbd 进程。因数据服务器(数据节点)的 ndbd 进程处于完全停止的状态,所以所有的 SQL 服务器(SQL 节点)处于休眠的状态,休眠指的是 SQL 服务器(SQL 节点)对应的 mysqld 进程还在运行,只是还没有连接
    2. 将每个数据服务器(数据节点)的数据目录清空
    3. 每个数据服务器以 ndbd --initial 形式启动 ndbd 进程,直到所有数据服务器的 ndbd 进程启动完毕
    4. 开始使用 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)
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇