mysql备份恢复详解

概述

在实际生产环境中,我们要定期针对数据库做备份,避免误操作导致数据丢失没办法恢复。

mysql备份按照原理分为两种,分别是逻辑备份和物理备份。

逻辑备份:

  • 将数据导出为 SQL 语句
  • 优点:跨版本、跨平台、可编辑、可单库单表,所有版本通用
  • 缺点:大数据量慢,因为是将语句导出为一条条sql
  • 工具:mysqldump、mydumper

物理备份

  • 直接拷贝数据文件
  • 优点:极快、适合 TB 级数据
  • 缺点:同版本、同系统、不能单独恢复某张表
  • 工具:xtrabackup、MySQL Clone、冷拷贝

逻辑备份之mysqldump

mysqldump 是 MySQL 官方自带的逻辑备份工具,通过生成 SQL 脚本的方式实现数据库备份、迁移、恢复,是 MySQL 生态中最常用的备份方案之一,支持所有 MySQL 分支版本(MySQL 5.x/8.x、MariaDB、Percona Server 等)。

mysqldump 本质是通过连接到 MySQL 服务,将数据库中的表结构、数据、索引、触发器、存储过程、函数、事件等对象转换为标准的 CREATE、INSERT 等 SQL 语句,最终输出为一个可直接执行的 SQL 脚本文件。

mysqldump优缺点

优点:

  • 官方原生,无需额外安装,兼容性极强
  • 备份结果为纯文本 SQL,可读性高、便于编辑、跨平台通用
  • 支持全量、部分库/表、结构-only、数据-only等多种备份粒度
  • 支持导出为CSV/XML等其他格式
  • 备份期间可控制锁策略,尽可能降低对业务的影响

缺点:

  • 逻辑备份,备份/恢复速度较慢(尤其是TB级以上大库)
  • 单线程备份,无法利用多核CPU(MySQL 8.0.26+ 支持并行备份 --parallel)
  • 大表备份会产生大量IO,影响业务性能
  • 不支持实时增量备份(需结合binlog实现增量)

mysqldump语法和基础参数

基础语法:

复制代码
mysqldump [选项] > 备份文件.sql

通用连接参数(所有场景必填)

参数 说明 示例
-u/--user 数据库用户名 -u root
-p/--password 数据库密码(建议交互式输入,避免明文在命令行泄露) -p 或 --password=123456
-h/--host 数据库地址 -h 127.0.0.1
-P/--port 数据库端口 -P 3306
-S/--socket 本地socket文件路径(本地连接时使用) -S /tmp/mysql.sock
--default-character-set 指定导出字符集,避免乱码 --default-character-set=utf8mb4

备份范围控制

用于指定备份哪些库表

参数 说明
--all-databases/-A 备份所有数据库(包含系统库mysql、information_schema等)
--databases/-B 备份指定的多个数据库,会自动生成 CREATE DATABASE 和 USE 语句
--ignore-database 备份所有库时排除指定库(可多次使用排除多个库)
--tables 备份指定库下的单个/多个表(参数顺序:库名 表1 表2...)
--ignore-table 备份库时排除指定表(格式:库名.表名,可多次使用)
--no-data/-d 仅备份表结构,不备份数据
--no-create-info/-t 仅备份数据,不备份表结构
--where/-w 按条件过滤备份数据

默认情况下mysqldump不会备份存储过程、触发器、函数、事件、视图等高级对象,需要手动开启:

参数 说明
--routines/-R 备份存储过程和函数
--triggers 备份触发器(默认开启,--skip-triggers关闭)
--events/-E 备份事件调度器
--default-character-set=utf8mb4 必须指定,避免中文、emoji等字符乱码

锁与一致性控制

这是生产环境备份最核心的参数,直接决定备份是否一致、对业务的影响大小:

