首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL 数据库如何使用 mydumper 和 myloader 数据快速备份和迁移

MySQL 数据库如何使用 mydumper 和 myloader 数据快速备份和迁移

原创
作者头像
Mintimate
发布于 2025-07-26 15:08:44
发布于 2025-07-26 15:08:44
20921
代码可运行
举报
文章被收录于专栏:Mintimate's BlogMintimate's Blog
运行总次数:1
代码可运行

博客:https://www.mintimate.cn Mintimate’s Blog,只为与你分享

当我们需要备份或者迁移大量 MySQL 数据时,可以使用 mydumper 和 myloader 工具进行快速备份和迁移。尤其是跨服务器迁移或者是本地数据库上云的时候,更快速地且稳定地完成数据迁移

相比 MySQL/MariaDB 自带的 mysqldump(mariadump) 工具,mydumper 和 myloader 更加高效,且支持多线程备份和多线程恢复,可以大大缩短备份和迁移的时间

别再打开 DBeaver、Navicat 或者 DataGrip 等数据库管理工具来两库对拷了

哈哈,应该有不少人是这样做的吧 ~
哈哈,应该有不少人是这样做的吧 ~

mydumper

mydumper 开源的 MySQL 数据库逻辑备份工具,GitHub 开源地址:mydumper/mydumper。包含两个组件:

  • mydumper: 负责导出 MySQL 数据库的一致性备份。
  • myloader: 读取 mydumper 生成的备份文件,连接目标数据库并执行导入.

相比于 MySQL 自带的 mysqldump 工具,主要的优势:

  • 多线程处理: 支持多线程备份,备份速度更快;同时使用事务快照,减少锁争用,降低对生产环境的影响。
  • 配置灵活: 支持正则表达式过滤表,支持压缩备份,支持长查询处理,支持导出 CSV 文件等。

效果演示

举个例子,我这里有一个使用 MariaDB 官方 Docker 镜像部署的数据库。数据量大概有 300 万条记录,大小 2.5G 左右。MariaDB 的镜像是基于 Ubuntu 24 的:

MariaDB 数据库 Docker 镜像
MariaDB 数据库 Docker 镜像

直接安装:

代码语言:bash
AI代码解释
复制
# 进入容器
docker exec -it mariadb /bin/bash
# 更新软件包
apt update && apt upgrade -y
# 安装 wget 用来下载 mydumper
apt install wget -y
# 下载 mydumper
wget https://github.com/mydumper/mydumper/releases/download/v0.19.1-3/mydumper_0.19.1-3.bookworm_amd64.deb
# 安装 mydumper
apt install ./mydumper_0.19.1-3.bookworm_amd64.deb
# 查看 mydumper 版本
mydumper --version

然后全数据库(剔除系统和测试库)全量备份,使用如下命令:

代码语言:bash
AI代码解释
复制
mydumper -u root -p '@******#' -t 4 --compress --regex '^(?!(mysql\.|sys\.|test\.))' -o /var/backups/fullMariaDB -v 3

大概解释以下命令构成,在没有指定远程地址情况默认为本地数据库:

  • -t 4: 使用 4 个线程进行备份。
  • --compress: 使用 gzip 压缩备份文件。
  • --regex '^(?!(mysql.|sys.|test.))': 使用正则表达式过滤表,只备份除了 mysql、sys、test 之外的表。
  • -o /var/backups/fullMariaDB: 备份文件输出到 /var/backups/fullMariaDB 目录下。
  • -v 3: 输出详细日志,包括成功的 info 级别日志。
mydumper 全量备份
mydumper 全量备份

腾讯云的轻量数据库,性能比 Docker 容器好很多,而且不需要我关注云备份和灾备;所以我想把备份文件迁移到腾讯云的轻量数据库上:

腾讯云轻量数据库
腾讯云轻量数据库

使用配套的 myloader 工具,将备份文件导入到腾讯云的轻量数据库上:

代码语言:bash
AI代码解释
复制
myloader -u root -p '4**********O' -h 10.0.4.15 -o --regex '^(?!(mysql\.|sys\.|test\.))' -d /var/backups/fullMariaDB -v 3

相比备份时候使用的mydumper,这次添加-h参数,指定远程地址:

  • -h 10.0.4.15: 指定远程地址为腾讯云轻量数据库的 IP 地址。
  • -d /var/backups/fullMariaDB: 指定备份文件目录。
  • -o: 如果目标数据库已经存在,那么进行覆盖。
数据迁移完成
数据迁移完成

视频教程

为了让大家更直观地了解如何使用 mydumper 和 myloader 进行数据迁移,我录制了一个视频教程,希望能帮助到大家。

