【MySQL备份】MySQL备份工具-MyDumper

目录

什么是MyDumper

MyDumper优势有哪些 

如何安装MyDumper

参数解释 

1 mydumper参数解释 

备份流程

一致性快照如何工作?

 如何排除(或包含)数据库?

输出文件

Metadata文件

​编辑

表数据 文件

表结构 文件

建库文件

总结 

使用示例

参考


原来一直使用mysqldump 和 xtrabackup对MySQL数据库进行逻辑备份和物理备份,最近在生产环境接触到了一种新的备份恢复工具 mydumper ,这里介绍总结一下自己的使用经验以及遇到的问题。

什么是MyDumper

MyDumper是一个MySQL逻辑备份工具。它有2个工具:

  • mydumper负责导出 MySQL 数据库的一致备份
  • myloader从 mydumper 读取备份,连接到目标数据库并导入备份。

这两个工具都使用多线程功能。

MyDumper优势有哪些 

  • 速度更快 - 多线程并发备份
  • 性能更好 - 避免昂贵的字符集转换,整体代码高效
  • 易于管理的输出文件 -(比如每个表都能生成单独的备份文件,备份的元数据信息文件metadata记录位点信息等等,便于查看/解析数据)
  • 备份一致性 - 维护所有线程的快照,提供准确的主从日志位置等
  • 可管理性高- 支持通过PRRE(正则表达式) 指定或者排除特定的库和表

什么是 PRRE

PCRE 是 "Perl Compatible Regular Expressions"(兼容 Perl 正则表达式)的缩写。它是一个正则表达式库,提供对正则表达式的支持,并且与 Perl 的正则表达式语法高度兼容。

如何安装MyDumper

这里介绍离线安装 ,生产服务器一般没有外网 

下载rpm 包地址 Tags · mydumper/mydumper · GitHub

centos 系统
# 下载rpm 
wget  https://github.com/mydumper/mydumper/releases/download/v0.15.2-6/mydumper-0.15.2-6.el7.x86_64.rpm

# 安装
rpm -ivh mydumper-0.15.2-6.el7.x86_64.rpm

安装完成之后会 mydumper 和 myloader都会被安装 

$ mydumper --version
mydumper v0.15.2-6, built against MySQL 5.7.43-47 with SSL support

$ myloader --version
myloader v0.15.2-6, built against MySQL 5.7.43-47 with SSL support

mydumper 与 MySQL版本对应关系?

参数解释 

,每个版本的参数略有差异,下面是针对版本 v0.15.2-6 进行的参数解释

1 mydumper参数解释 

