MySQL备份升级:XtraBackup增量备份与恢复实战

MySQL备份升级:XtraBackup增量备份与恢复实战

你的数据库有多大了?

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

对比项mysqldumpXtraBackup
备份方式逻辑备份(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,备份的压力越小。

增量备份让你每天备份的成本降到最低,恢复的时候又能回到任意一天的状态。

花一天时间学一下这个工具。下次数据库出问题的时候,你不会因为没有备份而失眠。

知识库

网站挂了都不知道?Uptime Kuma自建监控告警

2026-5-6 14:52:27

知识库

还在用vim改服务器代码?VS Code Remote SSH 拯救你

2026-5-8 16:19:04

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