MySQL 全量、增量备份与恢复(极简易懂版)

一、基础概念(必懂)

1. 备份分类

  • 全量备份:备份整个数据库,操作简单,但数据重复、占空间。
  • 增量备份:只备份上次备份后变化的数据,省空间、速度快,依赖二进制日志。
  • 物理备份:直接拷贝数据文件,适合大数据量。
  • 逻辑备份:导出 SQL 脚本,跨平台、易编辑。

2. 核心前提

MySQL 8.0 默认开启binlog(二进制日志),增量备份必须靠它!


二、前置操作:创建库 / 表 / 数据(基础必练)

1. 登录 MySQL

复制代码
mysql -u root -p

2. 创建数据库 + 表

sql

复制代码
-- 创建库
CREATE DATABASE client;

-- 切换库
USE client;

-- 创建表
CREATE TABLE user_info(
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(20) NOT NULL,
    phone VARCHAR(11)
);

3. 插入测试数据

sql

复制代码
INSERT INTO user_info(name,phone) VALUES('张三','13800138000');
INSERT INTO user_info(name,phone) VALUES('李四','13900139000');

4. 查看数据

sql

复制代码
SELECT * FROM user_info;

三、全量备份与恢复(最常用)

方式 1:物理冷备份(关库打包)

适合停机维护、非核心业务

bash

运行

复制代码
# 1. 关闭MySQL
systemctl stop mysqld

# 2. 创建备份目录
mkdir /backup

# 3. 打包数据目录(全量备份)
tar zcf /backup/mysql_all-$(date +%F).tar.gz /usr/local/mysql/data/

# 4. 恢复(模拟故障后)
tar zxf /backup/mysql_all-日期.tar.gz -C /
systemctl start mysqld

方式 2:mysqldump 逻辑备份(推荐)

备份命令

bash

运行

复制代码
# 备份单个库
mysqldump -u root -p client > /backup/client-$(date +%F).sql

# 备份所有库
mysqldump -u root -p --all-databases > /backup/all-$(date +%F).sql

恢复命令

bash

运行

复制代码
# 方式1:系统命令导入
mysql -u root -p client < /backup/client-日期.sql

# 方式2:MySQL内source恢复
mysql> source /backup/client-日期.sql

四、增量备份与恢复(高效省空间)

1. 开启 binlog(MySQL8.0 默认已开,可自定义)

bash

运行

复制代码
vim /etc/my.cnf

添加配置:

ini

复制代码
[mysqld]
log-bin=mysql-bin
binlog_format=MIXED
server-id=1

重启生效:

bash

运行

复制代码
systemctl restart mysqld

2. 增量备份步骤

  1. 先做全量备份
  2. 刷新 binlog,生成新日志

bash

运行

复制代码
mysqladmin -u root -p flush-logs
  1. 新增数据后,拷贝 binlog 文件完成增量备份

bash

运行

复制代码
cp /usr/local/mysql/data/mysql-bin.00000* /backup/

3. 增量恢复(3 种方式)

(1)普通全量恢复

bash

运行

复制代码
mysqlbinlog --no-defaults /backup/mysql-bin.000002 | mysql -u root -p
(2)按位置精准恢复(跳过误操作)

先查看 binlog 找到操作位置:

bash

运行

复制代码
mysqlbinlog --no-defaults /backup/mysql-bin.000002

恢复到指定位置:

bash

运行

复制代码
# 恢复到某个位置停止
mysqlbinlog --no-defaults --stop-position='663' /backup/mysql-bin.000002 | mysql -u root -p

# 从指定位置开始恢复
mysqlbinlog --no-defaults --start-position='663' /backup/mysql-bin.000002 | mysql -u root -p
(3)按时间点恢复

bash

运行

复制代码
# 恢复到某个时间点
mysqlbinlog --no-defaults --stop-datetime='2026-03-30 12:00:00' /backup/mysql-bin.000002 | mysql -u root -p

五、补充必备知识点

1. 库表切换常用命令

sql

复制代码
-- 查看所有库
SHOW DATABASES;

-- 切换库
USE 库名;

-- 查看库中表
SHOW TABLES;

-- 查看表结构
DESC 表名;

-- 删除库/表
DROP DATABASE 库名;
DROP TABLE 表名;

2. 备份策略(企业通用)

  • 中小公司:每天 1 次全量备份
  • 大公司:每周 1 次全量 + 每天增量备份
  • 备份时间:选凌晨业务低峰期
  • 必须做:备份后测试恢复

3. 关键工具说明

  • mysqldump:逻辑备份,简单通用,适合中小数据量
  • mysqlbinlog:解析 binlog,做增量恢复
  • XtraBackup:物理热备,适合 50G 以上大数据量,不锁表

4. 易错提醒

  • 增量恢复必须先恢复全量,再按顺序恢复增量
  • binlog 文件不要删除,定期备份到其他服务器
  • 恢复前先备份当前数据,防止二次损坏

六、极简流程总结

  1. 建库表→插数据
  2. 全量备份(mysqldump)
  3. 开启 binlog→刷新日志→增量备份
  4. 故障:先全量恢复→再增量恢复
  5. 按位置 / 时间精准跳过误操作

七、扩展知识点

1. GTID 增强恢复

GTID = 全局事务 ID,避免重复执行事务,主从复制 + 增量恢复更安全。

bash

运行

复制代码
# 开启GTID
vim /etc/my.cnf
[mysqld]
gtid_mode=ON
enforce_gtid_consistency=ON

2. XtraBackup 物理热备(大库首选)

  • 支持在线热备,不锁库、不影响业务。
  • 适合50G 以上大库,备份恢复远快于 mysqldump。

全流程命令速查

表格

操作 命令
冷备全量 tar zcf /backup/mysql_all.tar.gz /data/
mysqldump 全库 mysqldump -p --all-databases > all.sql
开启 binlog 配置 log-bin、server-id
增量备份 flush-logs + 复制 binlog
按位置恢复 --stop-position/--start-position
按时间恢复 --stop-datetime/--start-datetime
相关推荐
独隅3 小时前
Linux 系统下 ADB 环境 的详细安装步骤和基础设置指南
linux·运维·adb
always_TT3 小时前
内存泄漏是什么?如何避免?
android·java·开发语言
2301_805348973 小时前
MySQL源码编译部署主从及MHA高可用集群实战
adb
xiangxiongfly9153 小时前
Android ViewRootImpl源码分析
android·绘制流程·viewrootimpl·activitythread
Carino_U3 小时前
全面理解mysql架构
mysql·adb·架构
w-白兰地4 小时前
配置Unity中的ADB环境变量
unity·adb·游戏引擎
Yang-Never4 小时前
ADB ->Android 实时监控内存
android·开发语言·adb·android studio
zhangren024684 小时前
Laravel5.x版本特性全解析
android·vue.js·spring boot·mysql
2501_915918414 小时前
WebKit 抓包,WKWebView 请求的完整数据获取方法
android·前端·ios·小程序·uni-app·iphone·webkit