Mysql8.0~gh-ost~default_authentication_plugin导致ddl卡住

news2024/11/15 12:24:36

一、引言

        最近线上有个表要加几个字段,提交db单之后执行了一天都没有结束,这个表的容量不大不应该这样。因此作者与DBA进行了深入沟通,了解了集团使用gh-ost更新表结构的过程,问题出在交换表名的过程中。

二、分析

        看的ddl单据卡住了之后,作者看了一下日志,循环播放取消gh-ost的限速设置成功,怎么看都是代码走到死循环里面去了,毕竟我们这边执行ddl的系统是自研的。

         因此作者只能和dba沟通一下了,因为不了解集团这个db系统后台是怎么玩的。

        沟通之后了解到这个系统拿到ddl语句之后会使用gh-ost进行表结构修改,gh-ost是一个开源工具,用于执行DDL(数据定义语言)操作。它可以在不中断服务的情况下执行表结构的更改,例如添加、修改或删除列、索引等。gh-ost使用一种称为"online schema change"的方法,通过复制表并在副本上执行DDL操作,然后将更改应用到主表上,以减少对生产环境的影响。

        首先分析一下这个表结构更新的过程,接下来才能分析问题出在什么地方

1、表结构更新过程

        1、改表结构对于大表来说是非常长的过程,锁表时间很久,所以gh-ost会在主节点建立一个临时副本,把a表里面所有的数据复制过去并且在这个过程中追加a更新的数据,gh-ost会使用MySQL的复制机制将主库上的binlog事件复制到副本上,以确保临时表中的数据与主表中的数据保持一致。

        从库不用管,主库的变化都会从binlog被感知。

        这个过程不是绝对安全的,gh-ost是通过MySQL的复制机制来实现数据的复制和追加的,它无法实时感知到原表的更新操作,为了解决这个问题,gh-ost在复制数据之前会记录原表的binlog位置,并在复制完成后再次检查这个位置。如果原表在复制过程中被更新了,gh-ost会重新执行复制过程,确保副本上的临时表与原表的数据保持一致。

        所以还是要在业务低峰期操作表结构变更。

         2、副本数据一致的时候加锁,Ghost lock是一种特殊的表级别锁,它会锁定主表,基于MySQL的表级别锁机制实现。在执行DDL操作之前,会使用ALTER TABLE语句对主表进行加锁。这个ALTER TABLE语句中使用的锁模式是`LOCK=EXCLUSIVE`,它会锁定整个表,阻止其他会话对表进行写入或修改。

        3、这一步是关键的,交换表名,可以按照下面这个sql理解下,由于已经被锁不会有数据影响

ALTER TABLE `temp_a` RENAME TO `temp_b`, 
`a` RENAME TO `temp_a`, 
`temp_b` RENAME TO `a`;

        最后在把副本删除就可以了

2、MYSQL Error: this authentication plugin is not supported

        其实真正报的错是这个,这个错是当连接到MySQL Docker时,应用程序一直报告错误:这个身份验证插件不受支持。

        查到是default_authentication_plugin配置的身份插件有问题,又碰到这个db实例在阿里云上面,而新版本的MySQL(8.0或以上)将root用户使用的插件更新为caching_sha2_password。种种巧合才触发了这个问题。这个问题是在交换表名的阶段发生的。

解决方案如下:
(1)降级并使用较旧版本的MySQL。
(2)将插件更改为mysql_native_password。

3、为什么交换表名的时候会因为身份验证插件是`caching_sha2_password`,导致一直ddl失败,gh-ost创建副本同步数据就不会发生这个问题?

        爱思考的同学一定想到了,为什么是在交换表名的时候因为身份验证失败,再次之前gh-ost又是创建副本又同步数据又查log的,为什么这些操作没有导致身份验证失败?

        gh-ost创建副本同步数据时不会出现这个问题,是因为在创建副本时,MySQL会将副本的身份验证插件设置为与主库相同的插件。因此,在副本上执行DDL操作时,身份验证插件与主库相同,不会出现身份验证失败的情况。

        而在交换表名时,由于gh-ost需要在主库上执行DDL操作,因此需要使用主库的身份验证插件进行身份验证。如果主库的身份验证插件是`caching_sha2_password`,而gh-ost使用的是旧版本的MySQL客户端,那么就可能会出现身份验证失败的情况。

三、总结

        在使用mysql8.0的时候要注意default_authentication_plugin插件的设置。以上是作者交流和阅读相关资料的总结,有不同想法欢迎讨论。

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

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

相关文章

使用零宽字符,隐藏信息(加密、解密)

零宽字符就是零宽度字符是一种不可见,不可打印的字符。它们主要用于调整字符的显示格式。 常见的零宽字符有: 使用零宽字符给信息加密: 通过零宽字符来加密文本,我们需要先将文本转成二进制的形式即只包含0和1,并使用…

设计模式 - 备忘录模式

目录 一. 前言 二. 实现 三. 优缺点 一. 前言 备忘录模式又称快照模式,是一种行为型设计模式。它可以在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保存这个状态,以便在需要的时候恢复到原先保存的状态。在不违反封装的情况…

Python数据攻略-递归方式实现json多层级数据展平

之前介绍过使用pandas如何展平json的多层数据,如果有兴趣可以参考文章 Python数据攻略-Pandas的json_normalize方法 Python数据攻略-递归方式实现json多层级数据展平 今天再介绍一个非常好用的使用递归的方式展平json数据。 文章目录 数据处理目标操作示例核心函数方法操作…

