MySQL 备份与恢复
MySQL 备份核心分为冷备份、逻辑备份、增量备份 三大类,分别适配不同业务场景(停机 / 在线、全量 / 增量、小型 / 大型数据库),备份的核心目标是数据不丢失、故障可恢复 ,恢复的核心是保证数据一致性、快速回滚。
下面从定义、适用场景、备份 / 恢复命令、优缺点四个维度完整总结,覆盖生产常用方案。
一、冷备份(物理备份)
1. 核心定义
数据库完全停止运行 后,直接复制 MySQL 数据文件,属于物理级全量备份。
2. 适用场景
- 允许停机维护的业务(非核心、离线系统)
- 数据库迁移、全新环境初始化
- 数据量小、追求备份速度的场景
3. 备份步骤
- 停止 MySQL 服务
bash
systemctl stop mysqld
- 复制整个数据目录(默认
/var/lib/mysql)
bash
cp -r /var/lib/mysql /backup/mysql_cold_$(date +%Y%m%d)
- 重启 MySQL 服务
bash
systemctl start mysqld
4. 恢复步骤
- 停止 MySQL
- 删除原有数据目录
- 将备份文件复制回原路径
- 修改文件权限(
chown -R mysql:mysql /var/lib/mysql) - 启动 MySQL
5. 优缺点
| 优点 | 缺点 |
|---|---|
| 备份 / 恢复速度极快(文件复制) | 必须停机,无法在线备份 |
| 操作简单,无技术门槛 | 跨平台兼容性差(Windows→Linux 不可用) |
| 备份文件体积小 | 只能全量备份,无法增量备份 |
二、逻辑备份
1. 核心定义
数据库在线运行 时,导出SQL 语句 / 数据文本 (建库、建表、插入数据),属于逻辑级全量备份 ,生产最常用工具:mysqldump。
2. 适用场景
- 中小规模数据库(≤50GB)
- 在线备份、无需停机
- 跨版本、跨平台迁移(MySQL 5.7→8.0)
- 需查看 / 编辑备份内容的场景
3. 常用备份命令
基础全量备份(所有库)
bash
mysqldump -u root -p --all-databases > all_db_$(date +%Y%m%d).sql
单库备份
bash
mysqldump -u root -p test_db > test_db.sql
单库特定表
bash
mysqldump -u root -p database_name table1 table2 > tables_backup.sql
保证数据一致性(InnoDB 必加)
bash
# InnoDB 在线热备(无锁、一致性)
mysqldump -u root -p --single-transaction --master-data=2 test_db > test_db_consistent.sql
--single-transaction:InnoDB 事务一致性备份,不锁表--master-data=2:记录 binlog 位置,用于增量备份
4. 恢复命令
bash
# 方式1:mysql 客户端直接恢复
mysql -u root -p test_db < test_db.sql
# 方式2:登录后执行
mysql -u root -p
use test_db;
source /backup/test_db.sql;
5. 优缺点
| 优点 | 缺点 |
|---|---|
| 在线备份,无需停机 | 备份 / 恢复速度慢(大数据量低效) |
| 备份文件是文本,可编辑 | 备份文件体积大 |
| 跨平台、跨版本兼容好 | 全量备份,频繁备份占用空间 |
三、增量备份
1. 核心定义
只备份上一次全量 / 增量备份后变化的数据 ,基于 MySQL 二进制日志(binlog) 实现,无数据重复,节省空间和时间。
2. 适用场景
- 大型数据库(>50GB)、核心业务
- 要求实时备份、最小数据丢失
- 配合全量备份,实现全量 + 增量组合方案
3. 前置条件
必须开启 binlog(MySQL 8.0 默认开启)
bash
# my.cnf 配置
log_bin = mysql-bin
binlog_format = ROW # 推荐行模式,数据最安全
server_id = 1
4. 备份步骤
- 先做一次全量逻辑备份(基准)
- 定期刷新 binlog,备份新生成的日志
bash
# 刷新 binlog,生成新日志文件
mysqladmin -u root -p flush-logs
# 复制旧 binlog 文件完成增量备份
cp /var/lib/mysql/mysql-bin.000001 /backup/binlog_000001
5. 恢复步骤
- 先恢复最近一次全量备份
- 再按顺序执行增量 binlog 日志
bash
# 解析并执行 binlog 恢复数据
mysqlbinlog /backup/binlog_000001 | mysql -u root -p test_db
- 可指定时间点 / 位置恢复(精准回滚)
bash
# 按时间点恢复
mysqlbinlog --start-time="2025-01-01 10:00:00" --stop-time="2025-01-01 12:00:00" binlog.000001 | mysql -u root -p
6. 优缺点
| 优点 | 缺点 |
|---|---|
| 备份速度快、占用空间小 | 恢复麻烦,需依赖全量 + 所有增量日志 |
| 支持基于时间点恢复 | 必须开启 binlog,有轻微性能损耗 |
| 可频繁备份(小时 / 分钟级) | 日志损坏会导致恢复失败 |
四、三种备份方案对比与生产最佳实践
1. 方案核心对比
| 类型 | 备份方式 | 是否停机 | 速度 | 适用数据量 | 恢复难度 |
|---|---|---|---|---|---|
| 冷备份 | 物理文件复制 | 是 | 极快 | 小 | 低 |
| 逻辑备份 | 导出 SQL | 否 | 中 | 中小 | 低 |
| 增量备份 | binlog 日志 | 否 | 快 | 中大 | 中 |
2. 生产环境推荐备份策略
全量备份 + 增量备份 组合(最优)
- 每天凌晨:执行一次
mysqldump全量备份 - 每小时 / 实时:备份 binlog 增量日志
- 故障恢复:全量 → 增量依次恢复,保证数据最小丢失
总结
- 冷备份:最简单、最快,但必须停机,仅适合离线场景
- 逻辑备份(mysqldump):通用、在线、兼容好,中小数据库首选
- 增量备份(binlog):高效、省空间,配合全量备份实现核心数据高可靠恢复
- 生产标准方案:每周全量 + 每日增量,支持时间点精准恢复,兼顾安全与效率