长参数短参数参数解释
连接参数
--host-h连接的数据库服务器
--user-u需要特性权限的用户
--password-p用户的密码
--ask-password-a提示输入用户的密码
--port-PTCP/IP 端口
--socket-S用于连接的 UNIX 域套接字文件
--protocol用于连接的协议(tcp、socket)
--compress-protocol-C对 MySQL 连接使用压缩
--ssl使用 SSL 连接
--ssl-mode连接到服务器所需的安全状态:DISABLED、PREFERRED、REQUIRED、VERIFY_CA、VERIFY_IDENTITY
--key密钥文件的路径名
--cert证书文件的路径名
--ca证书颁发机构文件的路径名
--capath包含 PEM 格式的受信任 SSL CA 证书的目录的路径名
--cipher用于 SSL 加密的允许密码列表
--tls-version服务器允许哪些协议进行加密连接
匹配过滤参数
--regex-x'db.table' 匹配的正则表达式
--database-B需要备份的数据库
--ignore-engines-i要忽略的存储引擎的列表 ,逗号分隔
--where仅转储选定的记录
--updated-since-U使用 Update_time 仅转储最近 U 天内更新的表
--partition-regex按分区名称过滤的正则表达式。
--omit-from-file-O包含要跳过的数据库.表条目列表的文件,每行一个(在应用正则表达式选项之前跳过)
--tables-list-T要备份的表列表,以逗号分隔(不排除正则表达式选项)。 表名必须包含数据库名。 例如:test.t1,test.t2
锁参数
--tidb-snapshot-z使用 TiDB 快照
--no-locks-k不执行 临时共享读锁 ,警告⚠️:这将会导致非一致性备份
--use-savepoints使用 savepoints 来减少元数据锁的产生,需要 SUPER 权限
--no-backup-locks不使用 Percona 的 backup locks (备份锁)
--lock-all-tables对所有的表 LOCK TABLE,而不是使用FTWRL
--less-locking对于 InnoDB 存储引擎的表 最少的锁时间
--trx-consistency-only只有事务一致性
PMM参数
--pmm-path默认值为 /usr/local/percona/pmm2/collectors/textfile-collector/high-resolution
--pmm-resolution默认值较高
EXEC参数
--exec-threads与 --exec 一起使用的线程数量
--exec使用文件作为参数执行命令
--exec-per-thread设置将由 STDIN 接收并将 STDOUT 写入输出文件的命令
--exec-per-thread-extension使用 --exec-per-thread 时设置 STDOUT 文件的扩展名
长查询参数
--long-query-retries重新检查长查询 ,默认0 ,不糊重试
--long-query-retry-interval长查询检测的间隔 ,默认60秒
--long-query-guard-l设置长查询的时间阈值 ,默认60秒
--kill-long-queries-kkill 长查询
Job参数
--char-deep定义当主键是字符串时要使用的字符数
--char-chunk定义应将表拆分为多少部分。 默认情况下我们使用线程数量
--rows将表拆分为这么多行的块。 它可以是 MIN:START_AT:MAX。 MAX 可以为 0,表示没有限制。 如果查询时间少于 1 秒,则块大小将加倍;如果查询时间超过 2 秒,则块大小减半
--split-partitions将分区转储到单独的文件中。 此选项会覆盖分区表的 --rows 选项。
校验参数
--checksum-all-M转储所有对象的校验和
--data-checksums转储表与数据 校验和
--schema-checksums转储模式表和视图创建校验和
--routine-checksums转储触发器、函数和例程 校验和
备份对象参数
--no-schemas-m不备份表的数据库
--all-tablespaces-Y备份所有表空间
--no-data-d不备份表的数据
--triggers-G备份触发器。默认情况下不备份
--events-E备份事件。默认情况下不备份
--routines-R备份存储过程和函数。默认情况下不备份
--views-as-tables将视图作为表导出
--no-views-W不要备份视图
Statement参数
--load-data不创建 INSERT INTO 语句,而是创建 LOAD DATA 语句和 .dat 文件
--csv自动启用--load-data 并设置变量以 CSV 格式导出
--fields-terminated-by定义分割字段的字符。
--fields-enclosed-by定义包围字段的字符。 默认: ”
--lines-starting-by在每行的开头添加字符串。 使用 --load-data 时,它会添加到 LOAD DATA 语句中。 当使用它时,它也会影响 INSERT INTO 语句。
--lines-terminated-by在每行末尾添加字符串。 当使用 --load-data 时,它被添加到 LOAD DATA 语句中。 当使用它时,它也会影响 INSERT INTO 语句。
--statement-terminated-by这可能永远不会被使用,除非你知道你在做什么
--insert-ignore-N使用 INSERT IGNORE 备份行
--replace用 REPLACE 替换备份行
--complete-insert使用包含列名的完整 INSERT 语句
--hex-blob使用十六进制表示法转储二进制列
--skip-definer从 CREATE 语句中删除 DEFINER。 默认情况下,语句不被修改
--statement-size-s尝试的 INSERT 语句大小(以字节为单位),默认 1000000
--tz-utcSET TIME_ZONE='+00:00' 在转储顶部,允许在服务器具有不同时区的数据或数据在不同时区的服务器之间移动时转储 TIMESTAMP 数据,默认为使用 - -skip-tz-utc 禁用。
--skip-tz-utc不在备份文件上添加 SET TIMEZONE
--set-names设置名称,使用它需要您自担风险,默认二进制文件
Extra参数
--chunk-filesize-F将表分割成此输出文件大小的块。 该值以 MB 为单位
--exit-if-broken-table-found如果发现损坏的表则退出
--success-on-1146如果表不存在,则不增加错误计数并发出警告而不是错误
--build-empty-files-e即使表中没有可用数据也构建转储文件
--no-check-generated-fields与生成字段相关的查询不会被执行。如果您生成了列,则会导致恢复问题
--order-by-primary如果不存在主键,则按主键或唯一键对数据进行排序
--compress-c使用 /usr/bin/gzip 和 /usr/bin/zstd 压缩输出文件。 选项:GZIP 和 ZSTD。 默认值:GZIP
Daemon参数
--daemon-D后台运行
--snapshot-interval-I每个转储快照之间的间隔(以分钟为单位),需要 --daemon,默认 60
--snapshot-count-X快照数量,默认2
Application参数
--help-?显示帮助选项
--outputdir-o输出文件的目录
--stream一旦文件被写入,它将通过 STDOUT 流式传输。 自 v0.12.7-1 起,接受 NO_DELETE、NO_STREAM_AND_NO_DELETE 和 TRADITIONAL(默认值),如果未给出参数则使用
--logfile-L要使用的日志文件名,默认情况下使用 stdout
--disk-limits如果确定没有足够的磁盘空间,则设置暂停和恢复的限制。接受类似以下值:'<resume>:<pause>'(以 MB 为单位)。例如:100:500 将在只有 100MB 时暂停 免费,如果有 500MB 可用则恢复
--threads-t要使用的线程数,默认 4
--version-V显示程序版本并退出
--identifier-quote-character设置标识符引号字符,仅用于在 mydumper 上插入语句以及在 myloader 上分割语句。 使用 SQL_MODE 更改 CREATE TABLE 语句,可能的值有:BACKTICK 和 DOUBLE_QUOTE。 默认值:反引号
--verbose-v输出的详细程度,0 = silent, 1 = errors, 2 = warnings, 3 = info, default
--defaults-file使用特定的默认文件。 默认值:/etc/mydumper.cnf
--defaults-extra-file使用额外的默认文件。 这是在 --defaults-file 之后加载的,替换以前定义的值
--fifodir需要时将在其中创建 FIFO 文件的目录。 默认值:与备份相同

