技术分享 | MySQL Shell 收集 MySQL 诊断报告(上)

作者:杨涛涛

资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

util.debug属性有三个诊断函数:

  1. collect_diagnostics 用来收集单实例、副本集、InnoDB Cluster 的诊断数据。<u>旧版本8.0.30 也可以用,不过功能不是很全面</u>
  2. collect_high_load_diagnostics 用来循环多次收集,并找出负载异常的诊断数据。
  3. collect_slow_query_diagnostics 用来对函数collect_diagnostics收集到的慢日志做进一步分析。

今天我们先来介绍第一个函数collect_diagnostics 如何使用:

函数collect_diagnostics 用来收集如下诊断数据并给出对应诊断报告:

  1. 无主键的表
  2. 死索引的表
  3. MySQL错误日志
  4. 二进制日志元数据
  5. 副本集状态(包含主库和从库)
  6. InnoDB Cluster 监控数据
  7. 表锁、行锁等数据
  8. 当前连接会话数据
  9. 当前内存数据
  10. 当前状态变量数据
  11. 当前MySQL 慢日志(需主动开启开关)
  12. OS 数据(CPU、内存、IO、网络、MySQL进程严重错误日志过滤等)

函数collect_diagnostics 有两个入参:一个是输出路径;另一个是可选字典配置选项,比如可以配置慢日志收集、定制执行SQL 语句、定制执行SHELL命令等等。

以下是常用调用示例:

  1. 只传递参数1,给定诊断数据打包输出路径,诊断报告会整体打包为/tmp/cd1.zip。
util.debug.collect_diagnostics('/tmp/cd1')
  1. 激活慢日志抓取(必需条件:MySQL慢日志开关开启、日志输出格式为TABLE),诊断报告会整体打包为/tmp/cd2.zip,并且包含慢日志诊断报告。
util.debug.collect_diagnostics('/tmp/cd2',{"slowQueries":True})
  1. 定制执行SQL: 收集预置诊断报告同时也收集给定的SQL语句执行结果。
util.debug.collect_diagnostics('/tmp/cd3',{"customSql":["select * from ytt.t1 order by id desc limit 100"]})
  1. 定制执行SHELL命令: 收集预置诊断报告同时也收集给定的SHELL命令执行结果。
util.debug.collect_diagnostics('/tmp/cd4',{"customShell":["ps aux | grep mysqld"]})
  1. 收集所有成员诊断数据(副本集或者InnoDB Cluster)。
util.debug.collect_diagnostics('/tmp/cd5',{"allMembers":True})

分别执行以上5条命令,在/tmp目录下会生成如下文件: 以下5个打包文件即是我们运行的5条命令的结果。

root@ytt-pc:/tmp# ll cd*
-rw------- 1 root root  893042 1月   5 10:31 cd1.zip
-rw------- 1 root root  818895 1月   5 10:55 cd2.zip
-rw------- 1 root root  819183 1月   5 11:02 cd3.zip
-rw------- 1 root root  835387 1月   5 11:06 cd4.zip
-rw------- 1 root root 2040913 1月   5 11:31 cd5.zip

要查看具体诊断报告,得先解压这些文件。先来看下cd2.zip 解压后的内容:对于收集的诊断数据,有tsv和yaml两种格式的报告文件。报告文件以数字0开头,表示这个诊断报告来自一台单实例MySQL。

root@ytt-pc:/tmp/cd/cd2# ls|more
0.error_log
0.global_variables.tsv
0.global_variables.yaml
0.information_schema.innodb_metrics.tsv
0.information_schema.innodb_metrics.yaml
0.information_schema.innodb_trx.tsv
0.information_schema.innodb_trx.yaml
0.instance
0.metrics.tsv
0.performance_schema.events_waits_current.tsv
0.performance_schema.events_waits_current.yaml
0.performance_schema.host_cache.tsv
0.performance_schema.host_cache.yaml
0.performance_schema.metadata_locks.tsv
0.performance_schema.metadata_locks.yaml
...

比如查看此实例的连接字符串:

root@ytt-pc:/tmp/cd/cd2# cat 0.uri 
mysql://root@localhost:3306