参数 适用引擎 说明 业务影响
--lock-tables/-l MyISAM 备份时锁定所有表(只读),保证备份一致性 所有表不可写,对业务影响极大,不建议生产用
--lock-all-tables/-x 所有引擎 全局锁,整个实例只读 业务完全停写,仅适用于停机维护场景
--single-transaction InnoDB 利用InnoDB的MVCC特性,开启一个一致性快照事务,备份期间不锁表,不影响业务读写 几乎无影响,InnoDB引擎生产环境首选
--master-data=2 主从架构 备份结果中记录备份时刻的binlog文件名和位置(注释形式,值为1则不注释),用于搭建从库/基于binlog的增量恢复 无额外影响
--flush-logs/-F 所有引擎 备份前刷新binlog,生成新的binlog文件,便于后续增量恢复 几乎无影响

性能优化参数

参数 效果
--quick/-q 逐行读取表数据,不缓存整个表到内存,大表备份必备,避免OOM
--max_allowed_packet=1G 增大数据包限制,避免大字段/大表备份失败
--net_buffer_length=64K 增大网络缓冲区,提升传输速度
--parallel=N MySQL 8.0.26+ 支持,并行备份N个库,大幅提升备份速度

mysqldump备份实战

  • 备份所有的库

    -u指定用户

    -p指定密码

    -A代表所有的库

    --single-transaction在备份期间,生成备份数据要保证一致性(新版数据库 利用快照技术 旧版数据库 利用锁库方式)

    --master-data=2--master-data=2

    mysqldump -uroot -proot -A --single-transaction --master-data=2 >/tmp/test.sql

  • 备份单个库

    -u指定用户

    -p指定密码

    -B备份指定的多个数据库,会自动生成 CREATE DATABASE 和 USE 语句

    --single-transaction在备份期间,生成备份数据要保证一致性(新版数据库 利用快照技术 旧版数据库 利用锁库方式)

    --master-data=2--master-data=2

    mysqldump -u root -proot -B test_db --single-transaction --master-data=2 > test_db.sql

  • 备份指定的表

    -u指定用户

    -p指定密码

    -B备份指定的多个数据库,会自动生成 CREATE DATABASE 和 USE 语句

    --single-transaction在备份期间,生成备份数据要保证一致性(新版数据库 利用快照技术 旧版数据库 利用锁库方式)

    --master-data=2--master-data=2

    mysqldump -u root -proot test_db user --single-transaction --master-data=2 > test_db_user.sql

  • 只备份结构,不备份数据

    -d仅备份表结构,不备份数据

    mysqldump -u root -p -d test_db > test_db_schema.sql

mysqldump恢复实战

方式一:

复制代码
# 恢复全库
mysql -u root -p < all_db_20250101.sql

# 恢复单库(必须先创建库)
mysql -u root -p -e "CREATE DATABASE test_db;"
mysql -u root -p test_db < test_db.sql

方式二:

复制代码
# 进入数据库中执行
mysql> source /tmp/all.sql

逻辑备份之mydumper

mydumper 是一款开源的 多线程高性能 MySQL/MariaDB/Percona Server 逻辑备份工具,由 MySQL 社区开发,是 mysqldump 的首选替代方案,备份速度比原生 mysqldump 快 3~10 倍,是中大型数据库逻辑备份场景的工业标准工具。

mydumper优势和原理

优势:

  • 多线程并行备份:充分利用多核CPU资源,备份速度远快于单线程的mysqldump
  • 一致的备份快照:所有线程备份的是同一时间点的数据,保证备份一致性,支持InnoDB无锁备份
  • 内置压缩:备份时直接压缩,无需管道拼接,节省磁盘空间
  • 分表存储:每个表的结构和数据单独存储为文件,方便单表/部分表恢复,无需解析整个大备份文件
  • 备份进度监控:实时显示备份进度、已备份行数、速度等信息
  • 内置限速:支持限制备份IO速度,避免备份占满磁盘带宽影响业务
  • 开源免费:活跃维护,支持所有主流MySQL分支版本
  • 配套恢复工具 myloader:多线程并行恢复,恢复速度比mysql命令快5~20倍