备份流程

 

备份过程主要步骤概括:

  1.  主线程 FLUSH TABLES WITH READ LOCK , 施加全局只读锁,以阻止 DML 语句写入,保证数据的一致性;
  2.  读取当前时间点的二进制日志文件名和日志写入的位置并记录在 metadata 文件中,以供即时点恢复使用;
  3.  N 个(线程数可以指定,默认是 4个)dump 线程 START TRANSACTION WITH CONSISTENT SNAPSHOT ; 开启读一致的事物;
  4.  dump non-InnoDB tables , 首先导出非事物引擎的表;
  5.  主线程 UNLOCK TABLES 非事物引擎备份完后,释放全局只读锁;
  6. dump InnoDB tables , 基于事物导出 InnoDB 表;
  7.  事物结束。

更详细的流程

1)该工具在–daemo模式下支持以守护进行形式启动,默认每60s进行一次备份。间隔时间由–snapshot-interval控制。

2)首先会创建一个MySQL服务的连接

3)然后在MySQL上执行show processlist,根据参数long-query-guard和kill-long-queries决定退出或杀掉长查询;

4)根据是否有–lock-all-tables,进行锁表:LOCK TABLE tn READ或者FLUSH TABLES WITH READ LOCK;然后执行START TRANSACTION;

5)创建4个备份表的子线程

6)创建1个work thread后,g_async_queue_pop(conf.ready);此时conf.ready为空需要sleep等待。

