一、备份核心概念与分类
(一)按备份方式划分
- 逻辑备份
导出数据库的SQL语句、表结构和数据,生成可读的SQL文件,不直接复制数据文件。
优点:跨平台、跨MySQL版本兼容性强,文件体积小,可读性高,可编辑修改;
缺点:备份与恢复速度较慢,大数据量场景效率低,适合中小型数据库。
代表工具:mysqldump、mysqlpump。
- 物理备份
直接复制MySQL的数据文件、日志文件等底层文件,相当于文件镜像拷贝。
优点:备份、恢复速度极快,适合大型数据库和生产环境高并发场景;
缺点:兼容性差,依赖MySQL版本和存储引擎,文件不可直接编辑,需专业工具操作。
代表工具:Percona XtraBackup、mysqlbackup。
(二)按备份状态划分
- 冷备份
关闭MySQL服务后进行备份,数据一致性最高,操作简单,但会导致业务停机,生产环境极少使用。
- 温备份
数据库运行中备份,会对表加读锁,阻塞数据写入,影响业务正常运行,仅适合低并发场景。
- 热备份
数据库正常对外提供服务时备份,无锁或低锁机制,不影响业务读写,是生产环境首选方式。
(三)按备份数据范围划分
- 全量备份
备份整个数据库的所有数据和结构,是备份的基础,恢复时只需最新全量文件。
优点:恢复简单快捷;缺点:备份耗时久、占用存储空间大。
- 增量备份
仅备份自上一次全量或增量备份后变更的数据,依赖二进制日志(binlog)实现。
优点:备份速度快、占用空间小;缺点:恢复需按顺序叠加全量+增量文件,操作复杂。
- 差异备份
备份自上一次全量备份后所有变更的数据,介于全量和增量之间,恢复比增量简单。
二、常用备份工具实操
(一)mysqldump(逻辑备份,官方自带)
- 核心参数
-
-u :数据库用户名
-
-p :数据库密码
-
-h :数据库主机地址
-
--databases :指定备份多个数据库
-
--single-transaction :针对InnoDB引擎,实现热备份,保证数据一致性,不锁表
-
--lock-tables=false :关闭表锁,配合InnoDB使用
-
--default-character-set=utf8mb4 :指定字符集
-
> 备份文件路径.sql :导出备份文件
- 常用备份命令
- 备份单个数据库
bash
mysqldump -u root -p --single-transaction --default-character-set=utf8mb4 test_db > /backup/test_db_$(date +%Y%m%d).sql
- 备份多个数据库
bash
mysqldump -u root -p --single-transaction --databases db1 db2 > /backup/multi_db_$(date +%Y%m%d).sql
- 备份所有数据库
bash
mysqldump -u root -p --single-transaction --all-databases > /backup/all_db_$(date +%Y%m%d).sql
- 备份单张表
bash
mysqldump -u root -p --single-transaction test_db test_table > /backup/test_db_test_table_$(date +%Y%m%d).sql
(二)Percona XtraBackup(物理备份,生产推荐)
- 核心优势
支持InnoDB热备份,无锁、速度快,支持全量+增量备份,适合大数据量场景。
- 全量备份命令
bash
xtrabackup --user=root --password=123456 --backup --target-dir=/backup/full_$(date +%Y%m%d)
- 增量备份命令(基于全量备份)
bash
xtrabackup --user=root --password=123456 --backup --incremental-basedir=/backup/full_20240520 --target-dir=/backup/incr_$(date +%Y%m%d)
(三)binlog日志备份(增量备份核心)
binlog是MySQL二进制日志,记录所有数据增删改操作,用于实现时间点恢复(PITR),必须开启。
- 开启binlog
修改MySQL配置文件 my.cnf ,添加以下配置后重启服务:
ini
mysqld
log_bin=mysql-bin
binlog_format=ROW
server_id=1
expire_logs_days=7 # 日志自动清理天数
- 查看binlog日志
sql
SHOW BINARY LOGS; # 查看所有binlog文件
SHOW MASTER STATUS; # 查看当前正在写入的binlog
- 备份binlog日志
bash
cp /var/lib/mysql/mysql-bin.* /backup/binlog/
三、数据库恢复实操
(一)mysqldump备份文件恢复
- 命令行恢复
bash
mysql -u root -< /backup/test_db_20240520.sql
- MySQL客户端内恢复
sql
USE test_db;
SOURCE /backup/test_db_20240520.sql;
(二)物理备份(XtraBackup)恢复
- 准备备份文件(修复数据一致性)
bash
xtrabackup --prepare --target-dir=/backup/full_20240520
- 停止MySQL服务,清空数据目录
bash
systemctl stop mysqld
rm -rf /var/lib/mysql/*
- 恢复数据
bash
xtrabackup --copy-back --target-dir=/backup/full_20240520
- 修改文件权限,启动MySQL
bash
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
(三)基于binlog的时间点恢复
-
先恢复全量备份,再通过binlog恢复增量数据
-
解析binlog日志,定位恢复位置
bash
mysqlbinlog --start-position=107 --stop-position=1000 /var/lib/mysql/mysql-bin.000001 | mysql -u root -p
- 按时间点恢复
bash
mysqlbinlog --start-datetime="2024-05-20 10:00:00" --stop-datetime="2024-05-20 18:00:00" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p
四、备份与恢复注意事项
-
备份前检查:确认数据库正常运行,InnoDB引擎建议开启 --single-transaction ,避免锁表影响业务。
-
备份文件管理:备份文件命名包含日期时间,定期清理过期文件,备份文件需异地存储,防止服务器故障丢失。
-
恢复前测试:生产环境恢复前,先在测试环境验证备份文件有效性,避免备份文件损坏导致恢复失败。
-
权限控制:备份工具需具备数据库读写权限,恢复后检查文件权限,确保MySQL服务可正常读取数据文件。
-
binlog安全:binlog日志和全量备份分开存储,定期备份binlog,避免日志损坏无法增量恢复。
-
存储引擎适配:MyISAM引擎不支持热备份,备份时需锁表;InnoDB引擎支持无锁热备份,优先使用。
五、生产环境备份策略
- 中小型数据库(<50G)
每日凌晨执行全量mysqldump备份,开启binlog日志备份,保留7天备份文件,每周做一次异地备份。
- 中大型数据库(50G-200G)
每周一次全量XtraBackup备份,每日一次增量备份,实时备份binlog,实现分钟级数据恢复。
- 大型数据库(>200G)
采用全量+增量+binlog组合备份,搭配主从复制,从库执行备份不影响主库业务,备份文件实时同步到远程存储服务器。
六、常见问题排查
-
mysqldump备份慢:加大 --single-transaction 参数,关闭锁表,避开业务高峰期备份,优化数据库索引。
-
恢复失败:检查备份文件是否完整,字符集是否匹配,数据库用户权限是否足够,binlog日志是否完整。
-
物理备份恢复后无法启动:检查数据目录权限,确认MySQL版本和备份时一致,清理残留日志文件。