Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql备份恢复

Mysql数据库备份恢复详解

作者:huangSir-devops

本文详细介绍了MySQL备份与恢复技术,包括逻辑备份工具mysqlogdop与mydumper,以及物理备份工具Xtrabbackup,myslogdop适用于跨版本、跨平台场景,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧

概述

在实际生产环境中,我们要定期针对数据库做备份,避免误操作导致数据丢失没办法恢复。
mysql备份按照原理分为两种,分别是逻辑备份和物理备份。

逻辑备份:

物理备份

逻辑备份之mysqldump

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

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

mysqldump优缺点

优点:

缺点:

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/-lMyISAM备份时锁定所有表(只读),保证备份一致性所有表不可写,对业务影响极大,不建议生产用
--lock-all-tables/-x所有引擎全局锁,整个实例只读业务完全停写,仅适用于停机维护场景
--single-transactionInnoDB利用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=NMySQL 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优势和原理

优势:

原理:

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-transactionInnoDB 引擎无锁一致性备份,和 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生产最佳实践

生产环境备份规范

性能优化技巧

备份优化

恢复优化

增量备份方案

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

物理备份之Xtrabackup

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

为什么选择 XtraBackup?

Xtrabackup核心原理

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

Xtrabackup下载安装

Xtrabackup与mysql版本对应关系

XtraBackup 版本支持的 MySQL 版本
8.0.xMySQL 8.0.x、Percona Server 8.0.x、MariaDB 10.5+
2.4.xMySQL 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文件路径
--datadirMySQL数据目录路径,自动从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)
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;

生产环境最佳实践

生产环境备份策略

性能优化技巧

到此这篇关于mysql备份恢复详解的文章就介绍到这了,更多相关mysql备份恢复内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文