Skip to content

MySQL mysqlpump使用指南

mysqlpump安装与配置

安装方法

  • 随MySQL安装:mysqlpump随MySQL 5.7.8+版本自动安装
  • 位置:通常位于MySQL二进制目录下,与mysqldump同目录
  • 验证安装
    bash
    mysqlpump --version
    # 输出示例:mysqlpump  Ver 8.0.32 for Win64 on x86_64 (MySQL Community Server - GPL)

配置文件

  • 使用MySQL配置文件:mysqlpump读取my.cnf/my.ini配置文件
  • 常用配置项
    txt
    [mysqlpump]
    user=backup_user
    password=backup_password
    host=localhost
    port=3306
    default-character-set=utf8mb4
    parallel-single-transaction=4
    compress-output=LZ4

mysqlpump基本使用

连接选项

  • 指定用户名和密码

    bash
    mysqlpump -u root -p
  • 指定主机和端口

    bash
    mysqlpump -h 192.168.1.100 -P 3306 -u root -p

备份所有数据库

bash
# 备份所有数据库,包括系统数据库
mysqlpump --all-databases > all_databases.sql

# 备份所有数据库,不包括系统数据库
mysqlpump --all-databases --exclude-databases=mysql,sys,information_schema,performance_schema > all_user_databases.sql

备份指定数据库

bash
# 备份单个数据库
mysqlpump test_db > test_db.sql

# 备份多个数据库
mysqlpump db1 db2 db3 > multiple_dbs.sql

备份指定表

bash
# 备份单个表
mysqlpump test_db --tables=table1 > table1.sql

# 备份多个表
mysqlpump test_db --tables=table1,table2,table3 > multiple_tables.sql

# 备份表的指定行
mysqlpump test_db --tables=table1 --where="id < 1000" > table1_partial.sql

排除数据库和表

bash
# 排除单个数据库
mysqlpump --all-databases --exclude-databases=test_db > all_except_test.sql

# 排除多个数据库
mysqlpump --all-databases --exclude-databases=db1,db2 > all_except_db1_db2.sql

# 排除表
mysqlpump test_db --exclude-tables=table1 > test_db_except_table1.sql

# 排除多个表
mysqlpump test_db --exclude-tables=table1,table2 > test_db_except_tables.sql

高级特性使用

并行备份

  • 指定并行线程数

    bash
    # 使用4个并行线程备份
    mysqlpump --all-databases --parallel-single-transaction=4 > all_databases.sql
    
    # 使用8个并行线程备份,指定压缩算法
    mysqlpump --all-databases --parallel-single-transaction=8 --compress-output=LZ4 > all_databases.lz4
  • 并行备份注意事项

    • 并行线程数建议设置为CPU核心数的1-2倍
    • 仅InnoDB表支持并行备份
    • MyISAM表会自动降级为单线程备份

压缩备份

  • 支持的压缩算法

    • LZ4:压缩速度快,压缩率较低
    • ZLIB:压缩率较高,压缩速度较慢
  • 使用压缩备份

    bash
    # 使用LZ4压缩

mysqlpump --all-databases --compress-output=LZ4 > all_databases.lz4

使用ZLIB压缩

mysqlpump --all-databases --compress-output=ZLIB > all_databases.zlib


### 备份进度显示

```bash
# 显示备份进度
mysqlpump --all-databases --show-progress > all_databases.sql
# 输出示例:Processing database: test_db
#         Processing table: test_db.table1 (1000 rows, 100.00%)

备份用户权限

bash
# 备份所有用户权限
mysqlpump --users > users.sql

# 备份指定用户权限
mysqlpump --users=root,backup_user > specified_users.sql

# 备份数据库同时备份用户权限
mysqlpump --all-databases --users > all_databases_with_users.sql

部分备份策略

  • 按数据量备份

    bash
    # 备份大表时使用单独的并行线程
    mysqlpump --all-databases --parallel-single-transaction=4 --set-gtid-purged=OFF > all_databases.sql
  • 按时间范围备份

    bash
    # 备份最近7天修改的数据
    mysqlpump test_db --tables=orders --where="update_time > DATE_SUB(NOW(), INTERVAL 7 DAY)" > recent_orders.sql

输出格式选项

  • SQL格式:默认格式,适合小到中等规模的备份

    bash
    mysqlpump test_db > test_db.sql
  • 文件-per-table格式:每个表生成一个文件,适合大规模备份

    bash
    # 每个表生成一个SQL文件,存放在指定目录
    mysqlpump test_db --result-file-per-table=./backup/

数据恢复操作

基本恢复

bash
# 恢复单个数据库
mysql -u root -p test_db < test_db.sql

# 恢复所有数据库
mysql -u root -p < all_databases.sql

# 恢复压缩备份
lz4cat all_databases.lz4 | mysql -u root -p

恢复用户权限

bash
# 恢复用户权限
mysql -u root -p < users.sql

# 刷新权限
mysql -u root -p -e "FLUSH PRIVILEGES;"

部分恢复

bash
# 从全库备份中恢复单个表
mysql -u root -p test_db < table1.sql

# 使用grep从全库备份中提取单个表的备份
 grep -A 100000 "CREATE TABLE `table1`" all_databases.sql | grep -B 100000 "CREATE TABLE `" > table1.sql