主要内容:

  • Mydumper 的操作前提;
  • Mydumper 全量逻辑迁移演示;
  • Mydumper 高级用法概要。

做教程视频不易(技术教程,受众小,B站根本不会推荐引流),请务必<strong>一键三连</strong>嗷~

如何安装

安装方法非常简单。Ubuntu 的软件包管理器可以直接下载(但是可能版本比较旧)。其他系统可以在 Mydumper 的 Release 内下载dpkgrpm包安装:

mydumper 安装包
mydumper 安装包

比如: 在 Debian 12 上安装 mydumper 0.19.1-3:

代码语言:bash
AI代码解释
复制
# 下载 AMD64 版本的 mydumper
wget https://github.com/mydumper/mydumper/releases/download/v0.19.1-3/mydumper_0.19.1-3.bookworm_amd64.deb
# 安装
apt install ./mydumper_0.19.1-3.bookworm_amd64.deb
# 查看版本
mydumper --version

如果是在 macOS 上使用,可以使用 Homebrew 安装:brew install mydumper

另外,如果你的数据库是远程地址,本地没有 MySQL 的客户端;那么其实更建议拉取一个基于 MySQL 的 Docker 镜像并安装 mydumper;

最后备份的数据可以直接用 myloader 导入其他 MySQL 内,也可以直接用 docker cp 取出:

使用方法

权威的使用方法,可以参考:

比较重要的参数:

参数

说明

参数

说明

-h, --host

数据库主机地址

-u, --user

数据库用户名

-p, --password

数据库密码

-P, --port

数据库端口

-S, --socket

UNIX域套接字文件

-o, --outputdir

输出目录

-t, --threads

线程数(默认4)

-v, --verbose

输出详细程度,0: 无输出, 1: 错误, 2: 警告, 3 = 详细, 默认 2

-B, --database

指定数据库(逗号分隔)

-T, --tables-list

指定表(逗号分隔)

-x, --regex

正则匹配db.table格式

--where

WHERE条件过滤数据

-i, --ignore-engines

忽略的存储引擎

-O, --omit-from-file

从文件读取忽略列表

-F, --chunk-filesize

分割文件大小(MB)

-r, --rows

按行数分割表数据

-c, --compress

压缩格式(GZIP/ZSTD)

-l, --long-query-guard

查询超时时间(秒)

-m, --no-schemas

不备份表结构

-d, --no-data

只备份结构

-x, --regex

正则匹配需要备份的表

--partition-regex

正则匹配需要备份的分区

这里主要说一下使用场景,假设都是本地数据库,端口 3306:

代码语言:bash
AI代码解释
复制
# 备份指定表(指定数据库和表)
mydumper -u root -p Mintimate -B db1 -T tb1,tb2 -o /var/backups/
# 只备份表结构
mydumper -u root -p Mintimate -d -B db1 -o /var/backups/
# 不转储 mysql、sys 和 test 数据库(迁移常用)
mydumper -u root -p Mintimate --trx-tables --regex '^(?!(mysql\.|sys\.|test\.))' -o /var/backups/
# 仅转储 mysql 和 test 数据库
mydumper -u root -p Mintimate --trx-tables --regex '^(mysql\.|test\.)' -o /var/backups/
# 不转储以 test 开头的所有数据库
mydumper -u root -p Mintimate --trx-tables --regex '^(?!(test))' -o /var/backups/
# 转储不同数据库中的特定表
mydumper -u root -p Mintimate --trx-tables --regex '^(edumsdb\.el_edums_data_push_config$|externaldb\.authorization_token_info$)' -o /var/backups/
# 转储几个数据库,但要丢弃一些表
mydumper -u root -p Mintimate --trx-tables --regex '^(?=(?:(edumsdb\.|externaldb\.)))(?!(?:(edumsdb\.el_edums_data_push_config$|externaldb\.authorization_token_info$)))' -o /var/backups/

对应的 myloader 恢复命令:

代码语言:bash
AI代码解释
复制
# 恢复制定数据库
myloader -u root -p Mintimate -s db1 -o -d /var/backups/
# 恢复指定数据库到制定数据库
myloader -u root -p Mintimate -s db1 -B db_target -o -d /var/backups/
# 恢复指定数据库的表到制定据库内
myloader -u root -p Mintimate -s db1 -T db1.tb1,db1.tb2 -B db_target -o -d /var/backups/
# 全量恢复
myloader -u root -p Mintimate -o -d /var/backups/
# 全量结构恢复
myloader -u root -p Mintimate -o --no-data -d /var/backups/
# 使用正则排除制定数据库
myloader -u root -p Mintimate -o --regex '^(?!(mysql\.|sys\.|test\.))' -d /var/backups/

