MySQL Cluster 篇13 — 在线备份

概述

本章,您将学习 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 - 一个包含已提交事务记录的日志文件(只有保存在备份中的表的事务才能被存储在日志中)。参与备份的数据节点保存不同的记录,因为不同的数据节点承载不同的数据库分片。

这三个文件的文件内容都是二进制,所以不能直接使用 catvim 命令进行查看,而应该使用 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
Avatar photo

关于 陸風睿

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

发送评论 编辑评论


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