原理:

  1. 主线程连接到MySQL,开启一致性快照事务(InnoDB),获取全局读锁(FTWRL)保证非InnoDB表备份一致性
  2. 记录当前binlog文件名和位点,用于搭建从库/增量恢复
  3. 启动N个工作线程,每个线程负责备份部分表,并行执行备份任务
  4. 备份完成后释放全局锁,生成备份元数据文件
  5. 每个表的结构导出为dbname.tablename-schema.sql,数据导出为dbname.tablename.sql(可自动压缩为.gz格式)

mydumper安装方式

下载地址:https://github.com/mydumper/mydumper/releases

复制代码
## centos
# CentOS/RHEL 7/8/9
yum update -y && yum install mydumper -y

# Debian/Ubuntu
apt update -y && apt install mydumper -y

验证一下

复制代码
root@master:~# mydumper --version
mydumper 0.9.5, built against MySQL 10.3.22

mydumper核心参数详解

分类 参数 说明
连接参数 -u/--user 数据库用户名
-p/--password 数据库密码
-h/--host 数据库地址
-P/--port 数据库端口
-S/--socket 本地 socket 文件路径
--default-character-set 导出字符集,默认 utf8,建议指定 utf8mb4
备份范围 -B/--database 备份指定数据库(可多次使用指定多个库)
-T/--tables-list 备份指定表,格式:db1.table1,db2.table2
--ignore-database 排除指定数据库
--ignore-table 排除指定表,格式:db1.table1
--no-schemas/-m 仅备份数据,不备份表结构
--no-data/-d 仅备份表结构,不备份数据
--where/-w 按条件过滤备份数据,例如:--where="create_time>'2026-01-01'"
性能控制 -t/--threads 备份线程数,默认 4,建议设置为 CPU 核心数的 1~1.5 倍
-c/--compress 开启备份文件压缩(gzip 格式),大幅节省磁盘空间
--compress-threads 压缩线程数,默认等于备份线程数
-r/--rows 大表分块备份,每 N 行拆分为一个文件,避免单文件过大
--limit-io 限制 IO 速度,单位 MB/s,避免备份占满带宽影响业务
一致性控制 --no-locks/-k 不获取全局锁,仅适用于所有表都是 InnoDB 且不需要一致性的场景
--single-transaction InnoDB 引擎无锁一致性备份,和 mysqldump 参数效果一致,生产环境必备
--lock-all-tables/-x 全局锁所有表,仅 MyISAM 引擎场景使用
输出控制 -o/--outputdir 备份文件输出目录,必须指定,mydumper 会自动创建目录
-F/--flush-logs 备份前刷新 binlog,便于增量恢复
--binlog-position/-M 备份元数据中记录 binlog 文件名和位点,默认开启
--triggers 备份触发器,默认开启
--routines/-R 备份存储过程和函数
--events/-E 备份事件调度器
--hex-blob 将 BLOB 类型以十六进制导出,避免数据损坏
其他 --verbose/-v 日志级别:0=静默,1=错误,2=警告,3=信息,4=调试,默认 3
--logfile 备份日志输出到指定文件

mydumper备份实战

  • 备份所有的库

    mydumper
    -u root
    -p '你的密码'
    -h 127.0.0.1
    -P 3306
    --single-transaction
    --default-character-set=utf8mb4
    -R -E
    --hex-blob
    -c
    -t 8
    -r 100000
    -o /data/backup/mysql_full_$(date +%Y%m%d_%H%M%S)

  • 备份指定的库

    备份db1和db2两个库

    mydumper -u root -p -B db1 -B db2 -c -t 4 -o /data00/backup/db1_db2

  • 备份指定的表

    备份db1库的user表和order表

    mydumper -u root -p -B db1 -T user,order -c -o /data/backup/db1_user_order

  • 限速备份

    限制IO速度不超过50MB/s,避免影响业务

    mydumper -u root -p --single-transaction -c -t 4 --limit-io 50 -o /data/backup/full