比如: 恢复 umami 数据库内的 website 表结构到远程服务器上的 umami_mirror 数据库内:

myloader 恢复指定表结构
myloader 恢复指定表结构

END

本文主要介绍了如何使用 mydumper 和 myloader 工具进行数据库的备份和恢复,以及如何使用 mydumper 进行增量备份。

另外,如果有小伙伴出现 MariaDB 迁移到 MySQL 8.x,遇到: Variable 'sql_mode' can't be set to the value of 'NO_AUTO_CREATE_USER'。这是因为 MySQL 8.x 移除了NO_AUTO_CREATE_USER。你可以执行这段来修复:

代码语言:bash
AI代码解释
复制
find /var/backups/fullMariaDB/ -type f -name "*.sql" -print0 | xargs -0 sed -i "s/NO_AUTO_CREATE_USER,//g"

希望本文能帮助到大家,如果大家有更好的方法,欢迎留言交流。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
2 条评论
热度
最新
比如这样写:func NewBSTree[V myComparable | constraints.Ordered]() *BSTree[V] {}
比如这样写:func NewBSTree[V myComparable | constraints.Ordered]() *BSTree[V] {}
回复回复点赞举报
一般泛型接口和基本泛型接口,草案出处是哪里?还是你自己提出的概念?另外,这两个东西并不是一样的东西,他们在泛型参数列表里面不能共用,interface 和 类型约束还是有区别的,比如我需要一个可以排序的 node,既要支持 constraints.Ordered 又要支持自定义类型并实现接口 myComparable 的 lessThan(myComparable) bool 方法,此时就会报出编译器 InvaildUnion 错误
一般泛型接口和基本泛型接口,草案出处是哪里?还是你自己提出的概念?另外,这两个东西并不是一样的东西,他们在泛型参数列表里面不能共用,interface 和 类型约束还是有区别的,比如我需要一个可以排序的 node,既要支持 constraints.Ordered 又要支持自定义类型并实现接口 myComparable 的 lessThan(myComparable) bool 方法,此时就会报出编译器 InvaildUnion 错误
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
golang泛型基本用法
作者:matrix 被围观: 14 次 发布时间:2025-05-31 分类:Golang | 无评论 »
HHTjim 部落格
2025/06/01
1350
GO语言之泛型应用
在之前都未接触过泛型,在之前偶然听别人提及过泛型这东西,所以就学习总结一下go的泛型使用
阿珍
2025/07/08
980
GO语言之泛型应用
Go的代码规范指南-新人必看
环境设置:*nix环境或者Mac环境,安装go语言目录,默认是usr/local/go,如果想要让代码运行,需要将项目放到usr/local/go/src目录下,如果忘记了go的配置目录,可以通过go env查看go的环境变量设置。如果不希望每次使用sudo权限执行,可以通过设置用户目录下创建~/.bashrc文件,增加 用户目录的环境变量设置比如
小诚信驿站
2019/10/01
1.9K0
Go的代码规范指南-新人必看
理解Golang的泛型
为降低interface{}带来的糟糕阅读体验,新增了any关键字,它实际上是一种语法糖,定义如下:
chandlerpan
2022/07/12
1.6K0
搞懂Go泛型,看这一篇就够了
在Go语言1.17版本及后续的升级迭代中,泛型新特性无疑是非常重大的一次更新,这个特性的引入无疑为开发者们带来了更多的灵活性和代码复用性。虽然大部分功能不使用泛型也能正常实现,但是泛型带来的灵活性和效率值得我们进行学习和掌握,这篇文章就和大家一下讨论下Go语言的泛型。
闫同学
2025/01/20
4290
Go 1.18泛型的局限性初探
Go 1.18 版本之后正式引入泛型,它被称作类型参数(type parameters),本文初步介绍 Go 中泛型的使用。长期以来 go 都没有泛型的概念,只有接口 interface 偶尔类似的充当泛型的作用,然而接口终究无法满足一些基本的泛型需求,比如这篇文章里,我们会尝试用 Go 的泛型循序渐进地实现一些常见的函数式特性,从而探索 Go 泛型的优势和不足。
yoyofx
2022/05/11
7460
终于!12年后Golang支持泛型了!(内含10个实例)
导语 | 泛型是一些语言的标配,可以极大地便利开发者,但Golang在之前并不支持泛型。在今年的Go1.17中已经发布了泛型的体验版,这一功能也是为1.18版本泛型正式实装做铺垫。本文将介绍一下泛型在Golang的使用样例及其泛型的发展历史,需要体验的同学可以使用:https://go2goplay.golang.org/或者自行在docker中安装版本。 一、泛型 (一)什么是泛型 谈泛型的概念,可以从多态看起,多态是同一形式表现出不同行为的一种特性,在编程语言中被分为两类,临时性多态和参数化多态。
腾讯云开发者
2021/11/09
2.9K0
Go 泛型
但这个函数只能接收[]int类型的参数,如果我们想支持[]float64类型的参数,我们就需要再定义一个reverseFloat64Slice函数。
f1sh
2024/07/31
1280
GO语言学习笔记
Go和Golang是什么关系? Go语言于2009年11月正式宣布推出,成为开放源代码项目,全称:"Go Programming Language",简称Go,由于2003年出现了一个叫 Go!的编程语言,Go名称与其雷同,为了方便搜索和识别,有时会将其称为Golang,通常区块链行业Go开发,其实就是Golang开发。 Go语言的特点 Go是Google开发的一种静态强类型,编译型、并发型,并具有垃圾回收功能的编程语言。 Go语言的主要的功能在于简单易用的并行设计,Go发明了goroutine概念,一个G
rectinajh
2018/05/17
1.1K1
go1.17 泛型尝鲜
语法格式如下, 需要使用 [T Ttype] 指定约束条件, 例如 [T any] 不做任何约束, [T MyInterface] 满足 MyInterface 的约束
老麦
2022/12/24
2360
深入理解Golang的泛型
2022年3月15日,争议非常大但同时也备受期待的泛型终于伴随着Go1.18发布了。
KunkkaWu
2023/07/12
1.6K0
深入理解Golang的泛型
深入浅出Go泛型之泛型使用三步曲
大家好,我是渔夫子,又跟大家见面了。今天跟大家聊聊Go1.18中新增的泛型功能。。
Go学堂
2023/01/31
8240
因势而变,因时而动,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang泛型(generic)的使用EP15
    事实上,泛型才是Go lang1.18最具特色的所在,但为什么我们一定要拖到后面才去探讨泛型?类比的话,我们可以想象一下给小学一年级的学生讲王勃的千古名篇《滕王阁序》,小学生有多大的概率可以理解作者的青云之志以及壮志难酬的愤懑心情?恐怕很难罢,是的,如果对Go lang的强类型语法没有一段时间的体验期,就很难理解泛型这种“反”静态语言概念。
