技术分享 | 一款功能全面的 MySQL Shell 插件

news2024/11/15 20:05:43

作者:杨涛涛

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

本文来源:原创投稿

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


在 GITHUB 上闲逛,发现一款开源的 MySQL Shell 插件,安装配置好后,可以额外增加 MySQL Shell 的组件多样性以及类似早期 MySQL Utilities 工具集的各种功能(MySQL Utilities 已经不再开发了! )。

插件地址:https://github.com/lefred/mysqlshell-plugins

安装非常简单,创建对应的 MySQL Shell Plugins 目录,完了把插件整个拷贝到此即可。

mkdir -p ~/.mysqlsh/plugins
git clone https://kgithub.com/lefred/mysqlshell-plugins.git ~/.mysqlsh/plugins

我的OS环境是 Fedora Server 37 ,拷贝完对应目录后,提示各种 Python 包依赖错误,可以根据日志~/.mysqlsh/mysqlsh.log 内容提示依次解决,此处省略步骤。

解决好各种依赖包后,进入 MySQL Shell 命令行,可以看到出现很多新的组件:audit、check、config 等等。这里就不贴这些内容了。

我来简单演示其中几个组件:
第一,复制组件:replication。

目前的拓扑是这样的:我本地搭了三个实例 127.0.0.1:3310 、127.0.0.1:3311 、127.0.0.1:3312 。这三个实例组建了一个副本集,3310是主,3311和3312是从。

 MySQL  localhost:3311 ssl  Py > rs.status()
{
    "replicaSet": {
        "name": "rs1", 
        "primary": "127.0.0.1:3310", 
  ...
        "topology": {
            "127.0.0.1:3310": {
                "address": "127.0.0.1:3310", 
                "instanceRole": "PRIMARY", 
                "mode": "R/W", 
                "status": "ONLINE"
            }, 
            "127.0.0.1:3311": {
                "address": "127.0.0.1:3311", 
                "instanceRole": "SECONDARY", 
                "mode": "R/O", 
...
                "status": "ONLINE"
            }, 
            "127.0.0.1:3312": {
                "address": "127.0.0.1:3312", 
                "instanceRole": "SECONDARY", 
                "mode": "R/O", 
...
                "status": "ONLINE"
            }
        }, 
        "type": "ASYNC"
    }
}

这里我主动制造了一个错误,完后连接到其中一台从库上使用 replication.status() 获取本机复制状态:此时 SQL 线程停止,并且显示延迟20秒。

 MySQL  localhost:3312 ssl  Py > replication.status();
+--------------+-----------+------------+------------+
| channel_name | IO_thread | SQL_thread | lag_in_sec |
+--------------+-----------+------------+------------+
|              | ON        | OFF        | 20         |
+--------------+-----------+------------+------------+

使用 replication.error() 来获取详细错误:发现GTID 923dad27-8528-11ed-8796-080027382b72:78 执行失败,失败原因是主键重复。

 MySQL  localhost:3312 ssl  Py > replication.error()

 Applier error:
 2022-12-26 22:37:35.146527 : Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction '923dad27-8528-11ed-8796-080027382b72:78' at master log ytt-pc-bin.000003, end_log_pos 1105. See error log and/or performance_schema.replication_applier_status_by_worker table for more details about this failure or others, if any.
 2022-12-26 22:37:35.146532 : Worker 1 failed executing transaction '923dad27-8528-11ed-8796-080027382b72:78' at master log ytt-pc-bin.000003, end_log_pos 1105; Could not execute Write_rows event on table ytt.t1; Duplicate entry '10' for key 't1.PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log ytt-pc-bin.000003, end_log_pos 1105

再使用 replication.get_gtid_to_skip() 来确认具体的 GTID :确认无疑是923dad27-8528-11ed-8796-080027382b72:78

 MySQL  localhost:3312 ssl  Py > replication.get_gtid_to_skip()
+--------------+-----------------------------------------+
| channel_name | gtid_to_skip                            |
+--------------+-----------------------------------------+
|              | 923dad27-8528-11ed-8796-080027382b72:78 |
+--------------+-----------------------------------------+

使用 replication.skip_error() 来跳过这个 GTID :

MySQL  localhost:3312 ssl  Py > replication.skip_error();
skiping 923dad27-8528-11ed-8796-080027382b72:78 for replication channel ''...

完后在从库重启复制线程:stop replica;start replica;