7)work线程执行:连接mysql;设置隔离级别RR;start transaction;g_async_queue_push(conf->ready,GINT_TO_POINTER(1));然后main函数的g_async_queue_pop挂住的地方可以唤醒了,继续创建线程或者向下走。

8)work线程接着执行:进入死循环,从队列里pop出任务job=(struct job *)g_async_queue_pop(conf->queue);,根据任务类型进行dump。这里的并行是根据表并行的。先备份非事务表,然后备份innodb表

9)最后等所有work线程完成非事务表备份后唤醒g_async_queue_pop(conf.unlock_tables);,执行UNLOCK TABLES解锁

10)事务结束
 

一致性快照如何工作?

这一切都是按照 MySQL 最佳实践和传统完成的:

  • 作为预防措施,服务器上运行长查询要么会中止备份 ,要么被杀死
  • 获取全局读锁(“FLUSH TABLES WITH READ LOCK”)
  • 读取各种元数据(“SHOW SLAVE STATUS”、“SHOW MASTER STATUS”)
  • 其他线程连接并建立快照(“START TRANSACTION WITH CONSISTENT SNAPSHOT”) ** 在 4.1.8 之前的版本中,它创建虚拟 InnoDB 表并从中读取。
  • 一旦所有工作线程宣布快照建立,主线程就会执行“UNLOCK TABLES” 并开始排队作业。

FLUSH TABLES WITH READ LOCK; 全局读锁 ,所有的表只能进行读,不能进行写;

START TRANSACTION WITH CONSISTENT SNAPSHOT; 这个语句的目的是在事务开始时创建一个一致性的数据库快照,通过MVCC机制确保在整个事务执行期间,事务看到的数据保持一致性。

 如何排除(或包含)数据库?

可以使用--regex功能,例如不转储mysql和测试数据库:

# 可以使用--regex功能,例如不备份 mysql 和 test 数据库: 
mydumper --regex '^(?!(mysql\.|test\.))'

# 仅备份 mysql 和 test 数据库:
mydumper --regex '^(mysql\.|test\.)'

# 不备份以 test 开头的所有数据库:
mydumper --regex '^(?!(test))'

# 转储不同数据库中的指定表
mydumper --regex '^(db1\.table1$|db2\.table2$)'

# 如果你想备份几个数据库但丢弃一些表,你可以这样做:
mydumper --regex '^(?=(?:(db1\.|db2\.)))(?!(?:(db1\.table1$|db2\.table2$)))'

输出文件

版本 mydumper 0.10.0

Metadata文件

当备份正在执行的时候会有文件 metadata.partial 生成,当备份顺利完成之后 重命名为 metadata。该文件中包含备份启动与完成的时间 ,主库二进制日志的文件与位点。

表数据 文件

每个表的文件都会写到单独的文件中,文件的命名如下 

database.table.sql(.gz|.zst)

如果使用了 --rows 选线,每个表的备份都会被分割成多个文件,文件后会有5个数字填充,格式如下 

database.table.chunk.sql(.gz|.zst)

表结构 文件

如果没有使用选项 --no-schemas ,每个表都会生成一个表结构的备份文件 格式如下

database.table-schema.sql(.gz|.zst)

建库文件

 database-schema-create.sql(.gz|.zst)

总结 

可能各个版本备份出来的文件命名稍有不同,从文件命名可以较为明显的看出该文件的内容,大致总结下文件命名规则如下:

  • dbname-schema-create.sql:建库语句。
  • dbname-schema-post.sql:包含事件、存储过程及函数创建语句(若存在则有该文件)。
  • dbname.tbname.metadata:记录这个表的行数。
  • dbname.tbname-schema.sql:此表的创建语句。
  • dbname.tbname-schema-triggers.sql:创建触发器语句(若该表存在触发器 则有此文件)。
  • dbname.tbname.sql:该表的插入数据语句(若该表为空 则不存在此文件)。
  • dbname.viewname-schema.sql:创建视图语句(只列举出视图字段)。
  • dbname.viewname-schema-view.sql:创建视图的真正语句。
  • metadata:记录开始及结束备份的时间以及二进制日志位置。