以下为对应的慢日志报告:分别为慢日志数据、95分位慢日志数据以及根据扫描行数排序的慢日志数据。

root@ytt-pc:/tmp/cd/cd2# ls *slow*
0.slow_log.tsv   0.slow_queries_in_95_pctile.tsv   0.slow_queries_summary_by_rows_examined.tsv
0.slow_log.yaml  0.slow_queries_in_95_pctile.yaml  0.slow_queries_summary_by_rows_examined.yaml

cd1.zip、cd2.zip、cd3.zip、cd4.zip 都是基于单实例收集的诊断报告,解压后的文件都是以0开头;cd5.zip是基于副本集收集的诊断报告,解压后的文件是以1,2,3开头,分别代表实例3310,3311,3312。

比如查看副本集里3个成员的连接字符串:

root@ytt-pc:/tmp/cd/cd5# cat {1,2,3}.uri
mysql://root@127.0.0.1:3310?ssl-mode=required
mysql://root@127.0.0.1:3311?ssl-mode=required
mysql://root@127.0.0.1:3312?ssl-mode=required

目前副本集的拓扑: 3310 为主,3311,3312为从,可以在主库上执行show replicas 命令得到从库列表

 MySQL  localhost:3310 ssl  SQL > show replicas;
+------------+-----------+------+------------+--------------------------------------+
| Server_Id  | Host      | Port | Source_Id  | Replica_UUID                         |
+------------+-----------+------+------------+--------------------------------------+
| 2736952196 | 127.0.0.1 | 3312 | 4023085694 | 0824a675-8ca9-11ed-a719-0800278da4ac |
| 3604736168 | 127.0.0.1 | 3311 | 4023085694 | 0526130e-8ca9-11ed-b797-0800278da4ac |
+------------+-----------+------+------------+--------------------------------------+
2 rows in set (0.0002 sec)

从诊断报告里查看实例3310 的从库列表:

root@ytt-pc:/tmp/cd/cd5# cat 1.SHOW_REPLICAS.yaml

...

#
Host: 127.0.0.1
Port: 3312
Replica_UUID: 0824a675-8ca9-11ed-a719-0800278da4ac
Server_Id: 2736952196

Source_Id: 4023085694
---

Host: 127.0.0.1
Port: 3311
Replica_UUID: 0526130e-8ca9-11ed-b797-0800278da4ac
Server_Id: 3604736168
Source_Id: 4023085694

结语:

MySQL Shell 8.0.31 带来的增强版收集诊断报告功能,能更好的弥补MySQL在这一块的空缺,避免安装第三方工具,从而简化DBA的运维工作。

本文转载于网络 如有侵权请联系删除