备份文件结构说明

mydumper 备份完成后会在输出目录生成以下文件:

复制代码
backup_dir/
├── metadata                    # 备份元数据:备份时间、binlog位点、备份参数等核心信息
├── db1/
│   ├── db1.create.sql          # 库创建SQL
│   ├── user-schema.sql         # user表结构SQL
│   ├── user.sql.gz             # user表数据SQL(压缩后)
│   ├── order-schema.sql        # order表结构SQL
│   ├── order.00001.sql.gz      # order表分块备份第1块
│   ├── order.00002.sql.gz      # order表分块备份第2块
│   └── ...
├── db2/
│   └── ...
└── logs/
    └── mydumper.log            # 备份日志

metadata文件示例

复制代码
Started dump at: 2026-05-26 10:00:00
SHOW MASTER STATUS:
        Log: mysql-bin.000123
        Pos: 456789
        GTID: 0-1-123456

Finished dump at: 2026-05-26 10:15:23

mydumper恢复实战

mydumper 配套的多线程恢复工具是myloader,支持并行恢复,速度比原生mysql命令快5~20倍。

myloader核心参数:

参数 说明
-u/--user 数据库用户名
-p/--password 数据库密码
-h/--host 数据库地址
-P/--port 数据库端口
-d/--directory 备份文件目录,必须指定
-B/--database 恢复到指定库(可以把原库恢复到一个新库名)
-o/--overwrite-tables 如果表存在则删除重建,默认会报错
-t/--threads 恢复线程数,建议设置为CPU核心数的2倍
--no-schemas 不恢复表结构,仅恢复数据
--no-data 仅恢复表结构,不恢复数据
--disable-keys 恢复数据时禁用索引,恢复完成后重建,大幅提升恢复速度
--enable-binlog 恢复时开启binlog,默认关闭(恢复到主库需要开启,恢复到从库建议关闭)
-v/--verbose 日志级别
  • 全量恢复

    myloader
    -u root
    -p '你的密码'
    -h 127.0.0.1
    -P 3306
    -d /data/backup/mysql_full_20260526_100000
    -t 16
    --overwrite-tables
    --disable-keys

  • 恢复指定的库

    将备份中的db1库恢复到新库db1_new

    myloader -u root -p -d /data/backup/full -B db1 -o new_db1 -t 8

  • 恢复指定的表

    仅恢复db1.user表

    myloader -u root -p -d /data/backup/full -B db1 -T user -t 4

  • 仅恢复数据(表结构已存在)

    myloader -u root -p -d /data/backup/full --no-schemas -t 16

mydumper生产最佳实践

生产环境备份规范

  • 线程数配置:备份线程数建议为CPU核心数的1~1.5倍,恢复线程数建议为CPU核心数的2倍
  • 分块备份:大表开启-r 100000参数,按10万行分块,便于恢复时并行处理,也避免单文件过大
  • 压缩开启:生产环境必须开启-c压缩,节省70%以上的磁盘空间,压缩开销很小
  • 从库备份:优先在从库执行备份,避免占用主库CPU/IO资源,完全不影响业务
  • 备份验证:每次备份后必须尝试恢复至少1个表,验证备份文件有效性
  • 异地存储:备份文件必须同步到异地存储,避免单机房故障丢失
  • 限速策略:业务高峰时段备份必须开启--limit-io参数,限制IO带宽

性能优化技巧

备份优化

  • 使用SSD存储备份,速度比机械盘快3~5倍
  • 开启大页、调整系统IO调度算法为deadline/noop
  • 备份时关闭MySQL的慢查询、general log等不必要的日志

恢复优化

  • 恢复前调整MySQL参数:innodb_flush_log_at_trx_commit=0、innodb_doublewrite=0(恢复完成后改回原值)
  • 开启--disable-keys参数,数据恢复完成后再建索引
  • 大库恢复前临时关闭binlog(set sql_log_bin=0)