MySQL  localhost:3312 ssl  SQL > stop replica;start replica;
Query OK, 0 rows affected (0.0194 sec)
Query OK, 0 rows affected (0.0347 sec)

再次查看复制是否有错误以及当前复制状态:没有错误,一切恢复正常。

 MySQL  localhost:3312 ssl  Py > replication.error();

no error
 MySQL  localhost:3312 ssl  Py > replication.status();
+--------------+-----------+------------+------------+
| channel_name | IO_thread | SQL_thread | lag_in_sec |
+--------------+-----------+------------+------------+
|              | ON        | ON         | 0          |
+--------------+-----------+------------+------------+
第二、获取锁相关数据的组件:locks 。

locks 组件可以获取当前事务的锁数据,包括当前锁持有以及锁等待相关线程 ID 、锁持有时间、内存占用、锁的具体行数等。下面使用 locks.get_locks() 来获取当前锁相关数据:

 MySQL  localhost:3310 ssl  Py > locks.get_locks()
+-----------------+--------------+-------------+-----------+----------------+-------------------+-------------------+-------------------------------------------------------------------+
| mysql_thread_id | trx_duration | cpu_latency | memory    | row_locks_held | row_locks_pending | tables_with_locks | current_statement                                                 |
+-----------------+--------------+-------------+-----------+----------------+-------------------+-------------------+-------------------------------------------------------------------+
|              25 | 4.43 min     |   0 ps      | 2.07 MiB  |              3 |                 0 | ytt.t1            | NULL                                                              |
|              29 | 17.51 s      |   0 ps      | 2.49 MiB  |              1 |                 0 | ytt.t1            | update t1 set r1 = 100 where id =10                               |
|               7 | 10.69 ms     |             | 15.66 KiB |              0 |                 0 | NULL              | NULL                                                              |
|              27 | 269.67 us    |   0 ps      | 10.31 MiB |              0 |                 0 | NULL              | SELECT thr.processlist_id AS m ... IT DESC               LIMIT 10 |
|              13 | 136.45 us    |   0 ps      | 1.19 MiB  |              0 |                 0 | NULL              | NULL                                                              |
+-----------------+--------------+-------------+-----------+----------------+-------------------+-------------------+-------------------------------------------------------------------+

根据后续提示,还可以获取更多的数据:比如线程25,持有 IX 意向锁以及 X 记录锁,以及当前等待此锁的 SQL 语句;线程29申请X记录锁却被线程25阻塞。

For which thread_id do you want to see locks ? (25) : 25

Metadata Locks:
---------------

GRANTED SHARED_WRITE on ytt.t1

Data Locks:
-----------

GRANTED TABLE (IX) LOCK ON ytt.t1
GRANTED RECORD (X) LOCK ON ytt.t1 (PRIMARY) (id=supremum pseudo-record)
                                            (id=10)

BLOCKING RECORD (X,REC_NOT_GAP) LOCK ON ytt.t1 FOR 12 SECONDS (mysql_thread_id: 29)

Statement we are blocking:
--------------------------

update t1 set r1 = 100 where id =10


For which thread_id do you want to see locks ? (25) : 29
Metadata Locks:
---------------
GRANTED SHARED_WRITE on ytt.t1

Data Locks:
-----------
GRANTED TABLE (IX) LOCK ON ytt.t1
WAITING RECORD (X,REC_NOT_GAP) LOCK ON ytt.t1 (PRIMARY) (id=10)

BLOCKED FOR 8 SECONDS BY (mysql_thread_id: 25)


第三、获取语句执行的 profiles 数据:profiling 组件。

先执行 profiling.start() ,完后执行些语句,再用 profiling.get() 来获取具体的 profiles 数据,最后再关闭 profiling 收集。

MySQL  localhost:3310 ssl  ytt  Py > profiling.get()

Last 5 events from the proccess list id: @@pseudo_thread_id
-----------------------------------------------------------

---Events before profiling was started are in orange---
1563 : select schema()
1555 : help 'profiling'
1551 : profiling.get()
1531 : select * from t1 order by rand() limit 10
1512 : select count(*) from t1
Which event do you want to profile ? : 1531

Profiling of:
-------------

