MySQL 数据备份
在生产环境中可能会遇到各种状况导致数据丢失,最主要的导致数据丢失的原因有这几种:硬件故障,软件故障,自然灾害,黑客攻击,误操作 (占比最大)。所以为了防止原数据丢失,保证数据的安全,我们需要定期对数据进行备份。
一、MySQL 数据备份类型
MySQL 数据备份按数据库运行状态可分为冷备、热备、温备三类,核心区别在于备份时数据库的可用性(是否允许读写)
1、冷备份
备份时数据库完全关闭(停止服务),读、写操作均不可进行。直接拷贝数据库物理文件(如ibdata1、表空间文件.ibd、日志文件等)。由于文件无写入操作,备份结果绝对一致。
2、热备份
备份时数据库正常运行,读写操作不受影响(既允许查询也允许更新),均可执行。需依赖数据库引擎的特性,MyISAM 只支持温备,不支持热备,InnoDB都支持(因为它支持事务)。通过在线快照 + 日志回放实现一致性备份。
3、温备份
备份时数据库运行,但仅允许读操作,禁止写操作(通常通过加全局读锁实现)。备份过程中业务写请求会阻塞,影响部分可用性。
4、其余备份概念
| 相关概念 | 说明 |
|---|---|
| 完全备份 | 备份整个数据库全部数据 |
| 部份备份 | 只备份部份数据子集,例如部份库或表 |
| 增量备份 | 仅备份最近一次完全备份或增量备份(如果存在增量)以来变化的数据,备份较快,还原复杂 |
| 差异备份 | 仅备份最近一次完全备份以来变化的数据,备份较慢,还原简单 |
| 物理备份 | 直接复制数据文件进行备份,与存储引擎有关,占用较多的空间,速度快 |
| 逻辑备份 | 从数据库中 “导出” 数据另存而进行的备份,与存储引擎无关,占用空间少,速度慢,可能丢失精度 |
二、mysqldump 备份工具
mysqldump 是 MySQL 官方提供的客户端备份工具,通过 mysql 协议连接至 mysql 服务器进行备份,mysqldump 命令是将数据库中的数据备份成一个文本文件,数据表的结构和数据都存储在生成的文本文件中。
1、全量备份
基本原理
通过 MySQL 客户端连接数据库,执行查询获取所有表的结构(CREATE TABLE)和数据(INSERT),生成包含完整数据的 SQL 文本文件,为某一时间点的全量快照。
操作步骤
备份所有数据库
mysqldump -u 用户名 -p --all-databases > /data/all_bakckup.sql还原整库的备份数据
mysql -u 用户名 -p < /data/all_bakckup.sql备份指定数据库
mysqldump -u 用户名 -p --databases dbname > /data/dbname_backup.sql
还原指定数据库的备份数据
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 开始,默认开启了二进制日志功能,之前版本默认是关闭)
[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
mysqldump -u 用户名 -p --single-transaction --master-data=2 --databases dbname > /data/dbname_backup.sql
备份文件中会包含类似注释(表示全量结束时 binlog 为 binlog.000003,位置154)
-- CHANGE MASTER TO MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=154;
全量备份后,新的修改会写入 binlog,需定期备份新增的 binlog 片段
cp /var/lib/mysql/binlog.000004 /data/binlog.000004
恢复增量备份文件
# 导出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语句通用性强 |
| 效率 | 高,恢复速度快 | 低,恢复速度慢 |
| 适用场景 | 接受停库,需要快速恢复,数据量极大 | 无法停库,数据量较小,需要灵活备份或跨版本迁移 |
