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语句通用性强
效率 高,恢复速度快 低,恢复速度慢
适用场景 接受停库,需要快速恢复,数据量极大 无法停库,数据量较小,需要灵活备份或跨版本迁移
相关推荐
ShiJiuD6668889991 天前
mysql 基础笔记一
数据库·笔记·mysql
zzh0811 天前
数据库初识与安装
数据库
m0_738098021 天前
使用Python操作文件和目录(os, pathlib, shutil)
jvm·数据库·python
standovon1 天前
【MySQL基础篇】概述及SQL指令:DDL及DML
sql·mysql·oracle
AI成长日志1 天前
【实用工具教程】数据库基础操作实战:SQLite/MySQL连接、CRUD操作与查询优化
数据库·mysql·sqlite
l1t1 天前
DeepSeek总结的 DuckDB 1.5 功能亮点
数据库·sql·duckdb
Bdygsl1 天前
MySQL(4)—— 表设计
数据库·mysql
2301_819414301 天前
使用Python进行图像识别:CNN卷积神经网络实战
jvm·数据库·python
未来龙皇小蓝1 天前
【MySQL-索引调优】09:Order By相关概念
数据库·mysql·性能优化
未来龙皇小蓝1 天前
【MySQL-索引调优】10:常见的分页优化处理
数据库·mysql·性能优化