【MySQL】mydumper 的备份和恢复实用用法
在 MySQL 数据库运维中,备份与恢复是保障数据安全的核心环节。mydumper 作为一款高性能的逻辑备份工具,凭借多线程备份、灵活过滤、压缩存储等优势,逐渐成为运维人员的首选。除基础全库备份外,mydumper 还支持单库 / 多库、单表 / 多表备份,以及正则过滤、自定义线程数等高级功能,本文将详细拆解这些实用用法,附完整命令示例与问题排查方案。
一、核心准备:备份用户权限配置
使用前需确保备份用户具备足够权限,建议创建专用用户并授权:
-- 创建备份用户
CREATE USER 'u_mydumper'@'%' IDENTIFIED BY 'Ud8agc_a';
-- 授予备份/恢复核心权限
GRANT SELECT, SHOW VIEW, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'u_mydumper'@'%';
-- 恢复时若需处理系统表,需补充SUPER权限
GRANT SUPER ON *.* TO 'u_mydumper'@'%';
FLUSH PRIVILEGES;
二、分场景备份与恢复实操
2.1 单库备份与恢复
适用于仅需备份部分业务数据库的场景,避免备份无关数据占用存储空间。
- 单库备份:备份
bak1库到指定目录
mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1 -o ./bak1 # -B指定数据库,-o指定输出目录
- 单库恢复:恢复到新库
bak1_recover(避免覆盖原库)
myloader -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1_recover -d ./bak1/ # -d指定备份文件目录
2.2 单表 / 多表备份与恢复
精准备份指定表,适用于表级数据迁移或局部数据备份场景。
- 单表备份:备份
bak1库中t1表
mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -T bak1.t1 -o ./bak1_t1 # -T指定"库.表"格式
- 多表备份:同时备份
bak1库的t1和t2表
mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -T bak1.t1,bak1.t2 -o ./bak1_t1_t2
- 表恢复关键注意事项:
- 目标库中不能存在同名表,否则恢复失败,需提前删除:
DROP TABLE IF EXISTS bak1_recover.t1; # 先删除目标表
- 执行恢复命令:
myloader -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1_recover -d ./bak1_t1/
2.3 全库备份与恢复
适用于服务器迁移、灾难恢复等场景,需注意过滤无用系统库。
- 全库备份:备份所有数据库(含系统库)
mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -o ./all_databases
- 过滤系统库备份:仅备份业务库(排除 mysql、test 等)
mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock --regex '^(?!(mysql\.|test\.))' -o ./business_databases
- 全库恢复:恢复所有数据库到目标服务器
myloader -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -d ./all_databases/
2.4 正则表达式高级过滤
通过--regex参数实现复杂备份规则,满足个性化需求。
- 仅备份
mysql和test库:
mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock --regex '^(mysql\.|test\.)' -o ./only_mysql_test
- 排除以
bak开头的库:
mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock --regex '^(?!(bak))' -o ./no_bak_databases
- 仅备份
bak1库中以t开头的表:
mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock --regex '^bak1\.t' -o ./bak1_t_tables
2.5 性能优化:自定义线程数备份
mydumper 默认使用 4 线程备份,可根据服务器 CPU 核心数调整-t参数,提升备份效率(避免线程数超过 CPU 核心数导致资源竞争)。
# 8线程备份bak1库(适合4核以上服务器)
mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -t 8 -B bak1 -o ./bak1_8_threads
2.6 空间优化:压缩备份与恢复
开启压缩备份可大幅节省磁盘空间,尤其适合远程备份或存储紧张场景。
- 压缩备份:通过
--compress参数生成.gz 格式备份文件
mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1 --compress -o ./bak1_compressed
- 压缩恢复:myloader 自动识别压缩文件,无需手动解压
myloader -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1_recover_compressed -d ./bak1_compressed/
三、常见问题与解决方案
- 恢复时提示 “Missing SUPER privilege”:
- 原因:备份用户缺少 SUPER 权限,无法执行系统级操作(如创建日志表)。
- 解决:授予 SUPER 权限(参考本文第一部分权限配置)。
- 恢复表时提示 “Table already exists”:
- 原因:目标库中已存在同名表,mydumper 默认不覆盖。
- 解决:提前删除目标表(参考 2.2 节表恢复注意事项)。
- 备份速度慢或服务器负载高:
- 原因:线程数设置不合理,或备份时未避开业务高峰期。
- 解决:降低线程数(如
-t 2),在凌晨等低峰期执行备份。
总结
mydumper 凭借灵活的备份策略、高效的多线程机制和丰富的参数配置,成为 MySQL 数据库备份的优选工具。本文覆盖了从单表到全库、从基础备份到高级过滤的核心用法,建议根据实际场景组合使用(如 “压缩 + 多线程 + 正则过滤”),既保证备份效率,又节省存储成本。运维过程中需定期测试恢复流程,确保备份数据可用,真正做到 “有备无患”。