select * from t1 order by rand() limit 10
duration: 0.0162
+------------------------------------------------+----------+
| Stage                                          | Duration |
+------------------------------------------------+----------+
| stage/sql/starting                             |   0.0000 |
| stage/sql/Executing hook on transaction begin. |   0.0000 |
| stage/sql/starting                             |   0.0000 |
| stage/sql/checking permissions                 |   0.0000 |
| stage/sql/Opening tables                       |   0.0000 |
| stage/sql/init                                 |   0.0000 |
| stage/sql/System lock                          |   0.0000 |
| stage/sql/optimizing                           |   0.0000 |
| stage/sql/statistics                           |   0.0000 |
| stage/sql/preparing                            |   0.0000 |
| stage/sql/Creating tmp table                   |   0.0000 |
| stage/sql/executing                            |   0.0160 |
| stage/sql/end                                  |   0.0000 |
| stage/sql/query end                            |   0.0000 |
| stage/sql/waiting for handler commit           |   0.0000 |
| stage/sql/closing tables                       |   0.0000 |
| stage/sql/freeing items                        |   0.0000 |
| stage/sql/cleaning up                          |   0.0000 |
+------------------------------------------------+----------+
Don't forget to stop the profiling when done.
第四、连接主库使用 innodb 组件查看有碎片的表,并且获取表大小、索引大小、碎片率等数据。
MySQL  localhost:3310 ssl  ytt  Py > innodb.get_fragmented_tables_disk()
Warning: information_schema_stats_expiry is set to 86400.
Do you want to change it ? (y/N) : n
+--------+-------+-----------+------------+------------+-----------+-----------+-------------+--------+
| NAME   | ROWS  | DATA_SIZE | INDEX_SIZE | TOTAL_SIZE | DATA_FREE | FILE_SIZE | WASTED_SIZE | FREE   |
+--------+-------+-----------+------------+------------+-----------+-----------+-------------+--------+
| ytt/t1 | 28861 | 4.52 MiB  |    0 bytes | 4.52 MiB   | 4.00 MiB  | 12.00 MiB | 7.48 MiB    | 62.37% |
+--------+-------+-----------+------------+------------+-----------+-----------+-------------+--------+
Don't forget to run 'ANALYZE TABLE ...' for a more accurate result.

第五、使用 check 组件来获取 binlog 的 IO 数据:由于格式不好看,我截了张图。可以展示现存所有 binlog 文件的读写频率、读写数据等信息。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Java]异常处理

文章目录🥽 异常概述🥽 异常的分类🥽 异常的处理🌊 异常处理机制一:try-catch-finally💦 语法结构💦 try-catch💦 finally💦 try-catch-finally处理异常的执行流程&#…

7.0、Linux-Vim编辑器以及常用命令详解

7.0、Linux-Vim编辑器以及常用命令详解 什么是 Vim 编辑器 -> Vim 是从 vi 发展出来的一个文本编辑器;代码补全、编译以及错误等方便编程的功能特别丰富,在程序员中被广泛使用;简单的来说,vi 是老式的字处理器,不过…

未知感知对象检测:从开放视频中学习你不知道的东西(学习笔记)

Unknown-Aware Object Detection: Learning What You Dont Know from Videos in the wild paper: https://arxiv.org/abs/2203.03800 code: https://github.com/deeplearning-wisc/stud the Wild 弄一个靠谱的目标检测器,完成OOD问题 什么是out of distribution (…

PHP Tools for Visual Studio 2019-2022 1.7 Crack

PHP Tools 是一个完整的 PHP 开发环境,位于单个软件包中。利用众所周知的行业标准 IDE 开发小型项目直至大型 PHP 应用程序。 该编辑器具有智能代码分析和快速抢占式代码完成功能。通过大量的导航功能、手边的本地化手册或快速重构操作来提高您的工作效率。 检查代码…

基于Amlogic 安卓9.0, 驱动简说(五):基于GPIO、LED子系统的LED驱动

一、篇头 本章介绍LED子系统的使用。使用LED子系统,可以轻松实现对LED,例如常见的闪烁和亮度控制功能。简单起见,本章先使用GPIO实现,在不模拟PWM的情况下,只能实现点亮和灭灯的效果,重点是介绍GPIO、LED子…

腾讯前端一面常考vue面试题汇总

