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工具配合rsyncscp实现。嗯,这里有个小技巧:

我的做法:写一个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 每月一次 跨版本迁移

重要提醒:备份不是目的,能恢复才是。我曾经见过一个团队,每天备份做得很好,但从来没测试过恢复。结果真出问题时,发现备份文件损坏了。所以,我建议每个月至少做一次恢复演练。

最后说一句:备份策略没有银弹。你得根据业务特点、数据量大小、恢复时间要求来灵活选择。但有一条铁律——备份一定要做,恢复一定要测