当前位置: 首页 > news >正文

多线程逻辑备份工具 mydumper 全方位解析:备份恢复原理与实战用法

在数据库运维工作中,数据备份与恢复是保障数据安全的核心环节。对于 MySQL 数据库而言,传统的单线程备份工具如 mysqldump 在面对大规模数据时,往往存在备份效率低、耗时久等问题。而 mydumper 作为一款高性能的多线程逻辑备份工具,凭借其多线程并发能力、数据一致性保障及灵活的备份策略,成为了数据库运维人员的得力助手。本文将从 mydumper 的特点出发,详细讲解其安装、实验环境准备、备份与恢复操作及原理,并拓展更多实用用法,帮助读者全面掌握该工具。

1 mydumper 的备份和恢复原理

1.1 mydumper 的核心特点

mydumper 之所以能在众多备份工具中脱颖而出,主要得益于以下三大核心优势:

  • 多线程并发备份:备份过程中可开启多个线程,不同线程负责备份不同的表,大幅提升备份速度,尤其适用于包含大量表的数据库场景。

  • 备份文件易管理:导出的表结构与数据分开存储(通常表结构文件以 .sql 结尾,数据文件以 .txt 或其他格式存储),方便后续查看、解析及单表恢复。

  • 数据一致性保障:通过事务机制(InnoDB 引擎)和全局读锁(MyISAM 引擎)确保备份数据的一致性,避免因备份过程中数据写入导致的备份文件损坏。

1.2 mydumper 安装步骤

以 CentOS 7 系统为例,mydumper 的安装流程如下,操作前需确保服务器已联网:

  1. 下载 mydumper 安装包

    从 GitHub 官方仓库获取对应版本的 RPM 包(此处以 v0.14.5-2 版本为例):

cd /usr/src/
wget https://github.com/mydumper/mydumper/releases/download/v0.14.5-2/mydumper-0.14.5-2.el7.x86_64.rpm
  1. 安装 mydumper

    使用 yum 命令安装,yum 会自动处理依赖关系:

yum install mydumper-0.14.5-2.el7.x86_64.rpm -y
  1. 验证安装结果

    执行以下命令,若能显示帮助信息,则说明安装成功:

mydumper --help

1.3 实验环境准备

在进行备份与恢复测试前,需完成以下环境配置,确保操作顺利进行:

1.3.1 创建备份专用用户

为避免使用 root 账号直接操作,建议创建具有最小权限的备份用户(此处用户名为 u_mydumper,密码为 Ud8agc_a):

-- 创建用户create user u_mydumper@'%' identified WITH mysql_native_password BY 'Ud8agc_a';-- 授予必要权限(备份需锁定表、查询数据等权限)grant create,insert,select,reload,process,lock tables,replication client,replication_slave_admin,show view,trigger,backup_admin on *.* to 'u_mydumper'@'%';
1.3.2 开启 General Log(可选)

General Log 可记录数据库的所有操作,便于排查备份过程中的问题,开启命令如下:

set global general_log=on;-- 查看 General Log 存储路径(默认路径可能为 /var/lib/mysql/主机名.log)show variables like 'general_log_file';
1.3.3 创建备份目录

为备份文件创建专用目录,便于管理(此处目录路径为 /data/backup/mydumper_bak):

cd /data/backup/mkdir mydumper_bak

1.4 实战:使用 mydumper 进行备份

1.4.1 执行备份命令

以备份 bak1 数据库为例,使用 u_mydumper 用户执行备份,备份文件存储至 /data/backup/mydumper_bak/bak1 目录:

mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1 -o ./mydumper_bak/bak1
  • 参数说明:

    • -u:指定数据库用户名;

    • -p:指定用户密码;

    • -S:指定 MySQL 套接字文件路径(默认路径为 /tmp/mysql.sock);

    • -B:指定待备份的数据库名;

    • -o:指定备份文件输出目录。

1.4.2 查看备份文件

备份完成后,进入输出目录查看文件结构,典型的备份文件包括:

  • 数据库创建语句文件(如 bak1-schema-create.sql);

  • 表结构文件(如 bak1.t1-schema.sqlbak1.t2-schema.sql);

  • 表数据文件(如 bak1.t1.sqlbak1.t2.sql);

  • 备份元信息文件(如 metadata,记录备份时间、GTID 等信息)。

cd mydumper_bak/bak1ll  # 列出目录下所有文件
1.4.3 分析备份过程的 General Log

通过 General Log 可观察 mydumper 的备份细节,关键操作片段如下(截取部分日志):

