mysqlpump
mysqlpump是MySQL 5.7版本引入的一个高效逻辑备份工具,作为传统mysqldump的增强替代品,它通过并行处理、压缩支持和更灵活的备份选项显著提升了备份效率。本文将全面解析mysqlpump的核心特性、使用方法和最佳实践。
在 MySQL 8.4.5 版本中,Oracle 官方移除了 mysqlpump工具。这是 MySQL 工具链持续演进的一部分,官方推荐使用更现代的替代方案。
为什么移除了 mysqlpump?
- 功能重叠:与
mysqldump和 MySQL Shell 的备份功能存在大量重叠 - 维护成本:减少代码库中冗余工具的维护负担
- 性能考量:MySQL Shell 的备份工具提供了更好的性能
- 云原生方向:Oracle 推动用户使用更现代化的工具链
mysqlpump概述
mysqlpump是MySQL官方提供的逻辑备份工具,与mysqldump相比具有以下显著优势:
- 并行处理:支持多线程备份,可并行备份多个表或数据库,大幅提高备份速度
- 压缩支持:内置ZLIB和LZ4压缩算法,可直接输出压缩文件,减少存储空间占用
- 进度显示:备份过程中可显示进度信息,便于监控
- 灵活过滤:可精确选择备份对象(数据库、表、用户等),也支持排除特定对象
- 恢复优化:采用"先建表→插入数据→最后建索引"的顺序,减少索引维护开销,加快恢复速度
安装方法
mysqlpump随MySQL 5.7+一起安装,通常位于MySQL的bin目录下。若未安装,可通过包管理器安装MySQL客户端:
bash
# CentOS/RHEL
yum -y install mysql-client
# Debian/Ubuntu
apt-get -y install mysql-client语法格式
bash
mysqlpump [连接选项] [备份选项] [db_name [tbl_name ...]]选项
| 选项 | 类别 | 描述 | 示例 |
|---|---|---|---|
--user=name -u | 连接 | 连接用户名 | -u admin |
--password[=pwd] -p | 连接 | 连接密码 | -p(交互输入) |
--host=name -h | 连接 | 连接主机 | -h 192.168.1.100 |
--port=# -P | 连接 | 连接端口 | -P 3307 |
--socket=path -S | 连接 | Unix socket路径 | -S /tmp/mysql.sock |
--ssl-mode=mode | 连接 | SSL连接模式 | --ssl-mode=REQUIRED |
--login-path=name | 连接 | 从.mylogin.cnf读取登录路径 | --login-path=prod |
--default-parallelism=N | 并行 | 默认并行线程数(默认2) | --default-parallelism=8 |
--parallel-schemas=[N:]db_list | 并行 | 指定数据库的并行度 | --parallel-schemas=4:db1,db2 |
--parallel-schemas-tables=[N:]db.tbl | 并行 | 指定表的并行度 | --parallel-schemas-tables=2:db1.* |
--background-schemas | 并行 | 后台处理schema信息 | --background-schemas |
--all-databases -A | 过滤 | 备份所有数据库 | -A |
--databases db1 db2 -B | 过滤 | 备份指定数据库 | -B db1 db2 |
--include-databases=db_list | 过滤 | 包含指定数据库 | --include-databases=hr,finance |
--exclude-databases=db_list | 过滤 | 排除指定数据库 | --exclude-databases=test,temp |
--include-tables=tbl_list | 过滤 | 包含指定表 | --include-tables=users.* |
--exclude-tables=tbl_list | 过滤 | 排除指定表 | --exclude-tables=*.logs |
--include-routines=pattern | 过滤 | 包含存储过程/函数 | --include-routines='get_*' |
--exclude-routines=pattern | 过滤 | 排除存储过程/函数 | --exclude-routines='temp_*' |
--include-events=pattern | 过滤 | 包含事件 | --include-events='backup_*' |
--exclude-events=pattern | 过滤 | 排除事件 | --exclude-events='test_*' |
--include-triggers=pattern | 过滤 | 包含触发器 | --include-triggers='trg_*' |
--exclude-triggers=pattern | 过滤 | 排除触发器 | --exclude-triggers='tmp_*' |
--compress-output=algorithm | 输出 | 压缩算法(ZLIB/LZ4) | --compress-output=LZ4 |
--result-file=file -r | 输出 | 输出文件 | -r backup.sql |
--tz-utc | 输出 | 使用UTC时区(默认启用) | --tz-utc |
--skip-tz-utc | 输出 | 禁用UTC时区 | --skip-tz-utc |
--hex-blob | 输出 | 二进制数据十六进制编码 | --hex-blob |
--skip-definer | 输出 | 跳过CREATE语句的DEFINER | --skip-definer |
--skip-comments | 输出 | 跳过SQL注释 | --skip-comments |
--skip-dump-rows -d | 输出 | 仅备份结构 | -d |
--defer-table-indexes | 性能 | 延迟创建索引 | --defer-table-indexes |
--insert-ignore | 性能 | 使用INSERT IGNORE语法 | --insert-ignore |
--replace | 性能 | 使用REPLACE语法 | --replace |
--single-transaction | 性能 | 使用事务保证一致性 | --single-transaction |
--skip-lock-tables | 性能 | 不锁表(需配合--single-transaction) | --skip-lock-tables |
--set-gtid-purged=value | 性能 | GTID处理(OFF/ON/AUTO) | --set-gtid-purged=ON |
--users | 元数据 | 单独备份用户账户 | --users |
--exclude-users=pattern | 元数据 | 排除指定用户 | --exclude-users='temp_*' |
--routines | 元数据 | 单独备份存储过程/函数 | --routines |
--events | 元数据 | 单独备份事件 | --events |
--triggers | 元数据 | 单独备份触发器 | --triggers |
--verbose -v | 调试 | 详细输出 | -v |
--debug-info | 调试 | 输出调试信息 | --debug-info |
--watch-progress | 调试 | 显示进度(默认启用) | --watch-progress |
--skip-watch-progress | 调试 | 隐藏进度 | --skip-watch-progress |
--defaults-file=file | 调试 | 指定配置文件 | --defaults-file=/etc/mysql/my.cnf |
--add-drop-database | 危险 | 添加DROP DATABASE语句 | --add-drop-database |
--add-drop-table | 危险 | 添加DROP TABLE语句(默认启用) | --skip-add-drop-table |
--add-drop-user | 危险 | 添加DROP USER语句 | --add-drop-user |
数据备份
在mysqlpump命令中添加--exclude-databases=information_schema,performance_schema,mysql,sys参数,跳过系统数据库的备份。
备份可以添加时间$(date +%Y_%m_%d_%H_%M)
全库备份
bash
# 全库备份
mysqlpump \
-u username \
-p \
-A \
--exclude-databases=information_schema,performance_schema,mysql,sys > full_backup.sql
# 多线程备份
mysqlpump -u username -p --default-parallelism=4 -A --exclude-databases=information_schema,performance_schema,mysql,sys > full_backup_$(date +%Y_%m_%d_%H_%M).sql单库备份
bash
# 基础单库备份
mysqlpump -u username -p -B mydb > db_backup.sql多数据库备份
bash
# 基础多库备份
mysqlpump -u username -p --databases db1 db2 db3 > multi_db_backup.sql
# 多数据并行备份
mysqlpump -u username -p --parallel-schemas=3:db1,db2 --parallel-schemas=2:db3 > multi_db.sql单表备份
bash
mysqlpump -u username -p mydb --tables table1 table2 > table_backup.sql压缩备份
bash
# 压缩备份,支持两种压缩算法:
# - ZLIB:压缩率高但速度较慢
# - LZ4:压缩速度快但压缩率较低
mysqlpump -u username -p --compress-output=LZ4 mydb > backup.lz4
mysqlpump -u username -p --compress-output=ZLIB -A > backup.lz4
# 解压恢复
lz4_decompress backup.lz4 backup.sql # LZ4格式
zlib_decompress backup.zlib backup.sql # ZLIB格式
mysql -u username -p < backup.sql对象过滤
bash
# 包含/排除数据库
mysqlpump --include-databases=db1,db2
mysqlpump --exclude-databases=mysql,sys
# 包含/排除表
mysqlpump mydb --include-tables=table1,table2
mysqlpump mydb --exclude-tables=temp_table
# 备份用户权限
mysqlpump --users --exclude-databases=% > users_backup.sql一致性备份
对于InnoDB表,使用--single-transaction参数实现不锁表的热备份:
bash
mysqlpump --single-transaction -u username -p mydb > backup.sql注意:在MySQL 5.7.11之前,
--single-transaction与--default-parallelism互斥,需设置--default-parallelism=0
恢复备份
bash
# mysqlpump生成的备份文件是SQL格式,使用mysql客户端恢复:
mysql -u username -p mydb < backup.sql
# 对于压缩备份,需先解压再恢复
lz4_decompress backup.lz4 backup.sql # LZ4格式
zlib_decompress backup.zlib backup.sql # ZLIB格式
mysql -u username -p < backup.sql自动化备份脚本示例
bash
#!/bin/bash
# MySQLpump备份脚本
DB_HOST="192.168.0.1"
DB_USER="backup_user"
DB_PASS="password"
DATABASES="mydb"
BACKUP_DIR="/data/backup"
TS=$(date +%Y_%m_%d)
BACKUP_FILE="${BACKUP_DIR}/backup_${TS}.sql.lz4"
LOG_FILE="${BACKUP_DIR}/backup_${TS}.log"
PARALLEL_THREADS=4 # 设置为CPU核心数的50-75%
echo "[$(date +'%F %T')] 备份开始,使用 ${PARALLEL_THREADS} 个线程" | tee -a ${LOG_FILE}
mysqlpump -h${DB_HOST} -u${DB_USER} -p"${DB_PASS}" \
--default-parallelism=${PARALLEL_THREADS} \
--parallel-schemas=${PARALLEL_THREADS}:${DATABASES} \
--single-transaction \
--compress-output=LZ4 \
--defer-table-indexes \
--exclude-databases=mysql,sys \
--log-error=${LOG_FILE} \
--result-file=${BACKUP_FILE} \
2>> ${LOG_FILE}
if [ $? -eq 0 ] && [ -f ${BACKUP_FILE} ]; then
echo "[$(date +'%F %T')] 备份成功,文件:${BACKUP_FILE}" | tee -a ${LOG_FILE}
else
echo "[$(date +'%F %T')] 备份失败!请检查日志:${LOG_FILE}" >&2
exit 1
fi注意事项
- 版本要求:mysqlpump需要MySQL 5.7或更高版本
- 并行度设置:根据服务器CPU核心数设置,通常为CPU核心数的50-75%
- 备份时机:安排在业务低峰期执行大型备份
- 监控资源:并行备份会增加内存使用,需监控服务器负载
- 定期验证:定期测试备份文件的完整性和可恢复性
- 超大表处理:对于单个超大表,考虑使用mydumper或分批备份
- GTID处理:适当设置
--set-gtid-purged参数避免GTID相关错误