使用示例

参考

Github 

GitHub - mydumper/mydumper: Official MyDumper Project

 输出文件

mydumper备份工具介绍与使用 - 简书

备份原理图 

MySQL备份工具之mydumper

mydumper工作原理解析_51CTO博客_Mydumper

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/241032.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于YOLOv8深度学习的吸烟/抽烟行为检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

触发器和函数:让代码更接近数据

来源&#xff1a;艾特保IT 虹科干货丨触发器和函数&#xff1a;让代码更接近数据 原文链接&#xff1a;虹科干货 | 触发器和函数&#xff1a;让代码更接近数据 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 文章速览&#xff1a; 触发器和函数的基础知识 编写语言…

自己动手写编译器:使用 GoLex 实现 c 语言的词法解析

对编译器设计和开发而言&#xff0c;表明你能有效入门的证明就是你能做出一个针对 C 语言的编译器。完成了 C 语言编译器&#xff0c;你在编译原理领域里算是写出了第一个 hello world 程序。于是为了确认我们开发的 GoLex 功能完善&#xff0c;我们看看它是否能对 C 语言的语法…

广东省工业和信息化厅工业互联网处一行莅临科东软件考察调研

近日&#xff0c;广东省工业和信息化厅工业互联网处副处长郑华、广东省科学院智能制造研究所副所长曹永军等一行领导、专家莅临科东软件&#xff0c;就聚焦工业数字化转型&#xff0c;助推新型工业化高质量发展进行考察调研。 科东软件陪同郑华副处长一行参观科东软件展厅&…

【Anaconda】Ubuntu anaconda使用(新建环境、最小化安装Tensorflow)

Ubuntu anaconda使用&#xff08;新建环境、最小化安装Tensorflow&#xff09; 清华源地址&#xff1a; https://pypi.tuna.tsinghua.edu.cn/simplepip安装使用的时候&#xff0c; pip install xxx(库名) -i https://pypi.tuna.tsinghua.edu.cn/simple请先安装好anaconda&am…

leetcode对称二叉树(每日一题)

https://leetcode.cn/problems/symmetric-tree/description/ 今天我们在来个题目&#xff0c;对称二叉树&#xff0c;其实这道题的思路我觉得和那到判断两棵树是不是相同的题目很相似&#xff0c;写这个题目的思路还是递归&#xff0c;但是我们看这个题目的时候需要注意的一个…

【OpenVINO】使用OpenVINO实现 RT-DETR 模型 INT8量化推理加速

使用OpenVINO实现 RT-DETR 模型 INT8量化推理加速 1. 使用 OpenVINO 实现 RT-DETR 模型 INT8量化1.1 神经网络压缩框架 &#xff08;NNCF&#xff09;1.2 准备校准数据集1.2.1 下载COCO验证数据集1.2.2 Validator包装器1.2.3 转换用于量化的数据集 1.3 定义模型精度校验方法1.4…

盘点2023年低代码平台TOP10

盘点2023年低代码平台TOP10 1 什么是低代码平台2 十大低代码平台2.1 IVX2.2 简道云2.3 伙伴云2.4 企名片one2.5 明道云2.6 轻流2.7 速融云2.8 轻舟——网易2.9 钉钉宜搭2.10 腾讯云-微搭 1 什么是低代码平台 低代码平台是一种开发软件的方法&#xff0c;它可以通过简单的拖放和…

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含python、JS工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境 相关其它博客工程源代码下载其它资料下载 前言 本项目基于Keras框架&#xff0c;引入CNN进行模型训练&#xff0c;采用Dropout梯度下降算法&#xff0c;按比例…