增量备份方案

和mysqldump类似,mydumper是全量备份工具,增量备份需要结合binlog实现:

  1. 每日/每周执行mydumper全量备份
  2. 实时同步binlog到异地存储
  3. 恢复时先恢复最近一次全量备份,再重放备份时间点之后的binlog,实现任意时间点恢复

物理备份之Xtrabackup

XtraBackup 是 Percona 公司开发的 开源 MySQL 物理热备份工具,是目前生产环境 MySQL 物理备份的事实标准,支持 MySQL、Percona Server、MariaDB 所有主流版本,备份和恢复速度是逻辑备份工具的 5~20 倍,完全不影响业务读写,是 TB 级大库生产环境备份的首选方案。

为什么选择 XtraBackup?

  • 真正的热备:InnoDB 引擎备份期间完全不锁表、不中断业务读写,对业务零影响
  • 物理备份:直接拷贝数据文件,速度极快(TB级库备份仅需数十分钟)
  • 增量备份:支持基于上一次备份的增量备份,仅备份变化的数据,大幅节省备份时间和空间
  • 压缩与加密:内置压缩、加密功能,备份文件大小仅为原数据的 20%~30%
  • 流备份:支持直接备份到远程存储/云存储,无需占用本地磁盘空间
  • 支持部分备份/恢复:可以单独备份/恢复指定库/表,无需恢复整个实例
  • 开源免费:活跃维护,兼容所有主流 MySQL 分支
  • 恢复速度快:物理恢复直接拷贝文件,速度比逻辑恢复快 10 倍以上,大幅缩短故障恢复时间

Xtrabackup核心原理

XtraBackup 基于 InnoDB 的 Crash Recovery 机制实现无锁一致性备份:

  1. 备份阶段:
  • 启动后首先拷贝 InnoDB 的 redo log,记录当前最新的 LSN(日志序列号)
  • 并行拷贝所有 InnoDB 数据文件(.ibd 文件)
  • 获取全局读锁(FTWRL),拷贝 MyISAM、MEMORY 等非事务引擎的数据文件和系统表空间
  • 拷贝完成后释放全局锁,记录最终的 LSN 和 binlog 位点
  • 生成备份元数据文件(backup-my.cnf、xtrabackup_info、xtrabackup_checkpoints)
  1. Prepare 阶段:
  • 应用备份期间产生的 redo log 到数据文件,将所有数据页推进到一致的 LSN 点
  • 回滚未提交的事务,生成完整一致的、可直接启动的 MySQL 数据目录
  1. 恢复阶段:
  • 直接将 prepare 完成的数据目录拷贝到 MySQL 数据目录,修改权限后即可启动 MySQL

Xtrabackup下载安装

Xtrabackup与mysql版本对应关系

XtraBackup 版本 支持的 MySQL 版本
8.0.x MySQL 8.0.x、Percona Server 8.0.x、MariaDB 10.5+
2.4.x MySQL 5.6.x、5.7.x、Percona Server 5.6/5.7、MariaDB 10.0~10.4
2.3.x 已停止维护,仅支持 MySQL 5.5/5.6

下载地址:https://www.percona.com/downloads/

二进制安装

复制代码
root@master:/data00/software# wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.26-18/binary/tarball/percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.17.tar.gz

root@master:/data00/software# tar -xvf percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.17.tar.gz 

root@master:/data00/software# ln -s /data00/software/percona-xtrabackup-8.0.26-18-Linux-x86_64.glibc2.17/bin/* /usr/bin/

root@master:/data00/software# xtrabackup --version
xtrabackup: recognized server arguments: --datadir=/data00/data/mysql --innodb_buffer_pool_size=1G 
xtrabackup version 8.0.26-18 based on MySQL server 8.0.26 Linux (x86_64) (revision id: 4aecf82)