用户9127725
2022/09/23
3330
因势而变,因时而动,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang泛型(generic)的使用EP15
Golang 基础之基础语法梳理 (三)
接口 (interface) 定义了一个对象的行为规范, 只定义规范不实现,由具体的对象来实现规范的细节。
帽儿山的枪手
2022/03/20
5890
Golang 基础之基础语法梳理 (三)
Go1.13-1.20语言特性
Go 遵循每 6 个月发布一个大版本的规律,最新版本是 Go1.20发布于 2023/01/01 Go 的每个版本围绕 “语言特性”,“工具链”,“Runtime”,“Compiler”, “Linker”, “Library” 这几个方面进行大量的迭代。 由于内容很多,本文打算总结研发过程中可能会关注到语言特性的改进,并使用一些case 对新的语言特性进行解释。
COY_fenfei
2023/06/12
1.1K0
Go1.13-1.20语言特性
Go 中的泛型:激动人心的突破
在我们选择的编程语言中,我们多长时间会经历一次根本性的变化?有些语言会变化得更频繁一些,但还有些语言会比温布尔登更保守。
深度学习与Python
2022/04/19
5290
什么是go中的泛型
泛型是go在1.18版本引入的新特性,泛型的引入使得在某些场景下,可以极大的简化代码的编写,提高了代码的复用性。有必要掌握泛型,可以减少很多重复的代码。
科技新语
2024/06/17
2770
什么是go中的泛型
Golang 反射
在Go语言中,大多数时候值/类型/函数非常直接,要的话,定义一个。你想要个Struct
李海彬
2019/03/07
9850
Golang 反射
Go 语言泛型使用详解
Go v1.18 开始支持泛型,距离 Go 当前版本 v1.23 已经迭代了 5 个大版本了。读者朋友们在使用 Go 语言开发时,是否已经习惯使用泛型了呢?
frank.
2024/11/19
2890
Go 语言泛型使用详解
Go语言进阶:类型推断、类型断言与泛型的深入探索
Go语言作为一种静态类型语言,通过类型推断、类型断言以及泛型,为开发者提供了灵活且强大的类型处理能力。
windealli
2024/03/14
1.8K0
Go语言进阶:类型推断、类型断言与泛型的深入探索
相关推荐
golang泛型基本用法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档