2025-09-28T01:53:50.918445Z   73 Query  FLUSH NO_WRITE_TO_BINLOG TABLES  -- 刷新表到磁盘2025-09-28T01:53:50.919330Z   73 Query  FLUSH TABLES WITH READ LOCK     -- 加全局读锁2025-09-28T01:53:50.921658Z   76 Connect u_mydumper@localhost on  using Socket  -- 创建子线程2025-09-28T01:53:50.927031Z   75 Query  START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */  -- 开启事务2025-09-28T01:53:50.943731Z   74 Query  SELECT /*!40001 SQL_NO_CACHE */ * FROM `bak1`.`t1`  -- 读取表数据2025-09-28T01:53:50.949371Z   73 Query  UNLOCK TABLES /* FTWRL */  -- 释放全局读锁

1.5 mydumper 备份原理深度解析

结合上述实验与日志分析,mydumper 的备份流程可拆解为以下 6 个关键步骤,确保效率与一致性兼顾:

  1. 刷新表数据到磁盘:执行 FLUSH NO_WRITE_TO_BINLOG TABLES,将所有打开的表的脏页刷新到磁盘,避免内存数据未持久化导致备份不完整。

  2. 加全局读锁:主线程执行 FLUSH TABLES WITH READ LOCK,防止备份过程中其他会话修改数据(MyISAM 表依赖此锁保障一致性,InnoDB 表后续通过事务快照避免锁阻塞)。

  3. 创建子线程并初始化事务:默认创建 4 个子线程(可通过 -t 参数调整线程数),每个子线程设置事务隔离级别为 REPEATABLE READ(RR) 并开启事务,获取一致性快照。

  4. 获取元信息与表结构:子线程分别查询数据库的 GTID 信息、binlog 位点,以及各表的建表语句,存储至对应的 schema 文件。

  5. 多线程并发读取数据:不同子线程通过 SELECT /*!40001 SQL_NO_CACHE */ * FROM 表名 语句读取不同表的数据,避免使用缓存提升效率,并将数据写入对应的数据文件。

  6. 释放锁并结束线程:所有表备份完成后,主线程释放全局读锁(UNLOCK TABLES),子线程提交事务并退出,备份任务完成。

1.6 实战:使用 myloader 进行恢复

mydumper 配套的恢复工具为 myloader,支持多线程恢复,操作流程如下:

1.6.1 创建恢复目标库

首先在目标数据库服务器上创建用于恢复的数据库(此处库名为 bak1_recover):

create database bak1_recover;
1.6.2 执行恢复命令

使用 myloader 从备份目录 /data/backup/mydumper_bak/bak1 恢复数据到 bak1_recover 库:

myloader -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1_recover -d ./mydumper_bak/bak1/
  • 关键参数说明:

    • -B:指定恢复的目标数据库名;

    • -d:指定备份文件所在的目录。

1.6.3 验证恢复结果

恢复完成后,登录数据库查询目标库的表结构与数据,确认是否与原库一致:

use bak1_recover;show tables;  -- 查看表是否存在select * from t1;  -- 查看表数据是否完整

1.7 myloader 恢复原理解析

myloader 的恢复流程与 mydumper 的备份流程相呼应,同样通过多线程提升效率,核心步骤如下:

  1. 初始化恢复线程:创建多个子线程(默认与备份线程数一致),并切换到目标恢复数据库(USE bak1_recover)。

  2. 多线程创建表结构:不同子线程分别执行备份文件中的表结构语句(如 CREATE TABLE),确保表结构先于数据创建。

  3. 开启事务并写入数据:每个子线程针对不同的表开启事务,执行 INSERT 语句将备份数据写入目标表,避免单条插入导致的性能问题。

  4. 提交事务:单个表的数据写入完成后,子线程提交事务,确保数据持久化。

  5. 收尾与退出:所有表恢复完成后,子线程退出,恢复流程结束。

2 mydumper 的备份和恢复更多实用用法

除了基础的全库备份与恢复,mydumper 还支持多种灵活的备份策略,满足不同场景需求:

2.1 单库 / 多库备份与恢复

2.1.1 单库备份(已在 1.4 节演示)
# 备份 bak1 库到 ./bak1 目录mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1 -o ./bak1
2.1.2 单库恢复(已在 1.6 节演示)
# 恢复到 bak1_recover 库myloader -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1_recover -d ./bak1/

2.2 单表 / 多表备份与恢复

2.2.1 单表备份

备份 bak1 库中的 t1 表,输出到 ./bak1_t1 目录:

mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -T bak1.t1 -o ./bak1_t1
2.2.2 多表备份

同时备份 bak1 库中的 t1t2 表:

mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -T bak1.t1,bak1.t2 -o ./bak1_t1_t2
2.2.3 表恢复注意事项