Xtrabackup核心参数详解

通用基础参数:

参数 说明
--user 数据库用户名,需要有RELOAD、LOCK TABLES、PROCESS、BACKUP_ADMIN权限
--password 数据库密码
--host 数据库地址
--port 数据库端口
--socket 本地socket文件路径
--datadir MySQL数据目录路径,自动从my.cnf读取,无需手动指定
--target-dir 备份文件存放目录,必须指定
--parallel 备份/恢复并行线程数,建议设置为CPU核心数的2倍

备份功能参数:

参数 说明
--backup 执行备份操作的核心参数,必须指定
--compress 开启LZ4压缩,大幅减小备份文件大小
--compress-threads 压缩并行线程数,默认等于并行数
--incremental 开启增量备份
--incremental-basedir 增量备份基于的上一次备份目录
--incremental-lsn 增量备份基于的LSN号,替代--incremental-basedir
--stream 流备份模式,支持tar或xbstream格式,可直接输出到标准输出,用于远程备份
--encrypt 开启加密备份,支持AES256算法
--encrypt-key 加密密钥,或使用--encrypt-key-file指定密钥文件
--include 部分备份,只备份匹配的库/表,格式:库名.表名,支持通配符
--exclude 排除指定库/表,格式同上
--no-lock 跳过非事务引擎的全局锁,仅所有表都是InnoDB时使用
--slave-info 备份从库时,记录主库的binlog位点,用于搭建新从库
--galera-info 备份Galera集群节点时记录WSREP信息

Prepare(恢复准备)参数:

参数 说明
--prepare 执行prepare操作,将备份数据推进到一致状态
--apply-log-only 增量备份prepare时使用,仅应用redo log,不回滚未提交事务,便于后续应用增量
--incremental-dir 增量prepare时指定要应用的增量备份目录
--decompress 解压压缩后的备份文件,需要先安装qpress工具
--remove-original 解压后删除原始压缩文件,节省空间

恢复参数

参数 说明
--copy-back 将prepare完成的备份文件拷贝到MySQL数据目录
--move-back 移动备份文件到数据目录,比copy更快,但备份文件会被删除
--datadir 目标MySQL数据目录路径

Xtrabackup备份实战

  • 全量备份

    创建备份目录

    mkdir -p /data/backup/full_$(date +%Y%m%d_%H%M%S)

    全量备份(开启压缩,8线程,非InnoDB表加锁)

    xtrabackup
    --defaults-file=/etc/my.cnf
    --host=127.0.0.1
    --port=3306
    --user=root
    --password=root
    --backup
    --compress
    --parallel=8
    --target-dir=/data00/backup/full_$(date +%Y%m%d_%H%M%S)

  • 无锁全量备份(所有表都是InnoDB)

    xtrabackup
    --defaults-file=/etc/my.cnf
    --host=127.0.0.1
    --port=3306
    --user=root
    --password='你的密码'
    --backup
    --compress
    --parallel=8
    --no-lock
    --target-dir=/data/backup/full_$(date +%Y%m%d_%H%M%S)

  • 增量备份
    增量备份基于上一次全量/增量备份,仅备份变化的数据,适合大库减少备份时间和空间占用:

    第一步:周日执行全量备份

    xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --compress --parallel=8 --target-dir=/data/backup/full_sunday

    第二步:周一执行第一次增量备份(基于周日的全量)

    xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --compress --parallel=8
    --incremental-basedir=/data/backup/full_sunday
    --target-dir=/data/backup/inc_monday

    第三步:周二执行第二次增量备份(基于周一的增量)

    xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --compress --parallel=8
    --incremental-basedir=/data/backup/inc_monday
    --target-dir=/data/backup/inc_tuesday

  • 部分备份(仅备份指定库/表)

    仅备份db1和db2两个库

    xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --include='db1.|db2.' --target-dir=/data/backup/db1_db2

    备份所有库,排除test库和log库

    xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --exclude='test.|log.' --target-dir=/data/backup/without_test_log

  • 流备份(直接备份到远程服务器,不占用本地空间)

    本地备份直接流式传输到远程服务器

    xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --stream=xbstream --parallel=8 | ssh user@remote_host "xbstream -x -C /data/remote_backup/"

    流备份+压缩+加密+传输到S3

    xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --stream=xbstream --compress --encrypt=AES256 --encrypt-key='你的密钥' | aws s3 cp - s3://your-bucket/mysql_backup.xbstream

    流备份+压缩+加密+传输到oss

    xtrabackup --defaults-file=/etc/my.cnf --host=127.0.0.1 --port=3306 --user=root --password=xxx --backup --stream=xbstream --compress | ossutil cp - oss://your-bucket/mysql_backup.xbstream

