Skip to content

mysqlpump

mysqlpump是MySQL 5.7版本引入的一个高效逻辑备份工具,作为传统mysqldump的增强替代品,它通过并行处理、压缩支持和更灵活的备份选项显著提升了备份效率。本文将全面解析mysqlpump的核心特性、使用方法和最佳实践。

在 MySQL 8.4.5 版本中,Oracle 官方移除了 mysqlpump工具。这是 MySQL 工具链持续演进的一部分,官方推荐使用更现代的替代方案。

为什么移除了 mysqlpump?

  1. 功能重叠:与 mysqldump和 MySQL Shell 的备份功能存在大量重叠
  2. 维护成本:减少代码库中冗余工具的维护负担
  3. 性能考量:MySQL Shell 的备份工具提供了更好的性能
  4. 云原生方向:Oracle 推动用户使用更现代化的工具链

mysqlpump概述

mysqlpump是MySQL官方提供的逻辑备份工具,与mysqldump相比具有以下显著优势:

  1. 并行处理:支持多线程备份,可并行备份多个表或数据库,大幅提高备份速度
  2. 压缩支持:内置ZLIB和LZ4压缩算法,可直接输出压缩文件,减少存储空间占用
  3. 进度显示:备份过程中可显示进度信息,便于监控
  4. 灵活过滤:可精确选择备份对象(数据库、表、用户等),也支持排除特定对象
  5. 恢复优化:采用"先建表→插入数据→最后建索引"的顺序,减少索引维护开销,加快恢复速度

安装方法

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

注意事项

  1. 版本要求:mysqlpump需要MySQL 5.7或更高版本
  2. 并行度设置:根据服务器CPU核心数设置,通常为CPU核心数的50-75%
  3. 备份时机:安排在业务低峰期执行大型备份
  4. 监控资源:并行备份会增加内存使用,需监控服务器负载
  5. 定期验证:定期测试备份文件的完整性和可恢复性
  6. 超大表处理:对于单个超大表,考虑使用mydumper或分批备份
  7. GTID处理:适当设置--set-gtid-purged参数避免GTID相关错误