恢复表时,需确保目标库中不存在同名表(否则会报错),若已存在需先删除:

-- 先删除目标库中的 t1 表drop table if exists bak1_recover.t1;-- 恢复 t1 表myloader -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1_recover -d ./bak1_t1/

常见报错处理:若恢复时出现 “Missing SUPER privilege” 错误,需为备份用户授予 super 权限:

grant super on *.* to u_mydumper@'%';

2.3 全库备份与恢复

2.3.1 全库备份

备份 MySQL 服务器上的所有数据库(不包含系统库时需配合 --regex 过滤):

mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -o ./all_databases
2.3.2 全库恢复

恢复所有数据库到目标服务器(需确保目标服务器无同名库,或已提前删除):

myloader -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -d ./all_databases/

2.4 按正则表达式过滤备份

通过 --regex 参数可灵活过滤需要备份的数据库或表,适用于复杂场景:

2.4.1 排除指定库(如 mysql、test)

备份除 mysqltest 外的所有库:

mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock --regex '^(?!(mysql\.|test\.))' -o ./no_mysql_test
2.4.2 仅备份指定库(如 mysql、test)

仅备份 mysqltest 库:

mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock --regex '^(mysql\.|test\.)' -o ./only_mysql_test
2.4.3 排除以特定前缀命名的库(如 bak 开头的库)

备份所有不以 bak 开头的库:

mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock --regex '^(?!(bak))' -o ./no_bak_databases

2.5 自定义线程数备份

默认情况下,mydumper 使用 4 个线程备份,可通过 -t 参数调整线程数(需根据服务器 CPU 核心数合理设置,避免资源过载):

# 使用 8 个线程备份 bak1 库mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -t 8 -B bak1 -o ./bak1_8_threads

2.6 压缩备份与恢复

为节省磁盘空间,可开启压缩备份(通过 --compress 参数),备份文件会以 .gz 格式存储:

2.6.1 压缩备份
mydumper -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1 --compress -o ./bak1_compressed
2.6.2 压缩恢复

myloader 会自动识别压缩文件并解压恢复,无需额外操作:

myloader -u 'u_mydumper' -p 'Ud8agc_a' -S /tmp/mysql.sock -B bak1_recover_compressed -d ./bak1_compressed/

总结

mydumper 作为一款高性能的多线程 MySQL 备份工具,不仅解决了传统工具备份效率低的问题,还通过事务与锁机制保障了数据一致性,同时提供了丰富的过滤与自定义功能,满足不同场景下的备份需求。本文从原理到实战,详细讲解了 mydumper 的安装、备份恢复流程及高级用法,希望能为数据库运维人员提供实用的参考,帮助大家更高效地完成数据备份与恢复工作,保障业务数据安全。

在实际生产环境中,建议结合定时任务(如 crontab)实现 mydumper 的自动化备份,并定期验证恢复流程,确保备份文件可用,真正做到 “有备无患”。

http://www.dtcms.com/a/428454.html

相关文章:

  • C++ 运算符重载与友元:实现优雅直观的类操作
  • 开源外贸网站升降平台找企汇优做网站推广
  • 汽车之家 网站建设网站设计的风格有哪些
  • Windows上部署FTP详解
  • 沙河做网站重庆丰都建设局网站
  • 企业网站建设情况汇报网页设计费用明细
  • 集群服务器架构学习计划
  • YOLO入门教程(番外):计算机视觉—图像增广
  • 学院网站建设项目的活动分解沟通交流类网站有哪些
  • 吕梁建站公司大连网站制作公司
  • 吉安网站推广软文营销定义
  • web前端团队开发code review方案最佳实践
  • 张槎网站建设企业网站建设与管理作业
  • 网站找什么公司做网站开发的难点
  • Android Studio | 设置国内代理(SDK 设置国内代理(阿里云镜像))
  • 怎么注销建设银行网站用户名设计网站费用多少
  • 【更新至2024年】1999-2024年上市公司数字化转型程度数据(含原始数据+计算代码+结果)
  • 优化网站建设哪家专业wordpress tag 别名
  • Android 常见界面布局详解
  • 4-创建索引和约束
  • 百度竞价网站永久免费网站虚拟主机
  • 做商城网站的广州站电话
  • 中小企业网站制作方法建网页和网站的区别
  • 【星海出品】cache和程序性能
  • 国外设计网站建站之星怎么收费
  • 网站建设的服务怎么样做网站必须要购买域名
  • 【武大杨景媛事件全过程】免费分享
  • 江苏001
  • 5分钟掌握现代C++多执行策略:基于DAG的任务调度系统
  • UFrame:面向规模化 Unity 项目的工程化框架