备份与恢复
问题
数据库有哪些备份方式?如何实现时间点恢复(PITR)?全量备份和增量备份怎么配合?
答案
备份分类
| 维度 | 类型 | 说明 |
|---|---|---|
| 范围 | 全量备份 / 增量备份 / 差异备份 | 全部数据 / 上次全量后变更 / 上次备份后变更 |
| 方式 | 逻辑备份 / 物理备份 | SQL 导出 / 数据文件拷贝 |
| 状态 | 热备 / 温备 / 冷备 | 不影响业务 / 只读 / 停机 |
逻辑备份 vs 物理备份
| 对比 | 逻辑备份(mysqldump) | 物理备份(XtraBackup) |
|---|---|---|
| 速度 | 慢(逐行导出) | 快(文件级拷贝) |
| 恢复速度 | 慢(逐行执行 SQL) | 快(文件拷贝) |
| 跨版本 | ✅ 支持 | ❌ 需相同版本 |
| 压缩 | 好(纯文本) | 一般 |
| 粒度 | 表级 | 库级 |
| 大数据量 | ❌ 不适合(>100GB) | ✅ 适合 |
mysqldump
# 全库备份
mysqldump -u root -p --all-databases --single-transaction \
--master-data=2 --flush-logs > full_backup.sql
# 单库备份
mysqldump -u root -p --single-transaction mydb > mydb_backup.sql
# 单表备份
mysqldump -u root -p mydb users orders > tables_backup.sql
重要参数:
| 参数 | 说明 |
|---|---|
--single-transaction | InnoDB 一致性快照(不锁表) |
--master-data=2 | 记录 binlog 位置(注释形式) |
--flush-logs | 刷新 binlog,方便增量恢复 |
--routines | 备份存储过程和函数 |
--triggers | 备份触发器 |
XtraBackup(Percona)
# 全量备份
xtrabackup --backup --target-dir=/backup/full
# 准备备份(应用 redo log)
xtrabackup --prepare --target-dir=/backup/full
# 增量备份(基于全量)
xtrabackup --backup --target-dir=/backup/inc1 \
--incremental-basedir=/backup/full
# 恢复
xtrabackup --copy-back --target-dir=/backup/full
PITR(Point-In-Time Recovery)
时间点恢复:恢复到任意时刻的数据状态。
PITR 步骤:
# 1. 恢复全量备份
mysql < full_backup.sql
# 2. 重放 binlog 到误操作之前
mysqlbinlog --start-datetime="2024-01-15 00:00:00" \
--stop-datetime="2024-01-15 14:30:00" \
mysql-bin.000001 mysql-bin.000002 | mysql
# 或用 GTID 范围
mysqlbinlog --include-gtids="uuid:1-100" \
--exclude-gtids="uuid:95" \ # 排除误操作的事务
mysql-bin.000001 | mysql
备份策略建议
| 场景 | 策略 |
|---|---|
小数据库(<10GB) | 每天 mysqldump 全量 |
| 中等数据库(10-500GB) | 每周全量 + 每天增量(XtraBackup) |
大数据库(>500GB) | 每周全量 + 每天增量 + binlog 实时备份 |
3-2-1 原则:
- 3 份数据副本
- 2 种不同存储介质
- 1 份异地备份
常见面试问题
Q1: 误删数据如何恢复?
答案:
- 发现误操作:立即停止相关业务写入
- 确认备份:找到最近的全量备份和 binlog
- 恢复全量:在新实例上恢复全量备份
- 重放 binlog:重放到误操作之前的时间点(跳过误操作的事务)
- 验证数据:确认恢复的数据正确
- 导入生产:将恢复的数据导入生产库
关键:必须有开启 binlog,否则无法做 PITR。
Q2: mysqldump 的 --single-transaction 原理是什么?
答案:
对于 InnoDB 表,--single-transaction 会在备份开始时开启一个一致性快照事务(REPEATABLE READ),利用 MVCC 读取备份开始时刻的数据,不需要加表锁,不影响在线业务。
注意:仅对 InnoDB 有效。MyISAM 表仍需要 LOCK TABLES。
Q3: 如何验证备份的有效性?
答案:
- 定期恢复测试:将备份恢复到测试环境,验证数据完整性
- 校验工具:
pt-table-checksum比对主从/备份的数据一致性 - 自动化验证:CI/CD 中定期执行备份恢复 + 数据校验
- 监控备份状态:监控备份任务是否按时完成、备份文件大小是否异常