MySQL 全量、增量备份与恢复

MySQL 全量、增量备份与恢复

两种最常用的方案:

  1. **mysqldump + binlog:**逻辑备份,简单轻量,适合中小数据 / 测试环境
  2. **Percona XtraBackup:**物理热备,生产级标准,适合大数据量 / InnoDB 引擎

核心概念:

  • **全量备份:**备份所有数据,数据最快,但占用空间大、备份慢
  • **增量备份:**仅备份上一次备份后变化的数据,体积小、速度快
  • **恢复逻辑:**先恢复全量 → 按顺序恢复所有增量 → 还原到目的时间点

前置必备:开启二进制日志(binlog)

MySQL 增量备份必须依赖 binlog (记录所有数据修改操作)

1.开启配置

编辑 MySQL 配置文件(Linux:/etc/my.cnf;WIndows:my.ini

ini 复制代码
[mysqld]
log-bin=mysql-bin	# 开启 binlog,文件前缀
server-id=1			# 唯一 ID(必填)
binlog_format=row	# 行模式(推荐,最安全)
expire_logs_days=7	# 自动清理 7 天前的 binlog

2.重启生效

bash 复制代码
systemctl restart mysqld

3.验证

sql 复制代码
SHOW VARIABLES LIKE 'log_bin'

显示 ON 即为开启成功

方案一:mysqldump 全量 + binlog 增量(逻辑备份)

**使用场景:**数据量 < 50G、测试环境、跨版本迁移

**优点:**备份为 SQL 文件,可编辑、跨平台;**缺点:**大数据备份慢

一、备份操作

1.全量备份
bash 复制代码
# 创建备份目录
mkdir -p /backup

# 全量备份(所有库 + 不锁表 + 记录binlog位点 + 刷新日志)
mysqldump -uroot -p --all-databases --single-transaction --master-data=2 --flush-logs > /backup/full_$(date +%Y%m%d).sql

关键参数解释

  • --single-transaction:InnoDB 热备,不锁表
  • --master-data=2:记录 binlog 起始位置
  • --flush-logs:刷新 binlog,后续增量操作写入新文件
2.增量备份

全量备份后,所有数据修改都会写入新的 binlog 文件,直接拷贝 binlog 即可:

bash 复制代码
# 备份增量binlog(替换为实际文件名)
cp /var/lib/mysql/mysql-bin.000002 /backup/inc_$(date +%Y%m%d_%H%M)

二、恢复操作

场景:数据库崩溃,恢复到最新数据

bash 复制代码
# 1.停止 MySQL,禁止新数据写入
systemctl stop mysqld

# 2.恢复全量备份
mysql -uroot -p < /backup/full_20260330.sql

# 3.恢复增量 binlog(按顺序执行)
mysqlbinlog /var/lib/mysql/mysql-bin.000002 | mysql -uroot -p

# 4.精准恢复到指定时间点(可选)
mysqlbinlog -stop-datatime="2026-03-30 15:00:00" mysql-bin.000002 | mysql -uroot -p

# 5.启动MySQL
systemctl start mysqld

方案二:XtraBackup 全量 + 增量(物理热备 | 生产首选)

**使用场景:**数据量 > 50G、生产环境、InnoDB 引擎

**核心优势:**热备不锁表、备份 / 恢复速度快、支持增量

一、环境安装

bash 复制代码
# 安装Percona源
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y
# 安装备份工具
yum install percona-xtrabackup-24 -y

二、备份操作

1.全量备份
bash 复制代码
# 创建备份目录
mkdir -p /backup/full /backup/inc

# 全量备份(自动生成时间戳目录)
innobackupex -uroot -p /backup/full/

# 【必须】准备全量备份(同步数据,保证一致性)
innobackupex --apply-log /backup/full/2026-03-30_10-00-00
2.增量备份

第一次增量(基于全量)

bash 复制代码
innobackupex -uroot -p --incremental /backup/inc --incremental-basedir=/backup/full/2026-03-30_10-00-00

第二次增量(基于上一次增量)

bash 复制代码
innobackupex -uroot -p --incremental /backup/inc --incremental-basedir=/backup/inc/2026-03-30_11-00-00

三、恢复操作

核心规则:先合并所有增量到全量,再恢复数据

bash 复制代码
# 1. 停止MySQL
systemctl stop mysqld

# 2. 清空数据目录(⚠️ 谨慎操作!)
rm -rf /var/lib/mysql/*

# 3. 合并增量到全量(按顺序!最后一次不加--redo-only)
innobackupex --apply-log --redo-only /backup/full/2026-03-30_10-00-00
innobackupex --apply-log --redo-only /backup/full/2026-03-30_10-00-00 --incremental-dir=/backup/inc/2026-03-30_11-00-00
innobackupex --apply-log /backup/full/2026-03-30_10-00-00 --incremental-dir=/backup/inc/2026-03-30_12-00-00

# 4. 恢复数据到MySQL目录
innobackupex --copy-back /backup/full/2026-03-30_10-00-00

# 5. 修改文件权限(⚠️ 必做!否则启动失败)
chown -R mysql:mysql /var/lib/mysql

# 6. 启动MySQL
systemctl start mysqld
相关推荐
AC赳赳老秦几秒前
全链路自动化巡检:用 OpenClaw 实现服务器 - 应用 - 数据库全链路巡检,自动生成报告与整改建议
服务器·数据库·人工智能·深度学习·自动化·deepseek·openclaw
噢,我明白了5 分钟前
MySql数据库数据基础操作(增删改查)
数据库·mysql·增删改查
神明9315 分钟前
数据库模型设计实战:如何导出数据库完整数据字典_规范化流程
jvm·数据库·python
老纪7 分钟前
SQL中如何查找包含关键字的行:FULLTEXT全文索引检索
jvm·数据库·python
dfdfadffa9 分钟前
c++怎么利用std--filesystem--path处理包含多个扩展名的文件名【详解】
jvm·数据库·python
echola_mendes20 分钟前
InfluxDB(五)——分片、压缩与降采样三大核心技术
数据库·时序数据库
阿正呀22 分钟前
c++如何动态追加JSON数组到已有文件_nlohmann局部修改【详解】
jvm·数据库·python
m0_6908258223 分钟前
CSS如何使用-disabled控制禁用按钮的鼠标样式_通过状态伪类优化交互
jvm·数据库·python
2301_7950997424 分钟前
JavaScript事件委托机制在高性能列表开发中的应用
jvm·数据库·python
tongluowan00727 分钟前
MySql中Binlog,Redolog,Undolog的应用场景及作用的时机
mysql·日志文件