一、数据库备份概述
1.1 备份的核心意义
数据库备份是保障数据安全的最后一道防线,核心目标包括:
- 灾难恢复:硬件故障、误删数据、黑客攻击时快速恢复业务
- 数据追溯:通过增量备份与 binlog 实现基于时间点的精确恢复
- 业务迁移:跨机房、跨版本升级时平滑迁移数据
- 合规审计:满足行业数据留存与审计要求
1.2 备份类型分类
从物理与逻辑角度
表格
| 分类 | 定义 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 物理备份 | 直接复制数据库文件(数据文件、日志文件等) | 备份 / 恢复速度快、支持增量备份 | 跨平台兼容性差、恢复时需停机 | 大数据量、生产环境热备 |
| 逻辑备份 | 导出 SQL 语句(表结构 + 数据) | 跨平台兼容、可编辑、粒度细 | 备份 / 恢复速度慢、不支持高效增量 | 小数据量、测试环境、数据迁移 |
从备份策略角度
表格
| 分类 | 定义 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 全量备份 | 备份某一时间点的所有数据 | 恢复简单、依赖少 | 备份时间长、占用空间大 | 每周 / 每月基础备份 |
| 增量备份 | 仅备份自上次备份后变化的数据 | 备份速度快、空间占用小 | 恢复依赖全量 + 多次增量链 | 每日 / 高频备份 |
| 差异备份 | 仅备份自上次全量备份后变化的数据 | 恢复链路短(仅需全量 + 最后一次差异) | 备份体积随时间增大 | 折中方案 |
二、常见备份方法
2.1 物理冷备与恢复
物理冷备是最基础的物理备份方式,通过停机复制数据文件实现,适合停机窗口允许的场景。
备份步骤
-
停止 MySQL 服务
systemctl stop mysqld -
创建备份目录并复制数据文件
bakdir="/backup/fullbackups/$(date +%F_%H)" mkdir -p $bakdir cp -rp /var/lib/mysql/* $bakdir/ -
启动 MySQL 服务
systemctl start mysqld
恢复步骤
-
停止 MySQL 服务并清理数据目录
systemctl stop mysqld rm -rf /var/lib/mysql/* -
复制备份文件回数据目录
cp -rp $bakdir/* /var/lib/mysql/ -
修改权限并启动服务
chown -R mysql:mysql /var/lib/mysql systemctl start mysqld
2.2 mysqldump 逻辑备份与恢复
mysqldump 是 MySQL 官方逻辑备份工具,支持库 / 表级粒度备份,兼容性极强。
2.2.1 备份命令格式
表格
| 场景 | 命令格式 | 示例 |
|---|---|---|
| 备份单库 | mysqldump [选项] 库名 > 备份文件.sql |
mysqldump -u root -p test > test.sql |
| 备份单表 | mysqldump [选项] 库名 表名 > 备份文件.sql |
mysqldump -u root -p test user > test_user.sql |
| 备份多库 | mysqldump [选项] --databases 库1 库2 > 备份文件.sql |
mysqldump -u root -p --databases test mysql > multi_db.sql |
| 备份全库 | mysqldump [选项] --all-databases > 备份文件.sql |
mysqldump -u root -p --all-databases > all_db.sql |
2.2.2 关键选项说明
表格
| 选项 | 作用 |
|---|---|
-u |
指定连接用户名 |
-p |
交互式输入密码 |
--databases |
显式指定备份库(包含 CREATE DATABASE 语句) |
--all-databases |
备份所有数据库 |
--single-transaction |
对 InnoDB 引擎执行一致性快照备份(不加锁) |
--lock-tables |
对 MyISAM 引擎加读锁保证一致性 |
--routines |
备份存储过程 / 函数 |
--triggers |
备份触发器 |
--events |
备份事件调度器 |
2.2.3 恢复命令
-
恢复单库(备份文件含
CREATE DATABASE)mysql -u root -p < test.sql -
恢复单库(备份文件不含库创建语句)
mysql -u root -p test < test.sql -
恢复单表
mysql -u root -p test < test_user.sql -
source 命令恢复(登录 MySQL 后执行)
USE test;
source /path/to/test.sql;
2.3 基于 binlog 的增量备份与恢复
binlog 是 MySQL 的二进制日志,记录所有数据变更操作,是实现 ** 基于时间点恢复(PITR)** 的核心。
2.3.1 开启 binlog
编辑 MySQL 配置文件 /etc/my.cnf,添加以下配置:
[mysqld]
log_bin=mysql-bin
binlog_format=ROW
server_id=1
重启 MySQL 服务生效:
systemctl restart mysqld
2.3.2 查看 binlog 信息
-- 查看当前 binlog 文件与位置
SHOW MASTER STATUS;
-- 查看 binlog 内容
mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000001
2.3.3 基于 binlog 的恢复流程
-
全量备份 :先通过
mysqldump做全量备份mysqldump -u root -p --single-transaction test > test_full.sql -
模拟误操作 :如
DROP DATABASE test; -
导出增量 binlog :提取全量备份后到误操作前的 binlog
mysqlbinlog --no-defaults --include-gtids='d780a5a6-055f-11f0-b6e6-000c29078b04:3-7' /var/lib/mysql/mysql-bin.000001 > mysqlbak.sql -
恢复全量备份
mysql -u root -p < test_full.sql -
恢复增量 binlog
mysql -u root -p < mysqlbak.sql
2.3.4 基于时间点 / 位置的恢复
-
基于位置恢复
mysqlbinlog --no-defaults --start-position=2007 --stop-position=2188 /var/lib/mysql/mysql-bin.000001 | mysql -u root -p -
基于时间恢复
mysqlbinlog --no-defaults --start-datetime='2025-03-24 19:00:00' --stop-datetime='2025-03-24 19:30:00' /var/lib/mysql/mysql-bin.000001 | mysql -u root -p
2.4 XtraBackup 物理热备与增量备份
XtraBackup 是 Percona 开发的开源物理热备工具,专为 InnoDB 引擎设计,支持在线热备、增量备份、压缩备份,是生产环境首选方案。
2.4.1 安装 XtraBackup
# 下载并解压
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
tar zxf percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17.tar.gz
mv percona-xtrabackup-8.0.35-30-Linux-x86_64.glibc2.17 /usr/local/xtrabackup
# 配置环境变量
echo 'export PATH=$PATH:/usr/local/xtrabackup/bin' >> /etc/profile
source /etc/profile
2.4.2 全量备份与恢复
全量备份
fulldir="/backup/fullbackups/$(date +%F_%H)"
mkdir -p $fulldir
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=secret --backup --compress --target-dir=$fulldir
全量恢复
-
停止 MySQL 并清理数据目录 bash
systemctl stop mysqld rm -rf /var/lib/mysql/* -
解压备份并准备恢复 bash
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=secret --decompress --target-dir=$fulldir xtrabackup --defaults-file=/etc/my.cnf --user=root --password=secret --prepare --target-dir=$fulldir -
复制数据并启动服务
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=secret --copy-back --target-dir=$fulldir chown -R mysql:mysql /var/lib/mysql systemctl start mysqld
2.4.3 增量备份与恢复
增量备份
# 基于全量备份创建增量备份
incdir="/backup/incrementalbackups/$(date +%F_%H)"
mkdir -p $incdir
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=secret --backup --compress --target-dir=$incdir --incremental-basedir=$fulldir
增量恢复
-
准备全量备份(仅应用 redo log)
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=secret --prepare --apply-log-only --target-dir=$fulldir -
合并增量备份到全量备份
xtrabackup --defaults-file=/etc/my.cnf --user=root --password=secret --prepare --apply-log-only --target-dir=$fulldir --incremental-dir=$incdir -
执行全量恢复步骤(同 2.4.2)
三、实战案例:误删数据库的完整恢复流程
场景描述
- 全量备份时间:2025-03-24 18:00
- 误操作:2025-03-24 19:28 执行
DROP DATABASE test; - 目标:恢复到误删前的状态
步骤 1:全量备份
mysqldump -u root -p --single-transaction test > test_full_2025032418.sql
步骤 2:记录 binlog 位置
SHOW MASTER STATUS;
-- 记录 File: mysql-bin.000001, Position: 2007
步骤 3:模拟业务操作与误删
INSERT INTO user VALUES(4);
INSERT INTO user VALUES(5);
DROP DATABASE test;
步骤 4:提取增量 binlog
mysqlbinlog --no-defaults --start-position=2007 --stop-position=2188 /var/lib/mysql/mysql-bin.000001 > test_incr_2025032419.sql
步骤 5:恢复全量备份
mysql -u root -p < test_full_2025032418.sql
步骤 6:恢复增量 binlog
mysql -u root -p < test_incr_2025032419.sql
步骤 7:验证数据
USE test;
SELECT * FROM user;
-- 预期结果:包含 id=1~5 的 5 条数据
四、备份策略与最佳实践
4.1 推荐备份策略
表格
| 周期 | 备份类型 | 工具 | 保留周期 |
|---|---|---|---|
| 每周日 | 全量备份 | XtraBackup | 保留 4 周 |
| 周一~周六 | 增量备份 | XtraBackup | 保留 7 天 |
| 实时 | binlog 归档 | mysqlbinlog | 保留 30 天 |
4.2 核心最佳实践
- 备份验证:定期恢复备份并验证数据完整性,避免备份失效
- 异地存储:备份文件需存储到异地(对象存储 / 另一机房),防止机房级灾难
- 权限控制 :备份文件权限设为
600,仅允许 root 访问 - 监控告警:监控备份任务执行状态与备份文件大小,异常时及时告警
- 演练机制:每季度进行一次灾难恢复演练,确保流程熟练
五、总结
MySQL 备份恢复是运维工作的核心技能,本文系统梳理了:
- 物理备份 vs 逻辑备份的本质差异与适用场景
mysqldump逻辑备份的标准流程与命令- 基于 binlog 的增量恢复与时间点恢复技术
- XtraBackup 物理热备与增量备份的生产级实践
- 误删数据库的完整恢复案例
通过合理的备份策略与工具选型,可有效保障 MySQL 数据安全,将故障恢复时间(RTO)与数据丢失量(RPO)控制在业务可接受范围内。
小贴士 :生产环境中建议优先使用 XtraBackup + binlog 组合方案,兼顾备份效率与恢复灵活性;小数据量场景可使用
mysqldump简化操作。
常见问题 FAQ
表格
| 问题 | 解决方案 |
|---|---|
mysqldump: Access denied |
检查用户名 / 密码权限,确保 SELECT, LOCK TABLES 权限 |
mysqlbinlog: unknown option |
检查选项拼写(如 --no-defaults 勿写成 --no-defaulte) |
Table 'xxx' doesn't exist |
确认库 / 表名拼写,先执行 USE 库名; 再操作表 |
| XtraBackup 恢复失败 | 检查数据目录 |