MySQL 备份与恢复

MySQL 备份与恢复

MySQL 备份核心分为冷备份、逻辑备份、增量备份 三大类,分别适配不同业务场景(停机 / 在线、全量 / 增量、小型 / 大型数据库),备份的核心目标是数据不丢失、故障可恢复 ,恢复的核心是保证数据一致性、快速回滚

下面从定义、适用场景、备份 / 恢复命令、优缺点四个维度完整总结,覆盖生产常用方案。


一、冷备份(物理备份)

1. 核心定义

数据库完全停止运行 后,直接复制 MySQL 数据文件,属于物理级全量备份

2. 适用场景

  • 允许停机维护的业务(非核心、离线系统)
  • 数据库迁移、全新环境初始化
  • 数据量小、追求备份速度的场景

3. 备份步骤

  1. 停止 MySQL 服务
bash 复制代码
systemctl stop mysqld
  1. 复制整个数据目录(默认 /var/lib/mysql
bash 复制代码
cp -r /var/lib/mysql /backup/mysql_cold_$(date +%Y%m%d)
  1. 重启 MySQL 服务
bash 复制代码
systemctl start mysqld

4. 恢复步骤

  1. 停止 MySQL
  2. 删除原有数据目录
  3. 将备份文件复制回原路径
  4. 修改文件权限(chown -R mysql:mysql /var/lib/mysql
  5. 启动 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. 备份步骤

  1. 先做一次全量逻辑备份(基准)
  2. 定期刷新 binlog,备份新生成的日志
bash 复制代码
# 刷新 binlog,生成新日志文件
mysqladmin -u root -p flush-logs

# 复制旧 binlog 文件完成增量备份
cp /var/lib/mysql/mysql-bin.000001 /backup/binlog_000001

5. 恢复步骤

  1. 先恢复最近一次全量备份
  2. 再按顺序执行增量 binlog 日志
bash 复制代码
# 解析并执行 binlog 恢复数据
mysqlbinlog /backup/binlog_000001 | mysql -u root -p test_db
  1. 可指定时间点 / 位置恢复(精准回滚)
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. 生产环境推荐备份策略

全量备份 + 增量备份 组合(最优)

  1. 每天凌晨:执行一次 mysqldump 全量备份
  2. 每小时 / 实时:备份 binlog 增量日志
  3. 故障恢复:全量 → 增量依次恢复,保证数据最小丢失

总结

  1. 冷备份:最简单、最快,但必须停机,仅适合离线场景
  2. 逻辑备份(mysqldump):通用、在线、兼容好,中小数据库首选
  3. 增量备份(binlog):高效、省空间,配合全量备份实现核心数据高可靠恢复
  4. 生产标准方案:每周全量 + 每日增量,支持时间点精准恢复,兼顾安全与效率
相关推荐
思麟呀1 小时前
MySQL的内置函数
数据库·mysql
熏鱼的小迷弟Liu1 小时前
【MySQL】MySQL中的MVCC是什么?它与隔离级别有什么关系?
mysql·mvcc
Mike117.1 小时前
GBase 8a 慢任务处理时 KILL 和 PROCESSLIST 的使用边界
大数据·数据库
sun03221 小时前
介绍一下 Oracle中的 ROWNUM 和 ROW_NUMBER OVER
数据库·oracle
六月雨滴1 小时前
Oracle 数据库实例启动与关闭
数据库·oracle·dba
NineData1 小时前
还在轮询 MySQL 吗?用 NineData 把业务变更直接送进 Kafka
数据库·mysql·kafka·ninedata·数据复制·玖章算术·数据迁移工具
gQ85v10Db1 小时前
Redis分布式锁进阶第三十二篇
数据库·redis·分布式
wmm_会飞的@鱼2 小时前
FlexSim-基于SLP方法的A汽车企业总装车间布局优化
前端·数据结构·数据库·python·数学建模·汽车
北秋,2 小时前
Web Security Academy 第三关:SQL 注入查询 Oracle 数据库版本
数据库·sql·oracle