mysql -u root -p test_db < table1.sql

最佳实践

生产环境备份策略

  • 定期全量备份:每周或每月执行一次全量备份
  • 增量备份结合:使用mysqlbinlog进行增量备份,与mysqlpump全量备份结合
  • 备份验证:定期验证备份文件的完整性和可恢复性
  • 异地备份:将备份文件复制到异地存储,防止本地灾难
  • 备份自动化:使用cron或其他调度工具自动执行备份任务

性能优化

  • 选择合适的并行线程数:根据CPU核心数和系统负载调整
  • 使用压缩备份:减少备份文件大小和存储成本
  • 排除无用数据:排除测试数据、临时表和日志表
  • 使用--set-gtid-purged=OFF:如果不使用GTID,可加速备份
  • 在业务低峰期执行备份:减少对生产系统的影响

安全性考虑

  • 使用专用备份用户:创建具有最小权限的备份用户

    sql
    CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'strong_password';
    GRANT SELECT, SHOW VIEW, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup_user'@'localhost';
    FLUSH PRIVILEGES;
  • 加密备份文件:使用加密工具保护备份文件

    bash
    # 使用OpenSSL加密备份文件
    openssl enc -aes-256-cbc -salt -in all_databases.sql -out all_databases.sql.enc -k "encryption_key"
    
    # 解密备份文件
    openssl enc -d -aes-256-cbc -in all_databases.sql.enc -out all_databases.sql -k "encryption_key"
  • 限制备份文件访问权限

    bash
    chmod 600 all_databases.sql

版本差异

MySQL 5.7.x

  • 初始版本:MySQL 5.7.8引入mysqlpump
  • 支持特性:基本的并行备份、压缩备份、用户权限备份
  • 限制
    • 并行线程数最大为16
    • 压缩算法选择有限
    • 备份进度显示不够详细

MySQL 8.0.x

  • 增强特性
    • 支持更多压缩算法
    • 并行线程数无限制
    • 改进的备份进度显示
    • 更好的错误处理
    • 支持更多的备份选项
  • 新选项
    • --skip-definer:跳过视图和存储过程的DEFINER子句
    • --default-parallelism:设置默认并行线程数
    • --include-triggers:包含触发器备份
    • --include-events:包含事件调度器备份

常见问题与解决方案

1. 备份过程中出现锁等待超时

  • 问题:备份MyISAM表时出现锁等待超时
  • 解决方案
    • 增加锁等待超时时间:--lock-wait-timeout=300
    • 在业务低峰期执行备份
    • 考虑将MyISAM表转换为InnoDB表

2. 并行备份速度不如预期

  • 问题:使用多个并行线程,但备份速度没有明显提升
  • 解决方案
    • 检查是否所有表都是InnoDB表
    • 调整并行线程数,避免资源竞争
    • 检查磁盘IO性能,可能是IO瓶颈
    • 关闭其他消耗资源的进程

3. 压缩备份导致CPU使用率过高

  • 问题:压缩备份时CPU使用率达到100%
  • 解决方案
    • 降低并行线程数
    • 选择更快的压缩算法(如LZ4)
    • 考虑在备份后使用外部工具压缩

4. 备份文件过大

  • 解决方案
    • 使用压缩备份
    • 排除无用数据库和表
    • 考虑使用增量备份策略
    • 对大表进行分区,只备份活跃分区

