
你的数据库有多大了?
10GB的时候,mysqldump还能忍。50GB的时候,备份一次半个多小时,网站变慢。100GB的时候,你可能已经不敢在白天做备份了。
更麻烦的是,全量备份每天做,磁盘很快就满了。每周做一次,万一周三挂了,你要丢好几天的数据。
有没有更好的办法?有。XtraBackup。它能在数据库正常运行的时候做备份,不锁表。还支持增量备份:第一天全量,后面每天只备份变化的部分。恢复的时候,全量+增量一起恢复。
今天把这事讲透。
先看一个场景
有个做跨境电商的朋友,订单表快200GB了。他每天凌晨用mysqldump备份,要跑两个多小时。更糟的是,备份期间网站明显变慢,因为mysqldump会锁表。
他问我怎么办。
我说:换XtraBackup。备份不锁表,第一次全量,后面每天增量,恢复的时候把全量和所有增量合并。
他试了一下,全量备份40分钟(比mysqldump快),增量备份5分钟。网站没有任何卡顿。
XtraBackup是什么?
Percona XtraBackup是Percona公司开源的MySQL热备份工具。
几个核心特点:
- 热备份:备份时数据库正常读写,不锁表
- 增量备份:只备份自上次备份以来的变化
- 压缩备份:节省磁盘空间
- 流备份:可以边备份边传到远程服务器
需要注意的是:它只支持InnoDB和XtraDB引擎。如果你有MyISAM表,会在最后阶段短暂锁一下。
安装
Ubuntu/Debian:
bash
sudo apt update sudo apt install percona-xtrabackup-80 -y
CentOS/RHEL:
bash
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y sudo percona-release enable-only tools release sudo yum install percona-xtrabackup-80 -y
验证安装:
bash
xtrabackup --version
全量备份
假设你的MySQL数据目录是/var/lib/mysql,备份目录是/backup/mysql。
创建备份目录:
bash
mkdir -p /backup/mysql/full
执行全量备份:
bash
xtrabackup --backup --target-dir=/backup/mysql/full --datadir=/var/lib/mysql
参数说明:
--backup:执行备份操作--target-dir:备份文件存放目录--datadir:MySQL数据目录(默认可以省略)
关键步骤:prepare
刚备份完的数据是不能直接恢复的。需要先“准备”一下,让它变成一致的状态。
bash
xtrabackup --prepare --target-dir=/backup/mysql/full
这个过程会回滚未提交的事务,应用已提交的事务日志。完成后,备份就可以用于恢复了。
增量备份
增量备份的前提是:你有一个全量备份。
第一次增量备份(基于全量):
bash
xtrabackup --backup --target-dir=/backup/mysql/inc1 --incremental-basedir=/backup/mysql/full --datadir=/var/lib/mysql
--incremental-basedir指定基于哪个备份做增量。这里指向全量备份目录。
第二次增量备份(基于第一次增量):
bash
xtrabackup --backup --target-dir=/backup/mysql/inc2 --incremental-basedir=/backup/mysql/inc1 --datadir=/var/lib/mysql
第三次、第四次同理,每次指向最近的那个增量备份。
增量备份的prepare
增量备份需要和全量备份一起准备。顺序:从全量开始,挨个把增量应用进去。
bash
# 准备全量(注意加 --apply-log-only,表示只应用日志,不回滚) xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full # 应用第一个增量 xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full --incremental-dir=/backup/mysql/inc1 # 应用第二个增量 xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full --incremental-dir=/backup/mysql/inc2 # 最后一个增量不要加 --apply-log-only,让它完成回滚 xtrabackup --prepare --target-dir=/backup/mysql/full --incremental-dir=/backup/mysql/inc2
prepare完成后,全量备份目录里就包含了所有增量的数据。可以直接用它来恢复。
恢复数据
第一步:停止MySQL
bash
systemctl stop mysql
第二步:清空数据目录(或者移动走)
bash
mv /var/lib/mysql /var/lib/mysql.bak mkdir /var/lib/mysql
第三步:恢复数据
bash
xtrabackup --copy-back --target-dir=/backup/mysql/full --datadir=/var/lib/mysql
--copy-back会把备份文件复制回数据目录。
第四步:修复权限
bash
chown -R mysql:mysql /var/lib/mysql
第五步:启动MySQL
bash
systemctl start mysql
验证数据是否正常。
自动化脚本
写一个脚本,每周日全量备份,周一到周六增量备份。
bash
#!/bin/bash
DATE=$(date +%Y%m%d)
BACKUP_BASE="/backup/mysql"
FULL_DIR="$BACKUP_BASE/full"
INC_DIR="$BACKUP_BASE/inc_$DATE"
# 如果是周日,做全量备份
if [ $(date +%w) -eq 0 ]; then
xtrabackup --backup --target-dir=$FULL_DIR --datadir=/var/lib/mysql
xtrabackup --prepare --target-dir=$FULL_DIR
else
# 找最近一次备份作为base
if [ -d "$FULL_DIR" ]; then
LAST_BACKUP=$(ls -td $BACKUP_BASE/inc_* 2>/dev/null | head -1)
if [ -n "$LAST_BACKUP" ]; then
xtrabackup --backup --target-dir=$INC_DIR --incremental-basedir=$LAST_BACKUP
else
xtrabackup --backup --target-dir=$INC_DIR --incremental-basedir=$FULL_DIR
fi
fi
fi
# 删除7天前的增量备份
find $BACKUP_BASE -name "inc_*" -type d -mtime +7 -exec rm -rf {} \;
配合crontab每天执行。
XtraBackup vs mysqldump
| 对比项 | mysqldump | XtraBackup |
|---|---|---|
| 备份方式 | 逻辑备份(SQL) | 物理备份(文件) |
| 备份时锁表 | 会锁(MyISAM全锁,InnoDB有短锁) | 不锁(热备份) |
| 增量备份 | 支持(但需要自己处理) | 原生支持 |
| 恢复速度 | 慢(要重新执行SQL) | 快(直接复制文件) |
| 备份文件大小 | 通常较大 | 相对较小(可压缩) |
| 适用场景 | 小库(<50GB)、跨平台迁移 | 大库(>50GB)、生产环境 |
一句话:小库用mysqldump方便,大库用XtraBackup专业。
常见问题
Q:备份时报“权限被拒绝”
A:确保xtrabackup有权限读/var/lib/mysql,一般用root执行。
Q:恢复时MySQL起不来
A:检查/var/lib/mysql的权限是不是mysql用户。检查MySQL错误日志。
Q:增量备份越来越大
A:增量备份基于上一次备份,时间久了会累积。建议每周重置一次全量。
Q:磁盘空间不够
A:加--compress参数压缩备份,或者用--stream直接传到远程服务器。
一个真实案例
有个SaaS公司,数据库1.2TB,之前用mysqldump,根本没法在业务时间做备份。周末做一次,要8个小时。
换成XtraBackup后,全量备份2小时,增量备份每天15分钟。恢复数据的时候,从备份到恢复完成用了不到1小时。以前这种情况至少花半天。
他们的运维说:“XtraBackup不是工具,是救命的。”
最后一句
你的数据库会越来越大。今天50GB,明年可能200GB。越早切换到XtraBackup,备份的压力越小。
增量备份让你每天备份的成本降到最低,恢复的时候又能回到任意一天的状态。
花一天时间学一下这个工具。下次数据库出问题的时候,你不会因为没有备份而失眠。




