技能目标
- 掌握数据库备份的核心分类与适用场景
- 熟练完成 MySQL 物理全备、逻辑全备的操作与恢复
- 精通基于二进制日志与 XtraBackup 的增量备份与恢复
- 理解 GTID 机制在备份恢复中的应用,制定企业级备份策略
前言
随着企业数字化转型深入,数据已成为核心生产要素,数据库的可靠性直接决定业务连续性。一旦发生误操作、硬件故障或灾难,数据丢失将造成不可逆损失。因此,制定科学的备份策略、掌握高效的恢复手段,是数据库运维人员的核心能力。
本章从备份基础理论出发,逐步讲解物理备份、逻辑备份、增量备份的实现方式,结合二进制日志与 Percona XtraBackup 工具,通过全流程实操案例,帮助学习者构建完整的备份恢复知识体系,保障企业数据安全。
一、MySQL 备份基础认知
1.1 数据丢失的常见原因
- 程序错误:代码 Bug 导致数据异常
- 人为误操作 :
DROP/DELETE等误执行 - 运算错误:数据计算逻辑异常
- 磁盘故障:硬件损坏导致数据文件丢失
- 灾难事件:火灾、地震、盗窃等极端情况
1.2 备份类型核心分类
(1)按物理 / 逻辑角度划分
- 物理备份 :直接备份数据库物理文件(数据文件、日志文件等),速度快,适合大数据量场景
- 冷备:数据库关闭状态下备份
- 热备:数据库运行状态下备份(依赖二进制日志)
- 温备:数据库锁表状态下备份
- 逻辑备份:备份数据库结构与数据的 SQL 语句,文件小,便于跨平台迁移
(2)按备份策略角度划分
- 全量备份:备份所有数据,是备份的基础,但占用空间大、时间长
- 差异备份:仅备份上次全备后变化的数据
- 增量备份:仅备份上次全备 / 增量备后变化的数据,空间占用小、速度快
1.3 常见备份工具
- 物理备份工具 :
Percona XtraBackup(热备首选,支持 InnoDB) - 逻辑备份工具 :
mysqldump(通用易用,适合中小数据量) - 日志备份工具 :MySQL 二进制日志(
binlog,实现增量备份) - 第三方工具 :
mydumper/myloader(并行备份,提升大库备份效率)
二、MySQL 全量备份与恢复
2.1 物理全备与恢复(冷备)
(1)备份操作
bash
运行
# 1. 关闭数据库
[root@localhost ~]# systemctl stop mysqld
# 2. 创建备份目录
[root@localhost ~]# mkdir -p /backup/mysql
# 3. 打包数据文件
[root@localhost ~]# tar zcf /backup/mysql/mysql_all_$(date +%F).tar.gz /usr/local/mysql/data/
(2)恢复操作
bash
运行
# 1. 关闭数据库
[root@localhost ~]# systemctl stop mysqld
# 2. 清理原数据目录
[root@localhost ~]# rm -rf /usr/local/mysql/data/*
# 3. 解压备份包
[root@localhost ~]# tar zxf /backup/mysql/mysql_all_2025-03-24.tar.gz -C /
# 4. 启动数据库
[root@localhost ~]# systemctl start mysqld
2.2 逻辑全备与恢复(mysqldump)
(1)备份操作
bash
运行
# 备份指定库
[root@localhost ~]# mysqldump -uroot -p --databases test > /backup/mysql/test_$(date +%F).sql
# 备份所有库
[root@localhost ~]# mysqldump -uroot -p --all-databases > /backup/mysql/all_$(date +%F).sql
(2)恢复操作
bash
运行
# 方式1:mysql命令导入
[root@localhost ~]# mysql -uroot -p < /backup/mysql/test_2025-03-24.sql
# 方式2:source命令导入(登录MySQL后执行)
mysql> source /backup/mysql/test_2025-03-24.sql;
三、MySQL 增量备份与恢复
3.1 二进制日志(binlog)基础
二进制日志记录了所有数据变更操作,是实现增量备份的核心。
(1)开启 binlog
bash
运行
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
log-bin=/usr/local/mysql/data/mysql-bin # 开启binlog
binlog_format=MIXED # 混合模式记录日志
server-id=1 # 唯一服务ID
重启 MySQL 生效:
bash
运行
[root@localhost ~]# systemctl restart mysqld
(2)查看 binlog
bash
运行
# 查看binlog文件列表
[root@localhost ~]# ls /usr/local/mysql/data/mysql-bin.*
# 查看binlog内容
[root@localhost ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000001
3.2 基于 binlog 的增量恢复
(1)三种恢复方式
-
全量恢复 :恢复所有 binlog 操作
bash
运行
[root@localhost ~]# mysqlbinlog /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p -
基于位置恢复 :精确恢复到指定操作位置
bash
运行
# 恢复到指定位置 [root@localhost ~]# mysqlbinlog --stop-position=663 /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p # 从指定位置开始恢复 [root@localhost ~]# mysqlbinlog --start-position=663 /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p -
基于时间恢复 :按时间点恢复数据
bash
运行
[root@localhost ~]# mysqlbinlog --start-datetime="2025-03-24 19:29:28" --stop-datetime="2025-03-24 19:30:00" /usr/local/mysql/data/mysql-bin.000001 | mysql -uroot -p
(2)完整恢复流程
- 先恢复最近一次全量备份
- 再按时间 / 位置顺序恢复后续 binlog 增量数据
- 验证数据完整性
3.3 基于 Percona XtraBackup 的热备增量备份
(1)安装 XtraBackup 与 qpress
bash
运行
# 安装XtraBackup
[root@localhost ~]# wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.35-30/binary/tarball/percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz
[root@localhost ~]# tar zxf percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz -C /usr/local/
[root@localhost ~]# ln -s /usr/local/percona-xtrabackup-8.0.35-30-Linux-x86_64/bin/xtrabackup /usr/local/bin/
# 安装qpress(压缩工具)
[root@localhost ~]# wget https://www.quicklz.com/qpress-11-linux-x64.tar
[root@localhost ~]# tar xf qpress-11-linux-x64.tar -C /usr/local/bin/
(2)全量备份
bash
运行
[root@localhost ~]# mkdir -p /backup/full
[root@localhost ~]# xtrabackup --defaults-file=/etc/my.cnf --user=bkpuser --password=s3cret --backup --compress --target-dir=/backup/full/$(date +%F)
(3)增量备份
bash
运行
[root@localhost ~]# mkdir -p /backup/incr
[root@localhost ~]# xtrabackup --defaults-file=/etc/my.cnf --user=bkpuser --password=s3cret --backup --compress --target-dir=/backup/incr/$(date +%F) --incremental-basedir=/backup/full/2025-03-24
(4)恢复流程
bash
运行
# 1. 解压备份
[root@localhost ~]# xtrabackup --decompress --target-dir=/backup/full/2025-03-24
[root@localhost ~]# xtrabackup --decompress --target-dir=/backup/incr/2025-03-24
# 2. 准备备份(合并增量)
[root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/full/2025-03-24
[root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/backup/full/2025-03-24 --incremental-dir=/backup/incr/2025-03-24
# 3. 恢复数据
[root@localhost ~]# systemctl stop mysqld
[root@localhost ~]# rm -rf /usr/local/mysql/data/*
[root@localhost ~]# xtrabackup --copy-back --target-dir=/backup/full/2025-03-24
[root@localhost ~]# chown -R mysql:mysql /usr/local/mysql/data
[root@localhost ~]# systemctl start mysqld
四、进阶:GTID 在备份恢复中的应用
4.1 GTID 基础概念
GTID(全局事务 ID)是 MySQL 5.6 + 引入的事务唯一标识,确保在主从复制与备份恢复中,事务可被唯一识别,避免重复执行。
(1)开启 GTID
bash
运行
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
gtid_mode=ON
enforce_gtid_consistency=ON
重启 MySQL 生效。
4.2 基于 GTID 的备份与恢复
(1)GTID 备份
bash
运行
[root@localhost ~]# mysqldump -uroot -p --databases test --set-gtid-purged=OFF > /backup/mysql/test_gtid_$(date +%F).sql
(2)GTID 增量恢复
bash
运行
# 导出指定GTID区间的binlog
[root@localhost ~]# mysqlbinlog --include-gtids='d780a5a6-055f-11f0-b6e6-c000c2907804:3-7' /usr/local/mysql/data/mysql-bin.000001 > /backup/mysql/gtid_incr.sql
# 导入恢复
[root@localhost ~]# mysql -uroot -p < /backup/mysql/gtid_incr.sql
五、企业级备份策略制定
5.1 策略制定原则
- 中小公司:每周一次全备,每日一次增量备
- 大公司:每周一次全备,每日多次增量备,结合主从复制提升可用性
- 核心原则:全备是基础,增量备平衡存储与恢复效率,定期验证备份可恢复性
5.2 备份与恢复最佳实践
- 备份文件需异地存储,避免单点故障
- 定期执行恢复演练,确保备份可用
- 核心业务库建议开启主从复制,实现读写分离与快速故障切换
- 结合监控工具,对备份任务与存储空间进行告警
总结
本章系统覆盖了 MySQL 备份恢复的全栈知识:
- 基础认知:理解备份分类、工具选型与核心原则
- 全量备份:掌握物理冷备与逻辑全备的操作与恢复
- 增量备份:精通基于 binlog 与 XtraBackup 的增量备份,实现高效数据保护
- 进阶应用:理解 GTID 机制,提升备份恢复的准确性与自动化水平
- 企业实践:制定符合业务场景的备份策略,保障数据安全与业务连续性
通过本章学习,可构建完整的 MySQL 备份恢复体系,成为企业数据安全的可靠守护者。