【力扣每日一题】2023.10.11 奖励最顶尖的k名学生

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目给我们两个字符串数组,分别表示正面评价的单词和负面评价的单词。再给我们n个学生的评语,评语中有一个正面单…

利用无线通信技术搭建蒸汽流量远程监测系统

一、应用背景 2021年国务院政府工作报告中指出,扎实做好碳达峰、碳中和各项工作,制定2030年前碳排放达峰行动方案,优化产业结构和能源结构,特别是近期煤炭价格上涨导致蒸汽价格大幅上涨,节能减排显得更加重要&#xf…

@ConditionalOnProperty 注解的四个属性解释

ConditionalOnProperty(prefix "qiaoyue.tasks.scheduled", name "enabled", havingValue "true", matchIfMissing true) public class ScheduledTasks {ConditionalOnProperty 它主要是通过自身的两个属性来控制自动配置是否生效&#xff0…

Lumen/Laravel - 事件机制原理与工作流程 - 探究

1.应用场景 主要用于学习与探究Lumen/Laravel的事件机制原理与工作流程。 2.学习/操作 1.文档阅读 chatgpt & 其他资料 2.整理输出 2.1 是什么 TBD 2.2 为什么需要「应用场景」 TBD 2.3 什么时候出现「历史发展」 TBD 2.4 怎么实践 TBD 截图 后续补充 ... 3.问题…

Springboot使用sqlcipher4加密sqlite数据库

在有些业务场景,需要使用sqlite数据库,但sqlite数据库生的db文件,是明文的,该文件被别人拿到,就可以看到里面的所有数据,非常不安全,市面上有很多对sqlite数据库文件加密的方式,但都…

思科模拟校园网建设方案(中型局域网设计)

好久不见,从去年12月份更新linux文章到今年五月份更新计算机网络文章,到目前为止已经写了99篇了,最近也是在安全厂商实习断更了很久,趁着今天不忙,拿出这个压箱底的宝贝来纪念我来到csdn的第100篇博客,可供…

Web 客户端数据库 IndexedDB 速览及应用

#1 概述 IndexedDB 是一种底层 API,用于在客户端存储大量的结构化数据(也包括文件/二进制大型对象,如 blobs)。该 API 使用索引实现对数据的高性能搜索。虽然 Web Storage 在存储较少量的数据很有用,但对于存储更大量…

QTableWidget 表格增删数据

QTableWidgetQTableWidgetQTableWidget部分使用方法,如在表格中插入或删除一行数据以及清空表格数据等。在添加数据时,设置了条件判断如正则表达式,若用户输入的数据不合法,则添加失败并提示用户错误的地方,便于用户修…

python结合excel数据轻松实现接口自动化测试

在刚刚进入测试行业的时候,最开始也是做功能测试,我想很多伙伴和我一样,觉得自动化测试都很高端,很神秘。迫不及待的想去学习作自动化测试。 以前比较常用数据库python做自动化,后面发现excel个人觉得更加适合&#x…

【java学习】面向对象编程(12)

文章目录 前言1. 什么是"面向对象"的编程思想?1.1. 面向对象与面向过程 2. java类及类成员 前言 学习路线: 学习面向对象内容的三条主线1. java类及类成员2. 面向对象的三大特征3. 其他关键字 学习内容: 要学习的内容1. 面向对象与面向过…

内网渗透——黄金票据与白银票据

文章目录 黄金票据与白银票据1. 背景2. 具体实现2.1 Kerberos协议认证流程 3. 黄金票据3.1 条件3.2 适用场景3.3 利用方式 4. 白银票据4.1 条件4.2 适用场景4.3 利用方式 5. 金票和银票的区别5.1 获取的权限不同5.2 认证流程不同5.3 加密方式不同 6. 经典面试题6.1 什么是黄金票…

(蓝宝书)网络安全——CTF那些事儿

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。关…

【常用页面记录】vue+elementUI实现搜索框+上拉加载列表

一、代码 <template><div class"mainBox"><div class"headbox"><el-input placeholder"请输入文件名称搜索" prefix-icon"el-icon-search" v-model"fileName" :clearable"true" change&qu…

Spring5应用之事务处理

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 参考文献前言事务…

【Vuex+ElementUI】

一、导言 1、引言 Vuex是一个用于Vue.js应用程序的状态管理模式和库。它建立在Vue.js的响应式系统之上&#xff0c;提供了一种集中管理应用程序状态的方式。使用Vuex&#xff0c;您可以将应用程序的状态存储在一个单一的位置&#xff08;即“存储”&#xff09;中&#xff0c;…

软件‘小程序‘前台开发软件定制的知识|app网站搭建

软件&#xff0c;小程序&#xff0c;前台开发软件定制的知识 随着互联网的快速发展&#xff0c;软件&#xff0c;小程序&#xff0c;前台开发软件定制已经成为了企业必备的工具。它可以帮助企业更好地管理业务&#xff0c;提高效率&#xff0c;增强用户体验。那么&#xff0c;什…

英语——分享篇——每日100词——701-800

audience——n.听众&#xff0c;观众&#xff0c;读者——au澳大利亚(编码)di弟(拼音)ence摁厕(拼音)———听众在澳大利亚被弟弟摁倒在厕所 flu———n.流行性感冒———flu俘虏————俘虏带来流行性感冒 belt———n.腰带&#xff0c;皮带———b6(象形)el饿狼(拼音)t伞(…