概述
在实际生产环境中,我们要定期针对数据库做备份,避免误操作导致数据丢失没办法恢复。
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倍
原理:
- 主线程连接到MySQL,开启一致性快照事务(InnoDB),获取全局读锁(FTWRL)保证非InnoDB表备份一致性
- 记录当前binlog文件名和位点,用于搭建从库/增量恢复
- 启动N个工作线程,每个线程负责备份部分表,并行执行备份任务
- 备份完成后释放全局锁,生成备份元数据文件
- 每个表的结构导出为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.000123Pos: 456789GTID: 0-1-123456Finished 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实现:
- 每日/每周执行mydumper全量备份
- 实时同步binlog到异地存储
- 恢复时先恢复最近一次全量备份,再重放备份时间点之后的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 机制实现无锁一致性备份:
- 备份阶段:
- 启动后首先拷贝 InnoDB 的 redo log,记录当前最新的 LSN(日志序列号)
- 并行拷贝所有 InnoDB 数据文件(.ibd 文件)
- 获取全局读锁(FTWRL),拷贝 MyISAM、MEMORY 等非事务引擎的数据文件和系统表空间
- 拷贝完成后释放全局锁,记录最终的 LSN 和 binlog 位点
- 生成备份元数据文件(backup-my.cnf、xtrabackup_info、xtrabackup_checkpoints)
- Prepare 阶段:
- 应用备份期间产生的 redo log 到数据文件,将所有数据页推进到一致的 LSN 点
- 回滚未提交的事务,生成完整一致的、可直接启动的 MySQL 数据目录
- 恢复阶段:
- 直接将 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.gzroot@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;
