MySQL 备份按 备份内容 可分为「物理备份」(直接复制数据文件)和「逻辑备份」(导出 SQL 语句);按 备份时机 可分为「全量备份」(完整数据)和「增量备份」(新增 / 变更数据)。
mysqldump
是 MySQL 自带的逻辑备份工具,通过导出 SQL 语句(CREATE TABLE、INSERT 等)实现备份,支持全量备份,需配合二进制日志实现增量备份。
- 优点:跨平台(Windows/Linux 通用)、备份文件为文本格式(可直接编辑)、支持单库 / 单表 / 全库备份。
- 缺点:备份 / 还原速度慢(需解析 SQL)、占用磁盘空间较大(文本格式)、不适合超大型数据库(如 100GB+)。
-u
:指定 MySQL 用户名(如 root
)。
-p
:提示输入密码(若直接写密码,需用 -p123456
,但存在安全风险,不推荐)。
--all-databases
:备份所有数据库(含系统库 mysql
)。
--single-transaction
:InnoDB 表备份时开启事务,保证数据一致性(不锁表);MyISAM 表需用 --lock-tables
锁表。
MEB 是 MySQL 企业版提供的物理备份工具,直接复制 InnoDB/MyISAM 的数据文件(如 .ibd
、.frm
),支持全量备份和增量备份,备份效率远高于 mysqldump
。
- 优点:备份 / 还原速度快(直接操作文件)、支持增量备份(节省空间)、支持压缩备份、恢复后无需执行 SQL 解析。
- 缺点:仅企业版可用(需付费)、备份文件为二进制格式(不可编辑)、跨版本兼容性需注意(如 5.7 备份不可直接恢复到 8.0)。
Percona XtraBackup(简称 PXB)是开源社区最常用的物理备份工具,支持 InnoDB 引擎的 热备份(备份时不锁表,不影响业务),免费且功能接近 MEB,是中小团队的首选。
- 优点:开源免费、支持热备份(InnoDB)、备份 / 还原速度快、支持全量 / 增量 / 差异备份、跨版本兼容较好。
- 缺点:不支持 MyISAM 热备份(MyISAM 需锁表)、操作稍复杂(需手动准备备份文件)。
二进制日志记录了 MySQL 所有 数据变更操作(INSERT/UPDATE/DELETE 等),本身不是全量备份工具,但可配合全量备份实现「全量 + 增量」备份,减少备份间隔和数据丢失风险。
- 优点:增量备份体积小、可实现「时间点恢复」(如恢复到某一具体时间的数据)。
- 缺点:需先开启二进制日志、恢复时需按顺序应用日志、日志文件需定期清理(避免占满磁盘)。
-
开启二进制日志:修改 MySQL 配置文件 my.cnf
(Linux)或 my.ini
(Windows),添加以下配置:
log-bin=/var/lib/mysql/mysql-bin # 日志文件路径(需确保目录存在且可写)
server-id=1 # 必须配置(主从复制/日志备份均需)
expire_logs_days=7 # 日志自动过期时间(7天,避免磁盘溢出)
重启 MySQL 生效:systemctl restart mysqld
(Linux)
-
查看二进制日志:
- 查看当前日志:
show master status;
- 查看所有日志:
show binary logs;
-
导出指定时间段的日志(用于增量恢复):
mysqlbinlog --start-datetime="2024-05-01 00:00:00" --stop-datetime="2024-05-01 23:59:59" /var/lib/mysql/mysql-bin.000001 > incremental_20240501.sql
- 冷备份:停止 MySQL 服务后,直接复制数据目录(如
/var/lib/mysql
)。优点是简单,缺点是服务中断,适合非生产环境或维护窗口。
- LVM 快照备份:通过 Linux LVM 逻辑卷的快照功能,快速生成数据卷副本(需先将 MySQL 数据目录挂载为 LVM 卷)。优点是备份速度极快,缺点是需 LVM 环境支持。
还原需与备份方法对应(逻辑备份用 SQL 导入,物理备份用文件复制),以下分场景介绍。
逻辑备份的还原本质是「执行备份的 SQL 文件」,常用工具为 mysql
客户端或 MySQL 图形化工具(如 Navicat)。
- 还原前需确保目标数据库存在(如还原
test_db
需先执行 CREATE DATABASE IF NOT EXISTS test_db;
)。
- 还原大文件时,建议关闭 MySQL 的二进制日志(避免日志膨胀),还原后再开启:
SET SQL_LOG_BIN=0;
SET SQL_LOG_BIN=1;
物理备份的还原是「将备份的文件复制到 MySQL 数据目录」,需先停止 MySQL 服务,确保数据目录为空。
- 停止 MySQL 服务:
- 清空数据目录(确保备份有效,谨慎操作!):
- 复制备份文件到数据目录:
xtrabackup --copy-back --target-dir=/data/backup/full
- 修改数据目录权限(MySQL 需读写权限):
chown -R mysql:mysql /var/lib/mysql
- 启动 MySQL 服务:
当全量备份后数据发生变更,可通过二进制日志恢复「全量备份之后到故障前」的数据,实现「时间点恢复」。
- 先还原全量备份(如用 mysqldump 或 PXB 还原到 2024-05-01 00:00 的全量数据)。
- 导出故障前的二进制日志(假设故障发生在 2024-05-01 14:30,全量备份后日志文件为
mysql-bin.000001
):
mysqlbinlog --start-datetime="2024-05-01 00:00:01" --stop-datetime="2024-05-01 14:30:00" /var/lib/mysql/mysql-bin.000001 > incremental_recover.sql
- 执行增量日志还原:
mysql -u root -p < incremental_recover.sql
- 定期全量 + 增量备份:全量备份(如每天凌晨)+ 增量备份(如每小时),平衡备份速度和数据安全性。
- 备份文件校验:备份后执行
md5sum
校验文件完整性,避免备份损坏。
- 定期恢复测试:每月至少一次模拟恢复(如恢复到测试环境),确保备份可用。
- 备份文件异地存储:将备份文件复制到异地服务器或云存储(如 AWS S3),避免本地磁盘损坏导致数据丢失。
- 日志管理:二进制日志定期清理(如保留 7 天),避免占用过多磁盘空间。