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语句通用性强
效率 高,恢复速度快 低,恢复速度慢
适用场景 接受停库,需要快速恢复,数据量极大 无法停库,数据量较小,需要灵活备份或跨版本迁移
相关推荐
姚远Oracle ACE3 小时前
Oracle AWR 报告中的SQL来自哪儿?
数据库·sql·oracle
熊文豪3 小时前
KingbaseES数据库性能调优工具全面解析
数据库·kingbasees·金仓数据库·电科金仓
冠希陈、3 小时前
PHP7.4.33 安装sqlsrv扩展
数据库
光影34153 小时前
专利撰写与申请核心要点简报
前端·数据库·php
心灵宝贝3 小时前
申威ky10架构安装MongoDB 4.0.1(rpm包:mongodb-4.0.1-8.ky10.sw_64.rpm)详细步骤
数据库·mongodb·架构
星辰h4 小时前
基于JWT的RESTful登录系统实现
前端·spring boot·后端·mysql·restful·jwt
一 乐4 小时前
口腔健康系统|口腔医疗|基于java和小程序的口腔健康系统小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·小程序·毕设
vivo互联网技术4 小时前
Redis key 消失之谜
数据库·redis·内存淘汰策略·redis抓包分析·机制分析
TDengine (老段)4 小时前
TDengine 数据函数 TAN 用户手册
java·大数据·数据库·物联网·时序数据库·tdengine·涛思数据