概述
本章,您将学习 MySQL NDB Cluster 中的在线备份功能。
在线备份(或称热备份):指系统处于正常运转状态下的备份。在 MySQL NDB Cluster 中,在线备份是指集群处于运行时数据库在特定时间点的快照。
对于数据的恢复,放到后面单独的一篇文章中进行说明。
备份组成
在 MySQL NDB Cluster 中,备份主要由三部分组成,分别是:
- 元数据 - 所有数据库中表的名称及其定义
- 表记录 - 在进行备份时,数据库的表中实际存储的数据
- 事务日志 - 一种按时间顺序记录的日志,说明数据如何以及何时存储在数据库中。
这三部分中的每一个都保存在参与备份的所有数据节点上。在执行备份过程中,每个数据节点将这三部分保存在磁盘的三个文件中(back_id 表示备份的标识符,node_id 表示创建文件的节点 ID):
- BACKUP-backup_id.node_id.ctl - 一个包含控制信息和元数据的控制文件。每个节点均将相同的表定义(涵盖集群中所有表)保存至该文件的自身版本中。
- BACKUP-backup_id-0.node_id.data - 一个包含表记录的数据文件,它是以分片为单位进行保存,也就是说,在备份过程中,不同节点保存的是不同的分片。每个节点保存的文件均以头部(header)开头,明确标识其中记录所属的表。在记录列表之后附有尾部(footer),其中包含所有记录的校验和(checksum),用于验证数据完整性。
- BACKUP-backup_id.node_id.log - 一个包含已提交事务记录的日志文件(只有保存在备份中的表的事务才能被存储在日志中)。参与备份的数据节点保存不同的记录,因为不同的数据节点承载不同的数据库分片。
这三个文件的文件内容都是二进制,所以不能直接使用 cat 或 vim 命令进行查看,而应该使用 mysqlbinlog 命令。
备份完成之后,默认保存在数据节点的数据目录下的 BACKUP 目录中。
在线备份
使用在线备份
作者当前的集群环境处于正在运行的状态:
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)] 1 node(s)
id=6 @192.168.100.16 (mysql-8.4.8 ndb-8.4.8)
修改管理节点的 config.ini 文件:
Shell (192.168.100.10)> vim /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,因此需要滚动重启所有节点,让配置生效:
- 完成集群中每个管理节点的滚动重启
- 完成集群中每个数据节点的滚动重启
- 完成集群中每个 SQL 节点的滚动重启
# 管理节点的滚动重启
Shell (192.168.100.10) > killall ndb_mgmd && ndb_mgmd --configdir=/etc/mysql-cluster/ -f /etc/mysql-cluster/config.ini
# 数据节点的滚动重启
Shell (192.168.100.12) > killall ndbd && ndbd
Shell (192.168.100.14) > killall ndbd && ndbd
Shell (192.168.100.18) > killall ndbd && ndbd
Shell (192.168.100.20) > killall ndbd && ndbd
# SQL 节点的滚动重启
Shell (192.168.100.16) > killall mysqld && /usr/local/mysql/support-files/mysql.server start
在管理节点上使用交互命令进行备份,用法如下:
start backup [backup_id] [encryption_option] [wait_option] [snapshot_option]
encryption_option:
ENCRYPT [PASSWORD=password]
password:
{'password_string' | "password_string"}
wait_option:
WAIT {STARTED | COMPLETED} | NOWAIT
snapshot_option:
SNAPSHOTSTART | SNAPSHOTEND
其中备份 ID (backup_id)是一个大于 0 的整数,若忽略指定的备份 ID,则自动使用可用的值。
若需要对备份进行加密,则密码字符串需要满足:
- 除 ! 、' 、" 、$ 、% 、\ 、^ 以外的任何 ASCII 字符
- 需使用单引号或者双引号包含密码字符串
小提示
通常来说,我们不建议对备份的密码设置为空(虽然你可以这样做)。密码是使用一个叫做 KDF(key derivation function) 的函数进行加密,该函数采用 PBKDF2-SHA256 算法来对文件生成对称加密密钥。
您可以使用
ndb_restore 命令来解密被加密的备份,用法如下:
ndb_restore --decrypt --backup-password=password --nodeid=node_id --backupid=backup_id
加密备份的操作如下:
Shell (192.168.100.10)> ndb_mgm
# 不指定备份 ID
ndb_mgm> start backup encrypt password="Gdk.Code525"
Connected to management server at localhost port 1186 (using cleartext)
Waiting for completed, this may take several minutes
Node 2: Backup 4 started from node 1
Node 2: Backup 4 started from node 1 completed
StartGCP: 13449 StopGCP: 13452
#Records: 10 #LogRecords: 0
Data: 2340 bytes Log: 0 bytes
备份完成后,任意一个数据节点的备份目录都存在三个文件:
Shell (192.168.100.12)> ls -l /usr/local/mysql/data/BACKUP/
total 4
drwxr-x--- 2 root root 4096 Apr 17 19:56 BACKUP-4
Shell (192.168.100.12)> tree /usr/local/mysql/data/BACKUP/
/usr/local/mysql/data/BACKUP/
└── BACKUP-4
├── BACKUP-4-0.2.Data
├── BACKUP-4.2.ctl
└── BACKUP-4.2.log
1 directory, 3 files
在数据目录下的 BACKUP 目录中,还存在一个名称为 BACKUP-4 的子目录,目录名称的数字 4 表示执行的备份 ID。
解密被加密的备份
解密时,您需要首先进入到对应备份 ID 的目录。例如,对于备份 ID 为 4 的备份,您需要在节点 ID 为 2 的集群主机上对其解密:
Shell (192.168.100.12)> cd /usr/local/mysql/data/BACKUP/BACKUP-4/
Shell (192.168.100.12)> /usr/local/src/mysql-cluster-8.4.8-linux-glibc2.28-x86_64/bin/ndb_restore --decrypt --backup-password="Gdk.Code525" --nodeid=2 --backupid=4
ndb_restore: [Warning] Using a password on the command line interface can be insecure.
Nodeid = 2
Backup Id = 4
backup path = ./
Parallelism for single restore instance is 128
2026-04-17 20:10:28 [restore_metadata] Read meta data file header
2026-04-17 20:10:28 Opening file './BACKUP-4.2.ctl'
2026-04-17 20:10:28 File size 33280 bytes
2026-04-17 20:10:28 Backup from version : mysql-8.4.8 ndb-8.4.8 file format : 6030b
2026-04-17 20:10:28 [restore_metadata] Load content
2026-04-17 20:10:28 Stop GCP of Backup: 13452
2026-04-17 20:10:28 Start GCP of Backup: 13449
2026-04-17 20:10:28 [restore_metadata] Get number of Tables
2026-04-17 20:10:28 [restore_metadata] Validate Footer
2026-04-17 20:10:28 [restore_metadata] Restore objects (tablespaces, ..)
2026-04-17 20:10:28 [restore_metadata] Restoring tables
2026-04-17 20:10:28 [restore_metadata] Save foreign key info
2026-04-17 20:10:28 [restore_data] Start restoring table data
2026-04-17 20:10:28 Data and log restore successful
取消正在运行的备份
有时需要取消正在进行的备份,可以执行以下命令:
Shell (192.168.100.10)> ndb_mgm
# 这里的 backup_id 替换为具体的备份 ID
Shell (192.168.100.10)> abort backup backup_id
版权声明:「自由转载-保持署名-非商业性使用-禁止演绎 3.0 国际」(CC BY-NC-ND 3.0)
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论










