3、数据库备份策略:MySQL逻辑备份(mysqldump)、物理备份(XtraBackup)、binlog实时备份
数据库备份,说白了就是给数据上保险。我做了这么多年运维,见过太多因为备份没做好而翻车的案例。今天咱们就聊聊MySQL的三种核心备份方式:逻辑备份、物理备份和binlog实时备份。
3.1 逻辑备份:mysqldump
mysqldump是最常用的备份工具。它把数据库导出成SQL语句,说白了就是一堆INSERT语句。我个人习惯用它来备份小规模数据,比如几百MB以内的库。
核心用法:
# 备份单个数据库
mysqldump -u root -p --single-transaction --routines --triggers mydb > mydb.sql
# 备份所有数据库
mysqldump -u root -p --all-databases --master-data=2 > all.sql
# 压缩备份
mysqldump -u root -p mydb | gzip > mydb.sql.gz
这里有个关键参数——--single-transaction。它利用InnoDB的事务特性,保证备份时数据的一致性。嗯,这里要注意:如果你用的是MyISAM表,这个参数就不管用了,得加--lock-tables。
我的经验:我曾经在线上环境直接用mysqldump备份一个200GB的库,结果跑了3个小时还没完,业务直接卡死。后来学乖了,大库绝对不用mysqldump。
mysqldump的优缺点很明显:
| 优点 | 缺点 |
|---|---|
| 简单易用,上手快 | 备份速度慢,尤其大库 |
| 可跨版本恢复 | 恢复时重建索引,耗时 |
| 文件可读,方便排查 | 占用磁盘空间大 |
3.2 物理备份:XtraBackup
XtraBackup是Percona出品的物理备份工具。它直接拷贝数据文件,速度比mysqldump快一个数量级。我建议所有生产环境都用它做全量备份。
核心用法:
# 全量备份
xtrabackup --backup --target-dir=/backup/full
# 增量备份(基于上次全量)
xtrabackup --backup --target-dir=/backup/inc1 \
--incremental-basedir=/backup/full
# 准备恢复
xtrabackup --prepare --target-dir=/backup/full
为什么XtraBackup这么快?因为它直接拷贝物理文件,不经过SQL解析层。你想想看,mysqldump要逐行读取数据再生成SQL,而XtraBackup直接复制文件,速度能不快吗?
避坑指南:我曾经遇到过XtraBackup备份完成后,恢复时发现数据不一致。原因是备份过程中有写入操作,导致数据文件状态不一致。解决办法是:备份完成后一定要执行--prepare步骤,让数据文件达到一致状态。
XtraBackup的备份策略我一般这样设计:
- 每周日做一次全量备份
- 每天凌晨做一次增量备份
- 保留最近30天的备份文件
3.3 binlog实时备份
binlog是MySQL的二进制日志,记录了所有数据变更。说白了,它就是数据库的"黑匣子"。有了binlog,你可以恢复到任意时间点。
binlog配置:
# my.cnf配置
[mysqld]
server-id = 1
log-bin = /data/mysql/binlog/mysql-bin
binlog-format = ROW
expire_logs_days = 7
max_binlog_size = 100M
binlog的实时备份,我推荐用mysqlbinlog工具配合rsync或scp实现。嗯,这里有个小技巧:
我的做法:写一个crontab脚本,每5分钟检查一次binlog文件是否有变化。如果有变化,就通过rsync同步到备份服务器。这样即使主库挂了,binlog也不会丢。
binlog恢复的典型场景:
# 恢复到指定时间点
mysqlbinlog --stop-datetime="2024-01-15 10:00:00" \
/data/binlog/mysql-bin.000123 | mysql -u root -p
# 恢复到指定位置
mysqlbinlog --stop-position=123456 \
/data/binlog/mysql-bin.000123 | mysql -u root -p
3.4 三种备份的配合策略
在实际项目中,这三种备份不是互斥的,而是互补的。我个人习惯这样组合:
| 备份类型 | 频率 | 用途 |
|---|---|---|
| XtraBackup全量 | 每周一次 | 基础数据恢复 |
| XtraBackup增量 | 每天一次 | 减少恢复时间 |
| binlog实时 | 每5分钟 | 时间点恢复 |
| mysqldump | 每月一次 | 跨版本迁移 |
重要提醒:备份不是目的,能恢复才是。我曾经见过一个团队,每天备份做得很好,但从来没测试过恢复。结果真出问题时,发现备份文件损坏了。所以,我建议每个月至少做一次恢复演练。
最后说一句:备份策略没有银弹。你得根据业务特点、数据量大小、恢复时间要求来灵活选择。但有一条铁律——备份一定要做,恢复一定要测。