数据库教程FGMT39‑MySQL8.4/9.7数据库备份恢复综合项目
## 前言
数据是业务系统最核心资产,备份与恢复是DBA的核心岗位职责。MySQL8.4为LTS长期支持版本,MySQL9.7为新一代LTS版本,两个版本在认证插件、系统字典、备份工具行为、系统变量上存在不少差异。风哥教程本文以`fgedu‑net‑cn1`(MySQL8.4实例)、`fgedu‑net‑cn2`(MySQL9.7实例)两台主机作为实验环境,硬件规格统一8CPU、64GB内存,所有数据路径统一为`/fgedudb`;实例名、业务数据库名、业务账号统一使用`fgedudb`、`fgedudb`、`fgedu`。
风哥教程本文完整覆盖备份恢复理论体系、逻辑备份工具(mysqldump、mysqlpump、mydumper、MySQL Shell Dump)、物理备份工具(XtraBackup、mysqlbackup企业备份工具)、全量备份、增量备份、压缩备份、加密备份、部分备份、时间点PITR恢复、异机恢复、数据迁移、备份校验、生产自动化备份脚本、故障演练、备份策略设计;案例各占50%分别演示MySQL8.4、MySQL9.7环境,同时梳理两个版本之间备份恢复的兼容性差异。
风哥教程本文面向数据库DBA、运维工程师、数据库架构师、云计算工程师,学习完成之后,能够独立完成生产环境备份方案设计、备份实施、恢复演练、故障数据抢救工作。
### 本文内容大纲
1. MySQL备份恢复基础理论、备份分类与业务RPO/RTO指标
2. MySQL8.4与MySQL9.7备份恢复关键差异点
3. 备份账号权限规划、主机目录环境准备(fgedu‑net‑cn1、fgedu‑net‑cn2)
4. 逻辑备份实战:mysqldump(MySQL8.4案例)
5. 逻辑备份实战:mysqlpump、mydumper(MySQL9.7案例)
6. MySQL Shell Dump工具逻辑导出导入综合实战
7. 物理备份实战:Percona XtraBackup全备、增量、压缩、恢复(MySQL8.4案例)
8. 物理备份实战:mysqlbackup企业备份工具安装、image镜像备份、目录备份(MySQL9.7案例)
9. mysqlbackup压缩备份、加密备份、部分备份、image与目录格式转换实战
10. mysqlbackup增量备份、单表选择性恢复实战
11. 增量备份恢复实战,结合binlog实现时间点PITR恢复(8.4、9.7双版本)
12. 异机恢复、数据库迁移完整实操案例
13. 备份校验、备份有效性验证方法论
14. 生产自动化备份shell脚本、定时任务规划
15. 典型故障场景恢复演练:误删库、误删表、误更新数据
16. 生产环境备份策略方案设计、备份运维规范
17. 风哥针对本文总结
—
## 一、MySQL备份恢复基础理论、备份分类与业务RPO/RTO指标
备份的本质是生成数据副本,用于硬件故障、人为误操作、数据损坏、勒索病毒、版本升级失败等场景下的数据恢复。评估备份体系两大核心指标RPO(恢复点目标)、RTO(恢复时间目标)。
– **RPO**:故障发生后最多允许丢失多少数据;例如RPO=5分钟,代表最多允许丢失5分钟业务数据,依赖binlog持续归档。
– **RTO**:故障发生之后业务恢复的时间窗口,不同备份工具RTO差异巨大,物理备份恢复速度远快于逻辑备份。
### 1.1 备份大类划分
#### 逻辑备份
逻辑备份导出SQL语句或者文本数据,保存表结构、数据、存储过程、触发器、事件;备份输出为可读SQL文件。
> 优点:跨版本、跨平台兼容性强,恢复粒度灵活,可以单库单表恢复;不需要和原实例硬件架构一致。
> 缺点:备份恢复消耗CPU,大库速度慢;恢复时需要重新执行SQL,生成索引;大库场景RTO较高。
> 代表工具:mysqldump、mysqlpump、mydumper、MySQL Shell dump util。
#### 物理备份
直接复制InnoDB、MyISAM底层数据文件、redo log、undo log、系统字典文件,属于块级备份。
> 优点:备份恢复速度快,适合TB级大数据库;备份期间SQL解析开销低。
> 缺点:多数情况下MySQL大版本之间不能直接混用物理备份集;对操作系统、MySQL版本有约束;恢复需要完整替换数据目录。
> 代表工具:Percona XtraBackup开源工具、mysqlbackup(MySQL企业版MEB)。
### 1.2 按照备份数据范围划分
1. **全量备份**:实例全部数据完整复制;每次备份完整数据集,占用存储空间大,恢复基底。
2. **增量备份**:只备份从上一次备份(无论全备/增备)之后发生变更的数据页;备份集体积小;恢复需要依次叠加全量+所有增量备份集。
3. **差异备份**:备份自上一次全量备份之后所有变更数据页;只需要全量+最后一份差异备份即可恢复,管理复杂度低于增量。
### 1.3 按照备份执行时数据库状态
1. **热备份(Online Hot Backup)**:数据库正常读写业务不中断,InnoDB支持热备,业务DML可以正常执行;XtraBackup、mysqlbackup属于热备工具。
2. **温备份**:备份过程短暂获取全局读锁,不阻塞读,阻塞写;mysqldump –single‑transaction属于InnoDB温备,不锁InnoDB表,MyISAM表仍然会锁表。
3. **冷备份(Offline Cold Backup)**:数据库实例完全停止之后复制数据文件;业务必须停机,适合测试环境,极少用于生产OLTP业务。
### 1.4 binlog二进制日志的角色
无论逻辑备份还是物理备份,全量备份只能恢复到备份完成时刻;想要实现时间点恢复PITR,必须开启binlog并且持续归档binlog文件。全量备份+binlog归档组合,才是生产完整的备份体系,缺一不可。
> 风哥 itpux‑com
### 1.5 MySQL8.4与MySQL9.7备份恢复关键差异
风哥梳理两个版本对于备份恢复影响较大变更点,实操过程必须重点关注:
1. 认证插件:MySQL8.4已经移除`mysql_native_password`;MySQL9.7同样不再支持,所有备份账号必须使用`caching_sha2_password`;老旧备份客户端不支持会直接报认证失败。
2. 系统字典:MySQL8.4、9.7使用统一数据字典,物理备份不能跨大版本直接恢复;8.4物理备份集不能直接拷贝到9.7实例启动,反之亦然,只能使用逻辑备份做跨版本迁移。
3. 复制语法:废弃master/slave关键字,改为source/replica;备份集内部记录binlog位置信息字段名称发生变化。
4. 系统变量废弃:`expire_logs_days`废弃,统一使用`binlog_expire_logs_seconds`;备份脚本、配置文件需要适配。
5. mysqlbackup工具版本必须和MySQL服务大版本严格匹配:mysqlbackup8.4用于MySQL8.4;mysqlbackup9.7用于MySQL9.7,不可混用。
6. 权限变化:物理备份账号必须授予`BACKUP_ADMIN`权限,缺少该权限会造成mysqlbackup备份失败。
7. MySQL9.7加强数据字典校验,恢复完成后建议执行实例完整性校验。
## 二、备份账号权限规划、主机目录环境准备
实验环境两台主机`fgedu‑net‑cn1`(MySQL8.4)、`fgedu‑net‑cn2`(MySQL9.7),硬件8CPU/64G内存;所有备份文件统一存放路径`/fgedudb/backup`,区分全量目录、增量目录、binlog归档目录、备份临时目录。
### 2.1 创建操作系统目录(两台主机均执行root账号)
“`bash
mkdir -p /fgedudb/backup/full
mkdir -p /fgedudb/backup/incr
mkdir -p /fgedudb/backup/binlog_arch
mkdir -p /fgedudb/backup/tmp
chown -R mysql:mysql /fgedudb/backup
chmod 750 -R /fgedudb/backup
ls -ld /fgedudb/backup/*
“`
### 2.2 创建数据库备份账号backup_admin(MySQL8.4 fgedu‑net‑cn1)
MySQL8.4已经无mysql_native_password,默认使用caching_sha2_password。
“`sql
CREATE USER ‘backup_admin’@’localhost’ IDENTIFIED BY ‘Backup@Fgedu123’;
GRANT SELECT, BACKUP_ADMIN, RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO ‘backup_admin’@’localhost’;
FLUSH PRIVILEGES;
SHOW GRANTS FOR backup_admin@localhost;
“`
### 2.3 创建数据库备份账号backup_admin(MySQL9.7 fgedu‑net‑cn2)
MySQL9.7同样需要BACKUP_ADMIN权限,物理备份工具mysqlbackup依赖该权限获取一致性快照信息。
“`sql
CREATE USER ‘backup_admin’@’localhost’ IDENTIFIED BY ‘Backup@Fgedu123’;
GRANT SELECT, BACKUP_ADMIN, RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO ‘backup_admin’@’localhost’;
FLUSH PRIVILEGES;
“`
> 风哥教程 113257174
### 2.4 业务测试数据准备,用于后续备份恢复演练
两台实例分别创建业务库`fgedudb`,导入测试表与测试数据,模拟真实业务负载。
“`sql
CREATE DATABASE IF NOT EXISTS fgedudb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
USE fgedudb;
CREATE TABLE t_fgedu_biz(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
biz_name VARCHAR(200),
create_time DATETIME
)ENGINE=InnoDB;
INSERT INTO t_fgedu_biz(biz_name,create_time) VALUES
(‘order_biz_01’,NOW()),
(‘pay_biz_02’,NOW()),
(‘user_biz_03′,NOW());
SELECT * FROM fgedudb.t_fgedu_biz;
“`
## 三、逻辑备份实战:mysqldump(MySQL8.4 fgedu‑net‑cn1案例)
mysqldump是MySQL原生自带逻辑备份工具,生成SQL文本备份集,适合中小库、跨版本迁移、单库单表恢复场景;MySQL8.4环境完整演示全套参数。
### 3.1 mysqldump关键参数说明
– `–single‑transaction`:InnoDB一致性快照,依靠MVCC获取备份快照,不锁InnoDB表;MyISAM仍然会锁表。
– `–master‑data=2`:以注释方式记录备份时刻binlog文件名与position,用于后续PITR时间点恢复。
– `–routines –events –triggers`:备份存储过程、事件、触发器,很多运维人员容易遗漏该参数。
– `–flush‑logs`:备份完成刷新binlog,开启新binlog文件,方便归档。
– `–skip‑tz‑utc`:避免时区导致时间字段恢复异常。
### 3.2 MySQL8.4实例全实例逻辑备份,输出压缩sql文件
“`bash
cd /fgedudb/backup/full
mysqldump -u backup_admin -p’Backup@Fgedu123′ -S /fgedudb/fgedudb‑data/mysql.sock \
–all‑databases –single‑transaction –master‑data=2 –routines –events –triggers \
–flush‑logs –skip‑tz‑utc –force | gzip > fgedudb_all_$(date +%Y%m%d_%H%M%S).sql.gz
ls -lh /fgedudb/backup/full
“`
### 3.3 仅备份业务库fgedudb(不备份mysql系统库)
“`bash
cd /fgedudb/backup/full
mysqldump -u backup_admin -p’Backup@Fgedu123′ -S /fgedudb/fgedudb‑data/mysql.sock \
–databases fgedudb –single‑transaction –master‑data=2 –routines –triggers –events \
–skip‑tz‑utc > fgedudb_db_$(date +%Y%m%d_%H%M%S).sql
“`
### 3.4 单表备份演练,备份t_fgedu_biz表
“`bash
mysqldump -u backup_admin -p’Backup@Fgedu123′ -S /fgedudb/fgedudb‑data/mysql.sock \
fgedudb t_fgedu_biz > /fgedudb/backup/full/fgedudb_t_fgedu_biz.sql
“`
### 3.5 mysqldump备份集恢复操作实战MySQL8.4
模拟故障,删除业务库,执行恢复演练:
“`sql
DROP DATABASE fgedudb;
SHOW DATABASES;
“`
解压备份集并且执行恢复:
“`bash
cd /fgedudb/backup/full
gunzip fgedudb_all_20260915_100000.sql.gz
mysql -u root -p -S /fgedudb/fgedudb‑data/mysql.sock < fgedudb_all_20260915_100000.sql
“`
登录校验数据:
“`sql
USE fgedudb;
SELECT * FROM t_fgedu_biz;
“`
> 网上搜索风哥教程可以学习全套数据库教程
## 四、逻辑备份实战:mysqlpump、mydumper(MySQL9.7 fgedu‑net‑cn2案例)
mysqlpump为MySQL官方并行逻辑导出工具;mydumper为开源第三方高性能逻辑备份工具,支持多线程导出、元数据分离、压缩、过滤,大库场景性能优于mysqldump;本节主机`fgedu‑net‑cn2` MySQL9.7实例。
### 4.1 mysqlpump并行备份MySQL9.7全实例
mysqlpump支持–parallel‑schemas多库并行导出,注意MySQL9.7账号认证为caching_sha2_password,客户端版本必须支持。
“`bash
cd /fgedudb/backup/full
mysqlpump -u backup_admin -p’Backup@Fgedu123’ -S /fgedudb/fgedudb‑data/mysql.sock \
–all‑databases –parallel‑schemas=4 –routines –events –triggers \
–master‑data=2 –skip‑tz‑utc –compress‑output > fgedudb_pump_all_$(date +%Y%m%d_%H%M%S).sql.zst
ls -lh /fgedudb/backup/full
“`
参数说明:`–parallel‑schemas=4`开启4个并行线程导出不同数据库;`–compress‑output`输出压缩备份文件。
mysqlpump恢复命令示例:
“`bash
mysql -uroot -p -S /fgedudb/fgedudb‑data/mysql.sock < fgedudb_pump_all_20260915_101000.sql.zst
“`
### 4.2 mydumper工具安装与MySQL9.7备份实战
mydumper需要提前编译安装依赖库,适用于大库多线程逻辑备份。
“`bash
#mydumper备份,4线程,输出目录模式
cd /fgedudb/backup/full
mydumper -u backup_admin -p ‘Backup@Fgedu123′ -S /fgedudb/fgedudb‑data/mysql.sock \
–threads=4 –all‑databases –routines –events –triggers –use‑savepoints \
–output‑dir=./mydumper_fgedudb_$(date +%Y%m%d_%H%M%S)
ls -ld mydumper_fgedudb_*
“`
mydumper恢复使用myloader工具:
“`bash
myloader –directory=./mydumper_fgedudb_20260915_102000 \
-u root -p’Root@Fgedu123′ -S /fgedudb/fgedudb‑data/mysql.sock –threads=4
“`
mydumper输出为目录结构,每个表的表结构、数据分开保存;恢复时可以选择只恢复某一个数据库或者某一张表,恢复粒度灵活。
> 风哥数据库教程 itpux‑com
## 五、MySQL Shell Dump工具逻辑导出导入综合实战
MySQL Shell内置dump工具是官方新一代逻辑备份工具,支持多线程、压缩、进度记录、断点续导、直接导出到对象存储,同时兼容MySQL8.4与MySQL9.7,是官方推荐的逻辑迁移工具。分别演示8.4导出,9.7导入跨版本迁移场景。
### 5.1 在fgedu‑net‑cn1 MySQL8.4执行实例dump导出
“`bash
mysqlsh -u backup_admin -p’Backup@Fgedu123′ -S /fgedudb/fgedudb‑data/mysql.sock –js
“`
进入mysqlsh JS交互模式执行导出全部实例:
“`javascript
util.dumpInstance(“/fgedudb/backup/full/shell_dump_all”, {
threads:4,
compression:”zstd”,
includeSchemas:[“fgedudb”],
consistency:true,
showProgress:true
})
“`
导出完成,备份集存放在`/fgedudb/backup/full/shell_dump_all`目录。
### 5.2 将备份集拷贝至fgedu‑net‑cn2 MySQL9.7主机,执行loadDump导入
把整个shell_dump_all目录传输到9.7主机`/fgedudb/backup/full/`,在MySQL9.7主机执行mysqlsh导入:
“`bash
mysqlsh -uroot -p’Root@Fgedu123′ -S /fgedudb/fgedudb‑data/mysql.sock –js
“`
“`javascript
util.loadDump(“/fgedudb/backup/full/shell_dump_all”,{
threads:4,
compression:”zstd”,
showProgress:true
})
“`
导入完成登录MySQL9.7校验`fgedudb.t_fgedu_biz`表数据,完成跨版本逻辑迁移。MySQL Shell dump非常适合8.4迁移升级到9.7业务场景,规避物理备份版本不兼容问题。
> 上51CTO搜索风哥可以学习全套数据库教程
## 六、物理备份实战:Percona XtraBackup全备、增量、压缩、恢复(MySQL8.4 fgedu‑net‑cn1案例)
Percona XtraBackup是开源InnoDB物理热备份工具,不依赖MySQL企业授权;本节在MySQL8.4实例`fgedu‑net‑cn1`操作;注意XtraBackup大版本必须匹配MySQL版本,使用XtraBackup 8.4版本。
### 6.1 XtraBackup完整全量备份
“`bash
cd /fgedudb/backup/full
xtrabackup –defaults‑file=/etc/my‑fgedudb.cnf \
–user=backup_admin –password=’Backup@Fgedu123’ \
–backup –target‑dir=./xtra_full_$(date +%Y%m%d_%H%M%S) \
–parallel=8 –compress
ls -lh ./xtra_full_*
“`
参数说明:`–parallel=8`适配8CPU主机并行读取数据文件;`–compress`开启qpress压缩备份集。
### 6.2 XtraBackup增量备份实战
基于上面全量备份做第一次增量备份,模拟业务产生新数据:
“`sql
USE fgedudb;
INSERT INTO t_fgedu_biz(biz_name,create_time) VALUES(‘incr_test_04′,NOW());
“`
执行增量备份,`–incremental‑basedir`指向全量备份目录:
“`bash
cd /fgedudb/backup/incr
xtrabackup –defaults‑file=/etc/my‑fgedudb.cnf \
–user=backup_admin –password=’Backup@Fgedu123′ \
–backup –target‑dir=./xtra_incr_01_$(date +%Y%m%d_%H%M%S) \
–incremental‑basedir=/fgedudb/backup/full/xtra_full_20260915_110000 \
–parallel=8 –compress
“`
### 6.3 XtraBackup恢复完整演练MySQL8.4
模拟数据库实例损坏,实例停止,执行恢复流程。
1.停止MySQL实例
“`bash
systemctl stop mysql‑fgedudb
“`
2.解压压缩备份集
“`bash
cd /fgedudb/backup/full/xtra_full_20260915_110000
xtrabackup –decompress –target‑dir=.
“`
3.对全量备份执行prepare(只apply‑log‑only,回滚事务不完成undo,用于叠加增量)
“`bash
xtrabackup –prepare –apply‑log‑only –target‑dir=/fgedudb/backup/full/xtra_full_20260915_110000
“`
4.叠加第一层增量备份
“`bash
xtrabackup –prepare –apply‑log‑only –target‑dir=/fgedudb/backup/full/xtra_full_20260915_110000 \
–incremental‑dir=/fgedudb/backup/incr/xtra_incr_01_20260915_111000
“`
5.最后一次prepare,去掉apply‑log‑only,完成事务回滚,备份集达到可启动状态
“`bash
xtrabackup –prepare –target‑dir=/fgedudb/backup/full/xtra_full_20260915_110000
“`
6.清空原数据目录,copy‑back恢复数据文件
“`bash
rm -rf /fgedudb/fgedudb‑data/*
xtrabackup –copy‑back –target‑dir=/fgedudb/backup/full/xtra_full_20260915_110000
chown -R mysql:mysql /fgedudb/fgedudb‑data
“`
7.启动实例校验数据
“`bash
systemctl start mysql‑fgedudb
mysql -uroot -p -S /fgedudb/fgedudb‑data/mysql.sock
USE fgedudb;
SELECT * FROM t_fgedu_biz;
“`
## 七、物理备份实战:mysqlbackup企业备份工具安装、image镜像备份、目录备份(MySQL9.7 fgedu‑net‑cn2案例)
mysqlbackup(MySQL Enterprise Backup,简称MEB)是Oracle官方企业级物理备份工具,需要企业授权许可,支持image单文件镜像备份、目录备份、压缩、加密、增量、部分备份、备份校验、云存储直接备份,本节主机`fgedu‑net‑cn2`运行MySQL9.7,使用对应9.7版本mysqlbackup工具。
### 7.1 mysqlbackup工具部署安装
下载对应MySQL9.7版本mysqlbackup rpm包,在主机安装:
“`bash
cd /fgedudb/mysql‑soft
rpm -ivh mysql‑enterprise‑backup‑9.7.0‑1.el8.x86_64.rpm
which mysqlbackup
“`
工具默认安装路径`/opt/mysql/meb‑9.7/bin/mysqlbackup`,添加操作系统环境变量。
### 7.2 mysqlbackup两种备份模式说明
1. **backup‑to‑image(image镜像单文件备份)**:全部备份内容打包为单个.mbi镜像文件,便于传输、存储、异地归档;支持压缩加密,生产环境推荐优先使用image模式。
2. **backup(目录备份模式)**:直接生成目录,内部存放各个数据文件、redo log、元数据文件;不需要解压镜像,恢复操作可以直接操作目录,适合本地快速备份调试。
### 7.3 MySQL9.7 image镜像全量备份实战
`–backup‑dir`指定临时工作目录;`–backup‑image`输出镜像文件;`backup‑to‑image`子命令执行镜像备份。
“`bash
cd /fgedudb/backup/full
mysqlbackup –defaults‑file=/etc/my‑fgedudb.cnf \
–user=backup_admin –password=’Backup@Fgedu123′ \
–backup‑dir=/fgedudb/backup/tmp \
–backup‑image=./meb_full_$(date +%Y%m%d_%H%M%S).mbi \
backup‑to‑image
ls -lh *.mbi
“`
### 7.4 mysqlbackup目录模式全量备份实战MySQL9.7
“`bash
cd /fgedudb/backup/full
mysqlbackup –defaults‑file=/etc/my‑fgedudb.cnf \
–user=backup_admin –password=’Backup@Fgedu123′ \
–backup‑dir=./meb_dir_full_$(date +%Y%m%d_%H%M%S) \
backup
ls -ld ./meb_dir_full_*
“`
### 7.5 mysqlbackup image镜像备份恢复实战MySQL9.7
停止实例,清空数据目录,从镜像文件恢复:
“`bash
systemctl stop mysql‑fgedudb
rm -rf /fgedudb/fgedudb‑data/*
mysqlbackup –defaults‑file=/etc/my‑fgedudb.cnf \
–datadir=/fgedudb/fgedudb‑data \
–backup‑image=/fgedudb/backup/full/meb_full_20260915_120000.mbi \
–backup‑dir=/fgedudb/backup/tmp \
copy‑back‑and‑apply‑log
chown -R mysql:mysql /fgedudb/fgedudb‑data
systemctl start mysql‑fgedudb
“`
`copy‑back‑and‑apply‑log`一步完成镜像解压、redo log apply、文件拷贝到datadir,简化恢复操作。
## 八、mysqlbackup压缩备份、加密备份、部分备份、image与目录格式转换实战
本节继续`fgedu‑net‑cn2` MySQL9.7主机演示MEB高级功能。
### 8.1 mysqlbackup开启压缩的image全备
增加`–compress`参数开启备份集压缩,降低存储空间占用。
“`bash
cd /fgedudb/backup/full
mysqlbackup –defaults‑file=/etc/my‑fgedudb.cnf \
–user=backup_admin –password=’Backup@Fgedu123′ \
–backup‑dir=/fgedudb/backup/tmp \
–compress \
–backup‑image=./meb_compress_full_$(date +%Y%m%d_%H%M%S).mbi \
backup‑to‑image
“`
### 8.2 mysqlbackup加密备份实战
生产重要业务,备份文件本身也需要加密,使用`–encrypt‑password`设置备份加密口令;恢复备份时必须提供相同口令,否则无法打开备份镜像。
“`bash
cd /fgedudb/backup/full
mysqlbackup –defaults‑file=/etc/my‑fgedudb.cnf \
–user=backup_admin –password=’Backup@Fgedu123′ \
–backup‑dir=/fgedudb/backup/tmp \
–encrypt‑password=’Fgedu#MebEncrypt2026′ \
–backup‑image=./meb_encrypt_full_$(date +%Y%m%d_%H%M%S).mbi \
backup‑to‑image
“`
> 重要提醒:加密口令必须安全保管,如果丢失口令,整个备份镜像将永久无法恢复,口令不要存放在数据库主机本地明文文件。
加密备份恢复示例,恢复时增加`–encrypt‑password`参数:
“`bash
mysqlbackup –defaults‑file=/etc/my‑fgedudb.cnf \
–datadir=/fgedudb/fgedudb‑data \
–encrypt‑password=’Fgedu#MebEncrypt2026′ \
–backup‑image=/fgedudb/backup/full/meb_encrypt_full_20260915_122000.mbi \
–backup‑dir=/fgedudb/backup/tmp \
copy‑back‑and‑apply‑log
“`
### 8.3 mysqlbackup部分备份(partial备份),只备份fgedudb业务库
partial部分备份,只备份指定业务库,不备份实例全部库;适用于实例多业务库,只需要保护其中部分业务数据场景,使用`–include‑databases`参数指定库名。
“`bash
cd /fgedudb/backup/full
mysqlbackup –defaults‑file=/etc/my‑fgedudb.cnf \
–user=backup_admin –password=’Backup@Fgedu123′ \
–backup‑dir=/fgedudb/backup/tmp \
–include‑databases=’fgedudb’ \
–backup‑image=./meb_partial_fgedudb_$(date +%Y%m%d_%H%M%S).mbi \
backup‑to‑image
“`
### 8.4 image镜像与备份目录格式互相转换
image转备份目录(把mbi镜像解压输出为目录):
“`bash
mysqlbackup –backup‑image=./meb_full_20260915_120000.mbi \
–backup‑dir=./convert_dir_out image‑to‑backup‑dir
“`
备份目录打包生成image镜像:
“`bash
mysqlbackup –backup‑dir=./meb_dir_full_20260915_114000 \
–backup‑image=./convert_out.mbi backup‑dir‑to‑image
“`
## 九、mysqlbackup增量备份、单表选择性恢复实战
mysqlbackup支持增量与差异两种增量备份模式,增量备份记录自上一次备份的变更页;差异备份记录自上一次全量备份的变更页。本章节操作主机`fgedu‑net‑cn2` MySQL9.7。
### 9.1 mysqlbackup增量镜像备份(基于全量备份)
“`bash
cd /fgedudb/backup/incr
mysqlbackup –defaults‑file=/etc/my‑fgedudb.cnf \
–user=backup_admin –password=’Backup@Fgedu123′ \
–backup‑dir=/fgedudb/backup/tmp \
–incremental‑base‑image=/fgedudb/backup/full/meb_full_20260915_120000.mbi \
–backup‑image=./meb_incr_01_$(date +%Y%m%d_%H%M%S).mbi \
backup‑to‑image
“`
参数`–incremental‑base‑image`指定基准备份镜像文件。
### 9.2 增量备份恢复流程
恢复顺序:先恢复全量镜像,再叠加增量镜像,不需要额外增加`–incremental`标记,新版本MEB自动识别备份类型。
“`bash
systemctl stop mysql‑fgedudb
rm -rf /fgedudb/fgedudb‑data/*
#恢复全量
mysqlbackup –defaults‑file=/etc/my‑fgedudb.cnf \
–datadir=/fgedudb/fgedudb‑data \
–backup‑image=/fgedudb/backup/full/meb_full_20260915_120000.mbi \
–backup‑dir=/fgedudb/backup/tmp copy‑back‑and‑apply‑log
#叠加增量备份
mysqlbackup –defaults‑file=/etc/my‑fgedudb.cnf \
–datadir=/fgedudb/fgedudb‑data \
–backup‑image=/fgedudb/backup/incr/meb_incr_01_20260915_123000.mbi \
–backup‑dir=/fgedudb/backup/tmp copy‑back‑and‑apply‑log
chown -R mysql:mysql /fgedudb/fgedudb‑data
systemctl start mysql‑fgedudb
“`
### 9.3 mysqlbackup单表恢复实战(导出单表空间)
当只需要恢复某一张InnoDB表,可以使用备份镜像提取单表ibd与sdi元数据文件,实现单表恢复,不需要完整还原整个实例。
1. 将镜像转换为备份目录:
“`bash
mysqlbackup –backup‑image=/fgedudb/backup/full/meb_full_20260915_120000.mbi \
–backup‑dir=/fgedudb/backup/tmp/extract_out image‑to‑backup‑dir
“`
2. 从备份目录拷贝`fgedudb/t_fgedu_biz.ibd`、`t_fgedu_biz.sdi`到目标实例数据目录,执行IMPORT TABLESPACE导入表空间,完成单表恢复。
## 十、增量备份恢复实战,结合binlog实现时间点PITR恢复(8.4、9.7双版本)
无论物理备份还是逻辑备份,备份集只能恢复到备份结束时间;想要恢复到故障发生的任意时间点,必须依靠binlog二进制日志,也就是PITR Point‑in‑Time Recovery时间点恢复。
### 10.1 MySQL8.4 fgedu‑net‑cn1 XtraBackup+binlog PITR演练
1. 确认实例开启binlog,记录全量备份完成时刻对应的binlog文件与position位置。XtraBackup备份目录内部文件`xtrabackup_binlog_info`记录备份时刻binlog位点。
“`bash
cat /fgedudb/backup/full/xtra_full_20260915_110000/xtrabackup_binlog_info
“`
输出示例:
“`
fgedudb‑bin.000022 1567
“`
代表全备完成时刻binlog文件`fgedudb‑bin.000022`,位点1567。
2. 模拟业务持续写入,之后发生误操作,执行误删除表:
“`sql
USE fgedudb;
INSERT INTO t_fgedu_biz(biz_name,create_time) VALUES(‘pitr_test_05′,NOW());
DROP TABLE t_fgedu_biz;
“`
业务误删表时间点为`2026‑09‑15 13:05:00`。
3. 使用全量+增量备份集恢复到备份结束时刻;此时数据只恢复到备份时刻,还缺少备份结束到误操作之前业务变更,还需要回放binlog。
4. 从binlog位点1567开始,回放binlog,截止时间设置为误操作之前`–stop‑datetime=”2026‑09‑15 13:04:50″`。
“`bash
mysqlbinlog –start‑position=1567 –stop‑datetime=”2026‑09‑15 13:04:50″ \
/fgedudb/fgedudb‑log/binlog/fgedudb‑bin.000022 > /fgedudb/backup/tmp/pitr_recover.sql
mysql -uroot -p -S /fgedudb/fgedudb‑data/mysql.sock < /fgedudb/backup/tmp/pitr_recover.sql
“`
5. 登录数据库校验,t_fgedu_biz表恢复,误DROP TABLE语句被跳过,完成PITR时间点恢复。
### 10.2 MySQL9.7 fgedu‑net‑cn2 mysqlbackup+binlog PITR演练
mysqlbackup备份镜像内部元数据记录备份时刻binlog信息,可以使用`list‑image`查看镜像内部元数据信息:
“`bash
mysqlbackup –backup‑image=/fgedudb/backup/full/meb_full_20260915_120000.mbi list‑image
“`
获取备份对应的binlog文件名与position。物理备份恢复完成之后,同样使用mysqlbinlog工具回放binlog实现时间点恢复,操作逻辑与8.4保持一致。
> 重要运维规范:生产环境binlog不能只保存在数据库本机;需要定时归档binlog到异地存储;如果本机磁盘损坏,本机binlog丢失,PITR时间点恢复将无法完成。
## 十一、异机恢复、数据库迁移完整实操案例
异机恢复是备份验证最重要手段,只在原机器恢复不能验证备份有效性,必须定期把备份集恢复到另外一台主机,确认备份可用。下面演示场景:`fgedu‑net‑cn1 MySQL8.4`,使用mysqldump逻辑备份,拷贝到`fgedu‑net‑cn2 MySQL9.7`异机恢复,完成数据库迁移。
1. 在源主机fgedu‑net‑cn1执行业务库逻辑备份:
“`bash
cd /fgedudb/backup/full
mysqldump -u backup_admin -p’Backup@Fgedu123’ -S /fgedudb/fgedudb‑data/mysql.sock \
–databases fgedudb –single‑transaction –routines –triggers –events > fgedudb_migrate.sql
“`
2. scp传输备份文件到目标主机fgedu‑net‑cn2:
“`bash
scp fgedudb_migrate.sql root@fgedu‑net‑cn2:/fgedudb/backup/full/
“`
3. 在目标主机MySQL9.7执行导入恢复:
“`bash
mysql -uroot -p -S /fgedudb/fgedudb‑data/mysql.sock < /fgedudb/backup/full/fgedudb_migrate.sql
“`
4. 校验库表、数据、存储过程、触发器完整性。
物理备份异机恢复注意点:
– MySQL8.4物理备份集,不能直接物理拷贝启动MySQL9.7实例,只能逻辑迁移。
– 同大版本异机物理恢复:两台主机MySQL版本完全一致;硬件架构一致;恢复完成修改my.cnf适配目标主机内存参数(64G内存8CPU),修改目录权限。
## 十二、备份校验、备份有效性验证方法论
备份文件生成不等于备份可用,大量生产故障发生:备份脚本执行返回0,但是备份集损坏,真正故障的时候无法恢复。风哥整理4个层级备份校验手段。
1. **备份工具自带校验**
– mysqlbackup提供`validate`子命令,直接校验image镜像文件内部完整性校验和,检查InnoDB页校验码是否损坏。
“`bash
mysqlbackup –backup‑image=./meb_full_20260915_120000.mbi validate
“`
2. **逻辑备份基础校验**:SQL备份文件执行语法检查,不实际导入数据。
“`bash
mysql -u root -p –force –skip‑execute < backup.sql
“`
3. **元数据校验**:备份集内检查表、存储过程、触发器、事件是否存在,统计行数和源实例做比对。
4. **定期异机恢复演练(最高等级验证)**:周期把备份集完整恢复到测试实例,核对业务数据行数、业务功能,这是唯一100%确认备份可用的方式。
## 十三、生产自动化备份shell脚本、定时任务规划
风哥给出MySQL9.7 mysqlbackup镜像全量备份shell脚本示例,适配路径`/fgedudb`,脚本包含日志输出、备份过期清理、备份validate校验。
保存脚本为`/fgedudb/scripts/mysql_meb_full_backup_97.sh`
“`bash
#!/bin/bash
BACKUP_ROOT=”/fgedudb/backup”
FULL_DIR=”${BACKUP_ROOT}/full”
TMP_DIR=”${BACKUP_ROOT}/tmp”
LOG_FILE=”${BACKUP_ROOT}/backup.log”
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_CFG=”/etc/my‑fgedudb.cnf”
BK_USER=”backup_admin”
BK_PWD=”Backup@Fgedu123″
MEB_BIN=”/opt/mysql/meb‑9.7/bin/mysqlbackup”
mkdir -p ${FULL_DIR} ${TMP_DIR}
echo “===== Start MEB full backup ${DATE} =====” >> ${LOG_FILE}
#执行mysqlbackup image全备
${MEB_BIN} –defaults‑file=${MYSQL_CFG} –user=${BK_USER} –password=${BK_PWD} \
–backup‑dir=${TMP_DIR} –backup‑image=${FULL_DIR}/meb_full_${DATE}.mbi \
backup‑to‑image 2>>${LOG_FILE}
BK_RET=$?
if [ ${BK_RET} -eq 0 ];then
echo “backup success, start validate backup image” >> ${LOG_FILE}
${MEB_BIN} –backup‑image=${FULL_DIR}/meb_full_${DATE}.mbi validate >>${LOG_FILE} 2>&1
else
echo “backup failed return code ${BK_RET}” >> ${LOG_FILE}
exit ${BK_RET}
fi
#清理超过30天旧全量备份镜像
find ${FULL_DIR} -maxdepth 1 -type f -name “meb_full_*.mbi” -mtime +30 -exec rm -rf {} \;
echo “===== End MEB full backup ${DATE} =====” >> ${LOG_FILE}
“`
赋予执行权限:
“`bash
chmod +x /fgedudb/scripts/mysql_meb_full_backup_97.sh
“`
配置crontab定时任务,每天凌晨2点执行全量备份:
“`bash
crontab -e
0 2 * * * /fgedudb/scripts/mysql_meb_full_backup_97.sh >/dev/null 2>&1
“`
> 运维要点:脚本必须监控备份返回码;生产接入监控系统,如果备份执行失败产生告警通知DBA,不能依靠crontab执行成功就代表备份成功。
## 十四、典型故障场景恢复演练:误删库、误删表、误更新数据
### 场景1:业务人员执行drop database fgedudb误删业务库
处理流程:
1. 立刻断开业务写入,避免binlog继续大量生成;
2. 使用最近一份全量备份恢复实例到备份完成时间;
3. 从备份对应的binlog位点开始回放binlog,停止时间设置在drop语句执行之前;
4. 导出已经恢复的业务库,迁移回业务实例;
5. 业务校验。
### 场景2:误update不带where条件,大批量数据被错误更新
1. 立刻抓现场,不要重启数据库,保留完整binlog;
2. 通过binlog解析找到错误update的时间点;
3. 全量备份恢复基底,回放binlog截止错误SQL执行之前;
4. 将正确数据导出,回写生产实例。
> 注意:不要直接在生产实例执行恢复操作;优先恢复到独立测试实例,校验确认数据无误之后再导出数据回写生产,避免二次人为故障。
## 十五、生产环境备份策略方案设计、备份运维规范
风哥结合MySQL8.4、MySQL9.7生产项目经验,整理备份策略设计要点:
1. **备份工具选型原则**
– TB级大OLTP库:优先物理备份(XtraBackup开源、mysqlbackup企业);每周一次全量,每日增量;配合binlog归档实现PITR。
– 中小库、跨版本迁移需求:逻辑备份(MySQL Shell dump优先)。
2. **存储策略**:备份集不能只保存在数据库本机;至少两份副本,一份本地存储,一份异地对象存储。
3. **保留周期**:遵从业务数据合规要求;全量备份保留30天;binlog归档保留7‑30天,使用`binlog_expire_logs_seconds`参数控制binlog自动过期清理。
4. **监控体系**:备份任务执行状态监控、备份集磁盘空间监控、binlog归档状态监控;备份失败必须告警。
5. **定期演练**:每个季度至少执行一次完整异机恢复演练;恢复演练文档记录归档。
6. MySQL8.4升级到MySQL9.7项目:升级前必须同时做一份物理备份+一份逻辑备份;逻辑备份作为兜底,防止物理备份跨版本无法恢复。
7. 权限管理:备份账号密码、mysqlbackup加密口令严格保管,禁止明文存放在脚本,优先使用环境变量传入密码。
## 风哥针对本文总结
风哥教程本文完整覆盖MySQL8.4与MySQL9.7备份恢复综合项目内容,从备份恢复理论体系、RPO/RTO指标、逻辑备份工具mysqldump、mysqlpump、mydumper、MySQL Shell Dump,到物理备份XtraBackup、mysqlbackup企业备份工具;实操包含全量备份、增量备份、压缩备份、加密备份、部分备份、image镜像备份、目录备份、镜像格式转换、单表空间恢复;并且完整演示PITR时间点恢复、异机恢复、数据库迁移、备份校验、自动化shell脚本、crontab定时任务、典型故障场景演练、生产备份策略规范。
MySQL8.4与MySQL9.7已经移除mysql_native_password认证插件,所有备份账号必须使用caching_sha2_password;物理备份集不能直接跨大版本启动实例,跨版本迁移优先逻辑备份方案。物理备份速度快适合TB级大库;逻辑备份兼容性强,适合迁移、单库单表粒度恢复。无论物理还是逻辑全量备份,想要实现任意时间点恢复,必须依赖binlog持续异地归档。生成备份文件不等于备份有效,异机恢复演练是验证备份可靠性最重要手段。
自动化备份脚本需要增加状态监控告警,不能只依靠定时任务执行完成;加密备份的加密口令必须独立保管,口令丢失则备份集永久不可恢复。生产数据库故障发生之后,优先恢复到独立测试实例校验,确认数据正确再回写业务环境,最大限度降低人为二次故障风险。掌握本套风哥教程全部实操内容,可以独立完成MySQL8.4/9.7生产环境备份方案设计、部署实施、故障数据抢救,是DBA岗位核心必备技能,也为主从复制、MGR高可用架构打下坚实基础。
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
