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语句通用性强
效率 高,恢复速度快 低,恢复速度慢
适用场景 接受停库,需要快速恢复,数据量极大 无法停库,数据量较小,需要灵活备份或跨版本迁移
相关推荐
q***725634 分钟前
Redis-配置文件
数据库·redis·oracle
不可描述的两脚兽37 分钟前
Redis 快记
java·数据库·redis
h***346342 分钟前
【MySQL】表的基本操作
数据库·mysql·oracle
SelectDB1 小时前
为什么实时更新场景下 Doris 查询性能是 ClickHouse 的 34 倍
数据库
n***63272 小时前
MySQL数据库的数据文件保存在哪?MySQL数据存在哪里
数据库·mysql
SelectDB2 小时前
从 Flink 到 Doris 的实时数据写入实践——基于 Flink CDC 构建更实时高效的数据集成链路
数据库
普通网友2 小时前
使用Flask快速搭建轻量级Web应用
jvm·数据库·python
月上柳青2 小时前
OpenWrt系统上配置batman-adv快速开始与配置详解
开发语言·mysql·php
t***26592 小时前
【大数据】MySQL与Elasticsearch的对比分析:如何选择适合的查询解决方案
大数据·mysql·elasticsearch
k***92162 小时前
redis连接服务
数据库·redis·bootstrap