Xtrabackup恢复实战

全量恢复实战

步骤1:解压备份(如果开启了压缩)

复制代码
下载解压工具,ubuntu系统
# 1. 更新包列表并安装必要工具
sudo apt update
sudo apt install -y wget gnupg2 lsb-release

# 2. 下载并安装 Percona 仓库配置包
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
sudo dpkg -i percona-release_latest.generic_all.deb

# 3. 启用 Percona 的 tools 仓库并更新
sudo percona-release enable-only tools
sudo apt update

# 4. 安装 qpress
sudo apt install -y qpress

# 5. 确认安装成功
which qpress

# 解压
root@master:/data00/backup# xtrabackup --decompress --remove-original --parallel=8 --target-dir=/data00/backup/full_20260526_170147
xtrabackup: recognized server arguments: --datadir=/data00/data/mysql --innodb_buffer_pool_size=1G 
xtrabackup: recognized client arguments: --decompress=1 --remove-original=1 --parallel=8 --target-dir=/data00/backup/full_20260526_170147 
xtrabackup version 8.0.26-18 based on MySQL server 8.0.26 Linux (x86_64) (revision id: 4aecf82)
260526 17:25:59 [01] decompressing ./mysql.ibd.qp
260526 17:25:59 [07] decompressing ./mysql/slow_log.CSM.qp
# ...省略万字内容
260526 17:25:59 completed OK!

步骤2:Prepare 备份(将数据推进到一致状态)

复制代码
root@master:/data00/backup# xtrabackup --prepare --parallel=8 --target-dir=/data00/backup/full_20260526_170147
xtrabackup: recognized server arguments: --innodb_checksum_algorithm=crc32 --innodb_log_checksums=1 --innodb_data_file_path=ibdata1:12M:autoextend --innodb_log_files_in_group=2 --innodb_log_file_size=50331648 --innodb_page_size=16384 --innodb_undo_directory=./ --innodb_undo_tablespaces=2 --server-id=0 --innodb_log_checksums=ON --innodb_redo_log_encrypt=0 --innodb_undo_log_encrypt=0 
xtrabackup: recognized client arguments: --prepare=1 --parallel=8 --target-dir=/data00/backup/full_20260526_170147 
xtrabackup version 8.0.26-18 based on MySQL server 8.0.26 Linux (x86_64) (revision id: 4aecf82)
xtrabackup: cd to /data00/backup/full_20260526_170147/
#...省略万字内容
260526 17:27:21 completed OK!

看到 completed OK! 表示prepare成功,此时备份已经是一致可恢复的状态。

步骤3:停止MySQL,清空数据目录

复制代码
root@master:/data00/backup# systemctl stop mysql.service 
root@master:~# mv /data00/data/mysql /data00/data/mysql_bak
root@master:~# mkdir -p /data00/data/mysql

步骤4:恢复备份到数据目录

复制代码
# 方式1:拷贝(备份文件保留)
xtrabackup --copy-back --parallel=8 --target-dir=/data00/backup/full_20260526_170147

# 方式2:移动(速度更快,备份文件被删除)
# xtrabackup --move-back --parallel=8 --target-dir=/data00/backup/full_20260526_170147