vue2.x详细 1. 分析 首先找到vue的构造函数 源码位置:src\core\instance\index.js function Vue (options) {if (process.env.NODE_ENV ! production &&!(this instanceof Vue)) {warn(Vue is a constructor and should be called with the new keyword…

【Linux】Linux进程的理解 --- 进程描述符、状态、优先级、切换…

如果不改变自己,就别把跨年搞的和分水岭一样,记住你今年是什么吊样,明年就还会是什么吊样!!! 文章目录一、冯诺依曼体系结构(硬件)二、操作系统(软件)1.操作…

HCIP第六天

文章目录一,实验要求二,搭建拓扑图三,配置IP地址和环回地址四,宣告OSPF五,抓取流量六,测试一,实验要求 所有到达目标的路径最优,互有备份二,搭建拓扑图 三,配置IP地址和环…

photoshop绘制网格线的几种办法和重复绘制处理加工

第一种 绘制一个十字 ,然后保存为图案,然后添加图层样式 图案叠加 重复 第二种 显示网格线 编辑-首选项-参考线网格线设置 默认是25, 25*5125毫米 image.png新建125x125毫米会发现非常对称 image.png画笔直接按shift自动锁定网格线进行绘制这样非常标准也很快,比图案还要灵活一…

60. 实战 Kaggle 比赛:图像分类 (CIFAR-10)【在colab上运行】

之前几节中,我们一直在使用深度学习框架的高级API直接获取张量格式的图像数据集。 但是在实践中,图像数据集通常以图像文件的形式出现。 本节将从原始图像文件开始,然后逐步组织、读取并将它们转换为张量格式。 我们之前对CIFAR-10数据集做了…

论文投稿指南——中文核心期刊推荐(生物科学)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

vue开发环境配置Visual Studio Code配置和安装教程查询

方便前端vue开发,使用vs code插件安装详细教程,关于vs code在网络上查询相关的教程,插件安装如下图所示,大家发现常用的,好用的插件可以留言分享,或与我联系。 1 安装Vue语法高亮显示插件:vetur…

63.目标检测数据集

目标检测领域没有像MNIST和Fashion-MNIST那样的小数据集。 为了快速测试目标检测模型,我们收集并标记了一个小型数据集。 首先,我们拍摄了一组香蕉的照片,并生成了1000张不同角度和大小的香蕉图像。 然后,我们在一些背景图片的随机…

MSF弱点扫描

● 根据信息收集结果搜索漏洞利用模块 ● 结合外部漏洞扫描系统对大IP地址段进行批量扫描 ● 误判率、漏判率 VNC密码破解 use auxiliary/scanner/vnc/vnc_login● VNC无密码访问 use auxiliary/scanner/vnc/vnc_none_authRDP远程桌面漏洞 use auxiliary/scanner/rdp/ms12_…

【系统设计】直播架构分析

直播架构 1. 组成 三部分组成, 分别是 客户端(主播端 观众端) 、应用服务器集群 、 CDN 技术 2. 模块间交互方式 主播端 : 直播客户端开启直播间 —— 获取 CDN 推流地址 ——通过 CDN 协议推流到 CDN 服务器上 观众端&#x…

软考信息安全工程师看什么教材?

教材在官网上都有给出具体的版本。 如何复习备考? 首先准备考教材,视频,资料等内容。(可分享) 了解考情: 通过历年真题分析历年考试相关知识内容的考查频度及分值占比,梳理出核心考点内容。第二…

【CANN训练营第三季】Pytorch模型迁移

文章目录第4题第5题首先安装pytorch 参考:https://gitee.com/ascend/pytorch 安到测试这一步,报错,没办法继续了。 RuntimeError: Unsupported soc version: Ascend310 https://gitee.com/ascend/pytorch/issues/I68UDG?fromproject-issue …

微软的AD登录

微软的AD登录最早在1999年出现,,,也就是我们知道的SSO,,具体原理不做过多展开。见官网 AD 官网 安装依赖 "azure/msal-browser": "^2.15.0","azure/msal-react": "^1.0.1",…

XXE - XML外部实体注入攻击

XXE漏洞是什么? xxe(xml External Entity attack),在可以解析XML语言的地方,攻击者提交恶意的XML代码并被执行后,获取服务器中本应被保护的数据。对于XXE漏洞最为关键的部分是DTD文档类型,DTD …

全球 5G RAN 市场呈现强劲增长

根据Future Market Insights的一份新报告,全球对5G RAN的需求预计将在2022年和2032年以28.7%的健康CAGR增长,到2032年达到342亿美元的净值。 5G RAN市场蜂窝设备利用无线电波进行通信。这些设备将用户的语音和移动数据转换成数字化信号,以无…