【Docker】Docker的使用案例以及未来发展、Docker Hub 服务、环境安全、容器部署安全

作者简介&#xff1a; 辭七七&#xff0c;目前大二&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

【毕业设计之Android系列】智能家居远程控制系统设计

智能家居远程控制系统设计 摘 要 该系统是一种基于Android平台的应用程序&#xff0c;可以通过网络连接实现对家居设备的远程控制。其主要功能包括家居设备的开关控制、温度调节、音乐播放、安防监控等。系统的设计需要考虑硬件、软件、数据传输、安全性和扩展性等因素&#xf…

【EXCEL】vlookup,index/match查找函数

区别&#xff1a; 1.Vlookup函数只能查找列数据&#xff0c;即纵向查找&#xff0c;而IndexMatch函数&#xff0c;既可以纵向查找&#xff0c;也可以横向查找&#xff1b; 2、Vlookup函数查找的依据(第一个参数)必须位于数据源的第一列&#xff0c;IndexMatch函数组合则无此限制…

深度强化学习记录

增强学习是什么 增强学习 与环境交互获取反馈 agent 目标是最大化累积奖励&#xff0c;称为期望值回馈 增强学习框架 RL Process RL process叫做Markov Decision Process (MDP) The reward hypothesis RL基于奖励假设&#xff0c;目标函数是最大化期望回归&#xff0c…

MobileNet网络

介绍 MobileNet 网络专注于移动端或者嵌入式设备中的轻量级CNN网络&#xff0c;相比传统卷积神经网络&#xff0c;在准确率小幅降低的前提下大大减少模型参数与运算量&#xff08;相比VGG16准确率减少了0.9%&#xff0c;但模型参数只有VGG的1/32&#xff09; 网络中的亮点&am…

基于SSM的小儿肺炎知识管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

蓝桥杯Web组学习总结 - 目录导航版

HTML5 HTML 基础标签 HTML5 标签列表 HTML5 新特性 HTML5都有哪些新特性&#xff1f; CSS3 CSS 基础语法 CSS参考手册 盒子模型 CSS Box Model (盒子模型) 浮动与定位&#xff1f;&#xff1f; CSS 浮动(float)与定位(position) CSS布局之浮动和定位 CSS3 新特性 …

shiro Filter加载和执行 源码解析

一、背景 在使用若依框架&#xff08;前后端不分离包含shiro安全框架&#xff09;时&#xff0c;发现作者添加了验证码、登录帐号控制等自定义过滤器&#xff0c;于是对自定的过滤器加载和执行流程产生疑问。下面以验证码过滤器为例&#xff0c;对源码解析。注意类之间的继承关…

链游成为蓝海,潮游世界开创未来新时代

区块链、元宇宙浪潮来袭&#xff0c;为数字世界开启崭新的大门&#xff0c;一场链游模式的范式革命正在发生&#xff01; 未来&#xff0c;元宇宙中&#xff0c;链游将成为中坚力量。 潮游世界抢占时代先机&#xff0c;利用区块链技术的去中心化和数字资产的不可替代性&#x…

当当狸AR智能学习图集跨越千年文明传承,邀您“面对面”与虚拟诗人互动对诗

中华传统文化底蕴深厚&#xff0c;余韵悠长。即使经过千年的历史裂变&#xff0c;依然历久铭心慰藉着一代又一代人的灵魂。千百年后的今天&#xff0c;成为了我们独一无二的财富。 如今&#xff0c;国人学习中华传统文化的方式有很多&#xff0c;诗词集、动画影片、诗歌传颂等…

生物技术行业分析:预计2029年将达到55707亿元

生物技术( biotechnology),是指人们以现代生命科学为基础,结合其他基础科学的科学原理,采用先进的科学技术手段,按照预先的设计改造生物体或加工生物原料,为人类生产出所需产品或达到某种目的的技术方式生物技术利用对微生物、动植物等多个领域的深入研究,利用新兴技术对物质原…