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
相关推荐
weixin_403810137 小时前
AI智能体写安卓自动化脚本教程:Cursor/Trae+CLI 实战,自然语言生成代码
android·人工智能·自动化·跨境电商·安卓自动化脚本·多账户运营
呆呆小孩9 小时前
零基础学 MySQL(上):从建库建表到增删改查,一篇搭好 SQL 基础
android·sql·mysql
catchadmin9 小时前
NativePHP v4 让 Blade 构建原生 iOS 与 Android 界面
android·ios·ai·php
FfHUCisI10 小时前
Golang 数据库连接池深度调优
android·数据库·golang
古法安卓13 小时前
Android-epoll原理详解
android·java·android studio
字节暗面15 小时前
四款 APP 加固强度测评:让 AI 拆了四个包,结果有点出乎意料
android·逆向工程·加固
网安蟹佬霸15 小时前
蓝队防御实战:SIEM与SOAR构建安全运营中心(万字详解+实战配置)
android·安全·web安全·网络安全·网安
敢敢のwings16 小时前
世界模型与FlashWorld:从“在梦中学习“到秒级3D场景生成
android·学习·3d
Dovis(誓平步青云)17 小时前
牛奶不能减成负数:冰箱库存的筛选、去重与不可变更新
android·java·开发语言
Awna18 小时前
MySQL 存储空间与索引运维实战:从空间排查到在线扩容
android·运维·mysql