MySQL 数据备份

在生产环境中可能会遇到各种状况导致数据丢失,最主要的导致数据丢失的原因有这几种:硬件故障,软件故障,自然灾害,黑客攻击,误操作 (占比最大)。所以为了防止原数据丢失,保证数据的安全,我们需要定期对数据进行备份。

一、MySQL 数据备份类型

MySQL 数据备份按数据库运行状态可分为冷备、热备、温备三类,核心区别在于备份时数据库的可用性(是否允许读写)

1、冷备份

备份时数据库完全关闭(停止服务),读、写操作均不可进行。直接拷贝数据库物理文件(如ibdata1、表空间文件.ibd、日志文件等)。由于文件无写入操作,备份结果绝对一致。

2、热备份

备份时数据库正常运行,读写操作不受影响(既允许查询也允许更新),均可执行。需依赖数据库引擎的特性,MyISAM 只支持温备,不支持热备,InnoDB都支持(因为它支持事务)。通过在线快照 + 日志回放实现一致性备份。

3、温备份

备份时数据库运行,但仅允许读操作,禁止写操作(通常通过加全局读锁实现)。备份过程中业务写请求会阻塞,影响部分可用性。

4、其余备份概念

相关概念 说明
完全备份 备份整个数据库全部数据
部份备份 只备份部份数据子集,例如部份库或表
增量备份 仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂
差异备份 仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单
物理备份 直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快
逻辑备份 从数据库中 "导出" 数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度

二、mysqldump 备份工具

mysqldump 是 MySQL 官方提供的客户端备份工具,通过 mysql 协议连接至 mysql 服务器进行备份,mysqldump 命令是将数据库中的数据备份成一个文本文件,数据表的结构和数据都存储在生成的文本文件中。

1、全量备份

基本原理

通过 MySQL 客户端连接数据库,执行查询获取所有表的结构(CREATE TABLE)和数据(INSERT),生成包含完整数据的 SQL 文本文件,为某一时间点的全量快照。

操作步骤

备份所有数据库

bash 复制代码
mysqldump -u 用户名 -p  --all-databases > /data/all_bakckup.sql

还原整库的备份数据

bash 复制代码
mysql -u 用户名 -p < /data/all_bakckup.sql

备份指定数据库

bash 复制代码
mysqldump -u 用户名 -p --databases dbname > /data/dbname_backup.sql

还原指定数据库的备份数据

bash 复制代码
mysq -u 用户名 -p  dbname < /data/dbname_backup.sql

2、增量备份(结合二进制日志)

基本原理

全量备份仅记录某一时间点的状态,而 MySQL 二进制日志(binlog)记录了所有数据修改操作(增删改、DDL 等)。增量备份通过备份全量备份之后产生的 binlog 片段,实现 "全量 + 增量" 的完整数据恢复(全量恢复到基准点,再回放增量 binlog 到目标时间)。

二进制日志(Binary Log)也可叫作变更日志(Update Log),是 MySQL 中非常重要的日志。主要用于记录数据库的变化情况,即 SQL 语句的 DDL 和 DML 语句,但不包含查询操作语句,因为查询语句并不会改变数据库中的数据。如果 MySQL 数据库意外停止,可以通过二进制日志文件来查看用户执行了哪些操作,对数据库服务器文件做了哪些修改,然后根据二进制日志文件中的记录来恢复数据库服务器。

前提条件

需开启二进制日志(自 MySQL8.0 开始,默认开启了二进制日志功能,之前版本默认是关闭)

bash 复制代码
[mysqld]
log_bin = /var/lib/mysql/binlog  # binlog存储路径,最后的binlog是文件名前缀,不是目录

操作步骤

全量备份需明确 "增量起始点"(即全量备份结束时的 binlog 文件名和位置),使用--single-transaction --master-data=2参数自动记录。

--master-data 选项用于在备份文件中包含二进制日志文件名和位置信息。这对于将来进行时间点恢复至关重要,因为它允许你指定恢复到特定的时间点。

  • --master-data=0:不记录二进制日志信息。

  • --master-data=1:在备份文件中包含 CHANGE MASTER TO 语句,用于指定二进制日志的位置。

  • --master-data=2:与 --master-data=1 类似,但 CHANGE MASTER TO 语句会被注释掉。这通常用于安全性更高的场景,因为注释掉的语句不会被直接执行。

  • --master-data 选项不写,等于 --master-data=0;--master-data 选项,等于 --master-data=1

bash 复制代码
mysqldump -u 用户名 -p --single-transaction --master-data=2 --databases dbname > /data/dbname_backup.sql

备份文件中会包含类似注释(表示全量结束时 binlog 为 binlog.000003,位置154)

sql 复制代码
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=154;

全量备份后,新的修改会写入 binlog,需定期备份新增的 binlog 片段

bash 复制代码
cp /var/lib/mysql/binlog.000004 /data/binlog.000004

恢复增量备份文件

bash 复制代码
# 导出binlog中从位置154到结束的操作,导入数据库
mysqlbinlog --start-position=154 /var/lib/mysql/binlog.000003 /data/binlog.000004 | mysql -u 用户名 -p dbname

三、冷备与 mysqldump 备份对比

对比维度 冷备 mysqldump
备份原理 直接拷贝数据文件(非 SQL 文本),备份 / 恢复速度快(仅文件 IO 操作) 通过 SQL 语句(CREATE TABLE、INSERT等)生成文本文件,可读性强
数据库运行状态 需停库,备份期间数据库不可用,影响业务 无需停库,可在线备份(但可能加锁,如 MyISAM 需锁表)
灵活性 高,支持单库、单表备份
兼容性 跨版本兼容性差 跨版本兼容性高,因为SQL语句通用性强
效率 高,恢复速度快 低,恢复速度慢
适用场景 接受停库,需要快速恢复,数据量极大 无法停库,数据量较小,需要灵活备份或跨版本迁移
相关推荐
2401_8414956413 小时前
【数据结构】B+树
数据结构·数据库·c++·b+树·概念·结构·操作原理
Hardworking66615 小时前
第7章 软硬件系统集成
数据库·软硬件系统集成
名字还没想好☜15 小时前
Go 的 time.Ticker 陷阱:定时任务里被忽略的内存泄漏与正确关闭
java·数据库·golang·go·定时器
关关长语15 小时前
Wsl解决MySQL容器跨域权限问题
mysql·docker·容器
熊猫钓鱼>_>15 小时前
Redis 突发缓存穿透:一次完整的定位复盘
数据库·人工智能·redis·缓存·ai·agent·智能
wenb1n16 小时前
MySQL诊断系列(3/6):索引分析——5个SQL揪出“僵尸索引”
数据库·人工智能·编程语言
这个DBA有点耶16 小时前
索引碎片与统计信息维护:执行计划突然变差的隐形杀手
mysql·程序员·架构
段一凡-华北理工大学16 小时前
向量数据库实战:选型、调优与落地~系列文章03:向量相似度算法全解:余弦、欧氏、内积,到底该用哪个?
大数据·数据库·人工智能·算法·机器学习·向量相似度·高炉炼铁
ClouGence17 小时前
CloudDM 数据库管理平台,全新 UI,更清晰、更高效!
数据库·开源
Mico1818 小时前
MySQL 8.0.35 GTID 主从复制搭建-基于GITD
android·mysql·adb