5. 恢复时出现字符集错误

  • 问题:恢复时出现"ERROR 1267 (HY000): Illegal mix of collations"
  • 解决方案
    • 备份时指定正确的字符集:--default-character-set=utf8mb4
    • 恢复时也指定相同的字符集:mysql --default-character-set=utf8mb4 -u root -p < backup.sql

6. 备份用户权限失败

  • 问题mysqlpump --users 失败,提示权限不足
  • 解决方案
    • 确保备份用户具有SELECT权限在mysql数据库上
    • 使用root用户执行用户权限备份
    • 检查MySQL版本,确保支持--users选项

常见问题(FAQ)

Q1: mysqlpump和mysqldump如何选择?

A1: 选择建议:

  • 小规模数据库(<10GB):mysqldump足够
  • 大规模数据库(>10GB):优先使用mysqlpump
  • 高并发环境:mysqlpump的并行备份更适合
  • 需要压缩备份:mysqlpump内置支持,更方便
  • 兼容性要求高:mysqldump支持所有MySQL版本

Q2: 并行备份线程数如何设置?

A2: 并行线程数设置建议:

  • 物理服务器:线程数=CPU核心数×1.5
  • 虚拟机:线程数=分配的vCPU数×2
  • 云服务器:根据实例规格调整,一般为4-8线程
  • 监控系统负载,避免CPU使用率过高

Q3: 如何验证备份文件的完整性?

A3: 验证备份文件完整性的方法:

  • 使用mysqlcheck检查备份前的表完整性
  • 恢复备份到测试环境,验证数据一致性
  • 使用mysqlimportsource命令测试备份文件语法
  • 对于压缩文件,先解压再验证

Q4: 如何备份超大表(>100GB)?

A4: 超大表备份策略:

  • 使用mysqlpump的并行备份:--parallel-single-transaction=8
  • 结合分区表,只备份活跃分区
  • 考虑使用物理备份工具(如Percona XtraBackup)
  • 采用增量备份策略,减少全量备份频率

Q5: mysqlpump支持增量备份吗?

A5: mysqlpump本身不支持增量备份,但可以结合mysqlbinlog实现:

  • 使用mysqlpump进行全量备份
  • 启用二进制日志,使用mysqlbinlog进行增量备份
  • 恢复时先恢复全量备份,再应用二进制日志增量

Q6: 如何自动化mysqlpump备份?

A6: 自动化备份示例(使用bash脚本):

bash
#!/bin/bash

# 备份配置
BACKUP_DIR="/backup/mysql"
DATE=$(date +"%Y%m%d_%H%M%S")
USER="backup_user"
PASSWORD="backup_password"
PARALLEL=4

# 创建备份目录
mkdir -p $BACKUP_DIR

# 执行备份
mysqlpump --user=$USER --password=$PASSWORD --all-databases --parallel-single-transaction=$PARALLEL --compress-output=LZ4 --show-progress > $BACKUP_DIR/full_backup_$DATE.lz4

# 验证备份是否成功
if [ $? -eq 0 ]; then
    echo "Backup completed successfully: $BACKUP_DIR/full_backup_$DATE.lz4"
    # 删除7天前的备份
    find $BACKUP_DIR -name "full_backup_*.lz4" -mtime +7 -delete
else
    echo "Backup failed!"
    exit 1
fi

Q7: 如何从压缩备份中恢复单个表?

A7: 从压缩备份中恢复单个表的步骤:

bash
# 解压压缩文件
lz4cat all_databases.lz4 > all_databases.sql

# 提取单个表的备份
grep -n "CREATE TABLE `table1`" all_databases.sql
# 找到表创建的行号,假设是100行

# 提取表结构和数据
sed -n '100,/CREATE TABLE/p' all_databases.sql | head -n -1 > table1.sql

# 恢复单个表
mysql -u root -p test_db < table1.sql

Q8: mysqlpump备份时如何处理外键约束?

A8: 处理外键约束的方法:

  • mysqlpump默认会在备份开始时禁用外键检查,备份结束后启用
  • 使用--skip-disable-foreign-keys选项可以禁用此行为
  • 恢复时建议使用SET FOREIGN_KEY_CHECKS=0先禁用外键检查,恢复完成后启用
  • 示例:
    bash
    mysql -u root -p -e "SET FOREIGN_KEY_CHECKS=0; SOURCE all_databases.sql; SET FOREIGN_KEY_CHECKS=1;"