相关文章

  • 【技思广益 · 腾讯技术人原创集】双周优秀作品回顾vol.02

    【技思广益·腾讯技术人原创集】是腾讯云开发者社区为腾讯技术人与广泛开发者打造的分享交流窗口。栏目邀约腾讯技术人分享原创的技术积淀,与广泛开发者互启迪共成长。第二期热门作品已经诞生啦,快和云荐官一起围观~腾讯腾讯客户端开发ethanlin《自定义Clang命令,利用LLVMPass实现对OC函数的静态插桩》Objective-C在函数hook的方案比较多,但通常只实现了函数切片,也就是对函数的调用前或调用后进行hook,这里介绍一种利用llvmpass进行静态插桩的另外一种思路,希望起到抛砖引玉的作用,拿来实现更多有意思的功能。腾讯科技高级工程师卡卡罗特杨《一种海量数据安全分类分级架构的实现》数据分类分级很复杂,这种复杂性有业务层面,也有架构层面。本文重点在于述说架构层面的问题。这些问题有些可以提前规划设计,比如存储选型、通用扫描能力等。也有些需要在落地过程中持续优化,比如海量数据识别,除了对服务本身性能优化,也要对资源成本综合考虑。架构没有好坏之分,只有合适一说。本文所讲述是基于个人在落地过程遇到问题的经验总结。因此反复斟酌,认真梳理写下本文,也是对本人工作的一个阶段总结。同时也希望框

  • pic单片机流水灯循环右移c语言,PIC单片机流水灯程序[通俗易懂]

    大家好,又见面了,我是你们的朋友全栈君。#INCLUDE“P16F877.inc”;org00h;gotoa1;org0ch;;******************************************;主程序段;******************************************a1movlw8;循环次数movwf40h;movlwB’01111111′;初显示值movwf41h;a2bsfSTATUS,RP0;选择体1bcfSTATUS,RP1;movlw00h;movwfTRISD;设置RD口为输出口bcfSTATUS,RP0;选择体0bcfSTATUS,RP1;movfw41h;movwfPORTD;输出显示数据RRF41H,0;处理Crrf41h,1;循环右移callm001;延时decfsz40h,1;判断是否完成8次gotoa2;否继续gotoa1;是返回重新设置;************************************************;延时子程序;*************************************

  • [starCTF / *CTF 2021] Pwn方向writeup

    babyheapbabypacFavouriteArchitecureflag1FavouriteArchitecureflag2babyheap18.04libc2.27堆题,delete有doublefree白给题,触发malloc_consolidate就可以leak+overlapping了EXP:frompwnimport* #p=process("./pwn") p=remote("52.152.231.198",8081) elf=ELF("./pwn") #libc=ELF("./libc.so.6") libc=ELF("./libc-2.27.so") context.log_level="debug" defadd(idx:int,size:int): p.recvuntil(b">>\n") p.sendline(b"1") p.recvuntil(b"inputindex\n

  • 【云管理系统】CloudStack 与 OpenStack 比较——选择云管理系统之前需要了解的内容

    基础设施即服务(IaaS)被公认为有助于加快上市速度并推动业务敏捷性。当一个公司要求对一个业务问题给出具体的答案时,答案就在一堆混杂的计算中,包括投资和平台运维。 ApacheCloudstack和OpenStack是两个广为人知的云管理平台,可以为您的云基础架构提供有效的抽象层。两者在提供的服务方面是相似的,但从运营的角度来看,它们是非常不同的。那么,哪一个是您公司的正确选择?让我们从技术和业务的角度来看看它们是如何比较的。您将在本文中找到什么 1.ApacheCloudStack和OpenStack的历史1.1ApacheCloudStack今天的ApacheCloudStack1.2OpenStack今天的OpenStack2.架构2.1ApacheCloudStack2.2OpenStack三、OpenStack与CloudStack的比较3.1相似之处3.2部署3.3管理程序3.4跨管理程序支持矩阵3.5易用性3.6中小企业和企业中CMP的选择4.如何为您的企业选择合适的云管理平台历史 ApacheCloudStack ApacheCloudStack徽标比较ApacheCl

  • 新一代开源ES管理工具ElasticView

    介绍ElasticView是一款用来监控ElasticSearch状态和操作ElasticSearch索引的web可视化工具。它由golang开发而成,具有部署方便,占用内存小等优点,官网地址:http://www.elastic-view.cnElasticSearch连接树管理(更方便的切换测试/生产环境)支持权限管理支持sql转换成dsl语法更方便的重建索引任务管理备份管理可将查询内容下载为excel文件可进行索引创建,映射创建,别名创建,索引删除等操作支持版本6.x,7.x,8.x支持类似Navicat功能docker部署支持sqlite3(免安装gcc版)数据抽取功能官网地址http://www.elastic-view.cnhttps://github.com/1340691923/ElasticViewDocker部署教程sqlite3存储dockerrun--restart=unless-stopped-d-p8090:8090-v/data/elastic_view/data:/data-v/data/elastic_view/logs:/logskecikeci/e

  • 从 VSCode 看大型 IDE 技术架构

    零、前言为什么要去看VSCode?因为我们团队在做的中后台快速研发平台云凤蝶也是一款类似WebIDE形态的产品:而谈起WebIDE,没人能绕开VSCode,它非常流行,同时又完全开源,总共350000行TypeScript代码的巨大工程,使用了142个开源库。市面上选择基于VSCode去修改定制的IDE比比皆是:WeexStudio、白鹭EgretWing、快应用IDE...我希望从VSCode身上看到什么?大型复杂GUI软件(如IDE类)如何组织功能模块代码如何使用Electron技术将Web软件桌面化如何在打造插件化开放生态的同时保证软件整体质量与性能如何打造一款好用的、流行的工具软件一、VSCode是什么官方定义https://code.visualstudio.com/关键词:代码编辑(工具属性)跨平台运行、开源核心功能:IntelliSense(代码提示)、debugging(代码调试)、git(代码管理)都是围绕代码编辑的核心链路extensions(插件)则肩负着打造开放生态的责任点评:对于工具软件而言,需要内心能想清楚边界。哪些是自己应该专注去做的,哪些可以外溢到交给第

  • 计算工作日

    计算指定工作日后的日期第一种:publicstaticDateTimeGetWorkday(DateTimenow,intdays) { intweek=(int)now.DayOfWeek; intaddday=days/5*7+days%5; if(week==6)//如果是周六就加一天到星期天 { addday+=1; } elseif((week+days%5)>5) { addday+=2; } returnnow.AddDays(addday); }复制第二种:publicstaticDateTimeGetWorkdayLoop(DateTimenow,intdays) { DateTimetemp=now; while(days-->0) { temp=temp.AddDays(1); while(temp.DayOfWeek==System.DayOfWeek.Saturday||temp.DayOfWeek==System.DayOfWeek.Sunday) temp=temp.AddDays(1); } returntemp; }复制

  • ACL 2019 | 精选8篇微软ACL论文解读,一览最新研究进展

    来源|微软研究院AI头条(id:MSRAsia) 【导读】ACL2019将于7月28日至8月2日在意大利佛罗伦萨举行。在本届大会的录取论文中,共有25篇来自微软亚洲研究院和微软(亚洲)互联网工程院。内容涵盖文本摘要、机器阅读理解、推荐系统、视频理解、语义解析、机器翻译、人机对话等多个热门领域。本文将为大家介绍来自不同领域中有代表性的8篇论文。抽取式文本摘要近两年,自然语言中的预训练模型如ELMo、GPT和BERT给自然语言处理带来了巨大的进步,成为研究热点中的热点。这些模型首先需要在大量未标注的文本上训练一个从左到右(left-to-rightlanguagemodel)或从右到左(right-to-leftlanguagemodel)或完形填空式(maskedlanguagemodel)的语言模型。以上过程称为预训练(pre-training)。预训练完的模型便具有了表示一个句子或一个词序列的能力,再针对不同的下游任务进行微调(finetuning),然后可以在下游任务上取得不错的效果。 但是上述预训练模型无论是对句子还是文章进行建模时都把它们看成一个词的序列。而文章是有层级结构的

  • 如何在静态页面上使用markdown排版 原

    ”Markdown是一种轻量级标记语言,创始人是约翰·格鲁伯(JohnGruber)。它允许人们“使用易读易写的纯文本格式编写文档,然后转换成有效的HTML文档。”,转换成html最方便的方式是用插件我找了几个插件,最后觉得还是atome的markdown-preview-enhanced插件比较好用,预览界面简洁美观,效果如下:首先安装markdown-preview-enhanced插件(安装成功后会在扩展中显示,点击Toggle可以实时看效果)如果把显示的效果放到外面静态页面中,在markdowpreview界面右键-HTML-HTML(offline)导出html,导出的html中包含着样式,我们可以把样式单独放在一个文件中,供其他页面使用markdown-preview-enhanced插件的语法与markdown基本一样,主要区别是代码块,如果要高亮,需要在```后增加代码的类型,如css,javascript,html等详细语法说明:标题#这是<h1>一级标题 ##这是<h2>二级标题 ###这是<h3>三级标题 ####这是<h

  • Swift学习笔记(十四)——字符,常量字符串与变量字符串

          在学习Java过程中,字符串碰到过String和StringBuffer,当中前者是不可变的,不能对字符串进行改动;后者是可变的,能够不断改动。来到Swift中,对字符串的定义变的更加简单。 (1)概述 Swift中,用let声明的是字符串常量,不能进行改动。用var声明的是字符串变量,能够改动。通过代码来演示。 letstr1="Hello1" varstr2="Hello2" str1="world1"//报错:cannotassignto'let'value'str1' str2="world2" str1+="world1"//报错:binaryoperator'+='cannotbeappliedtotwoStringoperandsstr1+='world1' str2+="world2" 复制 由代码可见,let声明的字符串不可变,var声明的字符串可变。 (2)字符串初始化 Swift字符串有两种初始化方法。第一种方法是赋空值。另外一种是用String()类实例化。代码例如以下: va

  • 技术干货 | JavaScript 之事件循环(Event Loop)

    导读:学过JavaScript(下文简称JS)的都知道它是一门单线程的、非阻塞的脚本语言。单线程意味着,JS代码在执行的任何时候,都只有一个主线程来处理所有的任务,这也就意味着JS无法进行多线程编程,但是JS当中却有着无处不在的异步概念,我们如何理解呢?理解异步和非阻塞靠的就是EventLoop(事件循环),本文就围绕JS线程、同步异步、任务队列等方面讲解事件循环(EventLoop)。   JS线程   为了我们更方便容易了解事件循环,在此之前我们先简单了解下什么叫做JS线程。如浏览器的渲染进程是多线程的,主要有以下几个线程:   JS引擎线程(主线程):负责解析JS脚本,运行代码。   GUI渲染线程:负责渲染浏览器界面,解析HTML、CSS、构DOM树和RenderObject树,布局和绘制等,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。   定时器触发线程(setTimeout):浏览器定时计数器并不是由JS引擎计数的,因为JS引擎是单线程的,如果处于阻塞线程状态就会影响

  • android 开源项目总结

    http://www.trinea.cn/android/android-open-source-projects-view/

  • HDU5909 Tree Cutting(树形DP + FWT)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5909 Description ByteasarhasatreeTwithnverticesconvenientlylabeledwith1,2,...,n.Eachvertexofthetreehasanintegervaluevi. Thevalueofanon-emptytreeTisequaltov1⊕v2⊕...⊕vn,where⊕denotesbitwise-xor. Nowforeveryintegerkfrom[0,m),pleasecalculatethenumberofnon-emptysubtreeofTwhichvalueareequaltok. AsubtreeofTisasubgraphofTthatisalsoatree. Input ThefirstlineoftheinputcontainsanintegerT(1≤T≤10),denotingthenumberoftestcases. Ineachtestcase,thefirstlineofth

  • 转:Java compiler level does not match the version of the installed Java project facet

    a.问题描述:eclipse加载新的项目后报一个错误,具体描述如下: DescriptionResourcePathLocationType JavacompilerleveldoesnotmatchtheversionoftheinstalledJavaprojectfacet.webattemp UnknownFacetedProjectProblem(JavaVersionMismatch)复制 b.问题分析:     java版本不匹配:FactedProject 中的Java 版本设定与项目的Java 版本设定不一致。 c.问题解决:     在当前项目上点右键,属性--ProjectFacets中,配置编译版本与javacompiler的版本一致。       1)、选中项目右键Project->Properties->JavaCompiler(typefiltertext输入compiler可快速定位),如下图所

  • Nginx安装与配置

    http://www.nginx.cn/install

  • VLAN协议-学习笔记

    .datagram{width:90%;font-size:8px;table-layout:fixed} .vlan{width:90%;font-size:8px;table-layout:fixed} .data{border:2pxsolidrgba(0,0,0,1)} td{width:90%;word-break:keep-all;white-space:nowrap;font-size:8px} VirtualLAN虚拟局域网,用于在二层交换机上分割广播域的计数(区别于使用路由器分割的网络)。 逻辑上的一组设备和用户,不受物理位置的限制,一个VLAN相当于一个广播域。网络设备的移动、添加和修改的管理开销将减小,可以控制广播范围,提高网络安全性。   1、二层交换机只能构建单一广播域,VLAN能够将网络分割成多个广播域。路由器的接口很少(1-4个),交换机接口很多,可用众多的交换机接口分割广播域。 2、一台未设置VLAN的二层交换机上,任何广播帧都会被转发给其他所有的接口。通过设置VLAN后,只能在相同VLANID中传播,不同VLANID之间无法通信。 3、VLA

  • 正则表达式学习

      特殊符号 代表意义 [:alnum:] 代表英文大小写字符及数字,亦即0-9,A-Z,a-z [:alpha:] 代表任何英文大小写字符,亦即A-Z,a-z [:blank:]  代表空白键与[Tab]按键两者 [:cntrl:]  代表键盘上面的控制按键,亦即包括CR,LF,Tab,Del..等等  [:digit:]  代表数字而已,亦即0-9 [:graph:]  除了空白字符(空白键与[Tab]按键)外的其他所有按键 [:lower:]  代表小写字符,亦即a-z [:print:]  代表任何可以被打印出来的字符 [:punct:]  代表标点符号(punctuationsymbol),亦即:"'?!;:#$... [:upper:]  代表大写字符,亦即A-Z [:space:]  任何会产生空白的字符,包括空白键,[Tab],CR等等 [:xdigit:]  代表16进位的数字类型,因此包括:

  • 接口自动化、移动端、web端自动化如何做?

    1、《Python+Appium移动端自动化项目实战》-带您进入APP自动化测试的世界https://yuedu.baidu.com/ebook/765b38a5690203d8ce2f0066f5335a8102d266b9 2、《接口测试自动化实战》-接口测试工作该怎么开展?如何做接口自动化?https://yuedu.baidu.com/ebook/aaf72f1b42323968011ca300a6c30c225901f07d 3、《Python+Selenium自动化项目实战》-Web端自动化https://yuedu.baidu.com/ebook/eb4dfb19e3bd960590c69ec3d5bbfd0a7956d587 《接口测试自动化实战》 https://yuedu.baidu.com/ebook/aaf72f1b42323968011ca300a6c30c225901f07d 《python+appium自动化项目实战》 https://yuedu.baidu.com/ebook/765b38a5690203d8ce2f0066f5335a8102d2

  • LeetCode 128

    128.最长连续序列 用哈希表记录当前数为端点时的最大区间长度 遍历数组,如果当前数在哈希表中出现过,则跳过 如果当前数未出现,则取相邻的两数在哈希表中的值,left和right,当前数所在的区间长度为left+right+1,然后将该值填入端点处。 classSolution{ publicintlongestConsecutive(int[]nums){ HashMap<Integer,Integer>hash=newHashMap<>(); intmax_length=0; for(inti=0;i<nums.length;i++){ if(hash.containsKey(nums[i]))continue; intleft=hash.getOrDefault(nums[i]-1,0); intright=hash.getOrDefault(nums[i]+1,0); intcur_length=left+right+1; hash.put(nums[i],-1);//填入-1只是为了表示当前数在哈希表中出现过 if(cur_length>m

  • 【调研与分析】标杆学习、知识管理和竞争情报的关系——From Team

    注: 1)红色实线箭头表示可以直接使用;例如竞争情报业务输出产品之一的标杆文档可以直接作为公司标杆学习中外部标杆的资料; 2)蓝色虚线箭头表示转化后使用或者间接利用的关系;例如专题调研可以帮助建立内部优秀流程和文档模板;内部人员经验通常也可以作为专题调研确定方向或者分析问题时的有效助益。 对于管理者而言,一定要清楚每个岗位的主要职责,想让一个人承担大部分工作成为“全才”,最后不过是庸才而已。共勉!

  • typedeifn typename

    1、类型说明typedef 类型说明的格式为: typedef 类型定义名; 类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。定义名表示这个类型的新名字。 例如:用下面语句定义整型数的新名字: typedefintSIGNED_INT; 使用说明后,SIGNED_INT就成为int的同义词了,此时可以用SIGNED_INT定义整型变量。 例如: SIGNED_INTi,j;(与inti,j等效)。 但longSIGNED_INTi,j;是非法的。 typedef同样可用来说明结构、联合以及枚举和类。 说明一个结构的格式为:     typedefstruct     {         数据类型 成员名;         数据类型 成员名;  &

相关推荐

推荐阅读