步骤五:修改权限,启动MySQL

复制代码
chown -R mysql:mysql /data00/data/mysql
systemctl start mysql.service

增量备份恢复流程

假设我们有周日全量、周一增量、周二增量三份备份:

步骤1:解压所有备份

复制代码
xtrabackup --decompress --remove-original --parallel=8 --target-dir=/data/backup/full_sunday
xtrabackup --decompress --remove-original --parallel=8 --target-dir=/data/backup/inc_monday
xtrabackup --decompress --remove-original --parallel=8 --target-dir=/data/backup/inc_tuesday

步骤2:Prepare 全量备份(仅应用redo log,不回滚事务)

复制代码
xtrabackup --prepare --apply-log-only --parallel=8 --target-dir=/data/backup/full_sunday

步骤3:应用周一增量到全量备份

复制代码
xtrabackup --prepare --apply-log-only --parallel=8 \
  --target-dir=/data/backup/full_sunday \
  --incremental-dir=/data/backup/inc_monday

步骤4:应用周二增量到全量备份(最后一次增量不需要--apply-log-only)

复制代码
xtrabackup --prepare --parallel=8 \
  --target-dir=/data/backup/full_sunday \
  --incremental-dir=/data/backup/inc_tuesday

步骤5:后续恢复流程和全量备份一致

复制代码
systemctl stop mysqld
mv /var/lib/mysql /var/lib/mysql_bak
mkdir /var/lib/mysql
xtrabackup --copy-back --parallel=8 --target-dir=/data/backup/full_sunday
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld

单表恢复(MySQL 8.0+ 支持)

复制代码
# 1. 单独备份某张表
xtrabackup --user=root --password=xxx --backup --include='db1.user' --target-dir=/data/backup/user_table

# 2. Prepare 备份
xtrabackup --prepare --export --target-dir=/data/backup/user_table

# 3. 在目标库删除该表的表空间
mysql> ALTER TABLE db1.user DISCARD TABLESPACE;

# 4. 拷贝备份中的.ibd和.cfg文件到目标库数据目录
cp /data/backup/user_table/db1/user.{ibd,cfg} /var/lib/mysql/db1/
chown mysql:mysql /var/lib/mysql/db1/user.*

# 5. 导入表空间
mysql> ALTER TABLE db1.user IMPORT TABLESPACE;

生产环境最佳实践

生产环境备份策略

  • 备份频率:核心库每周日全量备份,周一到周六每日增量备份,binlog实时备份到异地
  • 备份位置:优先在从库执行备份,完全不影响主库业务
  • 压缩开启:生产环境必须开启压缩,节省70%以上的存储空间
  • 并行数配置:备份并行数设置为CPU核心数的2倍,恢复并行数设置为CPU核心数的4倍
  • 备份验证:每周至少执行一次恢复演练,验证备份有效性(备份不可用=没做备份)
  • 异地存储:备份文件必须同步到异地存储/对象存储,避免单机房故障丢失
  • 监控告警:备份失败、备份文件大小异常必须及时告警
  • 定期清理:备份文件保留周期根据业务需求配置,一般保留1~4周,归档备份保留3个月以上

性能优化技巧

  1. 备份优化:
  • 使用SSD存储备份,速度比机械盘快5~10倍
  • 开启大页、调整系统IO调度算法为noop/deadline
  • 备份时临时调整MySQL的 innodb_flush_log_at_trx_commit=0 提升IO性能
  • 优先使用物理机备份,避免虚拟化IO overhead
  1. 恢复优化:
  • 恢复前调整MySQL参数:innodb_buffer_pool_size=物理内存的70%、innodb_flush_log_at_trx_commit=0、innodb_doublewrite=0(恢复完成后改回原值)
  • 使用 --move-back 替代 --copy-back,减少一次文件拷贝开销
  • 大库恢复前关闭binlog、慢查询日志、general log