大查询对mha切换的影响

先说结论:

如果在线MHA切换,为了减少对系统的影响,应该先让实例只读,等待大查询结束之后,才开始切换,而更好的做法的,自动kill掉大查询,确保切换影响时间最少。

(1)正常的MHA切换程序中,mha会调用FLUSH  NO_WRITE_TO_BINLOG TABLES这个语句;

(2)这个时候,如果有大的查询在执行,mha就会需要等待。同事前天做了一次mha在线切换,切换的时候,当时有如下的语句正在执行:

select gpl.ID, gpl.GAME, gpl.LOGIN_ACCOUNT, gpl.PRODUCT_ID, gpl.PURCHASE_TOKEN, gpl.ORDER_ID, gpl.CO_ORDER_ID, gpl.REFUND_STATUS, p.GPID, p.TWD_MONEY, p.ORDER_TIME, gpl.DATETIME,gpl.CHARGE_TIME, p.PACKAGE_NAME, p.PAY_IP from google_play_logs gpl left join payment p on p.LOGIN_ACCOUNT = gpl.LOGIN_ACCOUNT and p.ORDER_ID = gpl.ORDER_ID where gpl.DATETIME >= ‘2017-09-19 00:30:02‘ and gpl.REFUND_STATUS = 1 order by gpl.ID desc

(3)这个语句正常的时候,执行只需要4秒钟不到,就算没有缓存,也只需要1分多钟,而这里执行了480秒,是因为系统资源被占用,备份导致了IO忙,IO忙导致SQL语句执行效率低,从而放大了flush table的影响,导致问题的出现。

(4)测试中能发现,flush table,只需要等待比它早开始的查询结束,flush table就能完成,并不需要等到全部查询完成。

如下图,id 9394执行了flush table,它和time是121秒,说明它已经执行了121秒,但id 9394被阻塞了,它被id 21751线程所阻塞,进程21751在flush table之前已经开始执行,它已经执行了137秒。

进程6333也是一个查询语句,它的状态也是waiting for table flush,但它的开始时间晚,time才87秒。

下面这个图,只有6333存在,说明21751执行完成之后,9394随之执行完成,9394不会被6333所阻塞。

(5)再解释一下,为什么同事在ctrl+c终止了mha的切换之后,故障并没有马上恢复,那是因为ctrl+c虽然终止mha程序,但flush table其实并不能被终止,测试如下。

在这里id6333执行insert into t1(b) values (‘ccc‘);它被阻塞了,但我们执行kill 21751,kill掉flush table,之后再通过show processlist,能看到insert into t1(b) values (‘ccc‘)的state并没有变化,它仍然处于:Waiting for table flush 状态,

需要等到select *,sleep(30) from t1 limit 5 执行完毕,insert into t1(b) values (‘ccc‘);才会成功执行。

时间: 2024-08-02 01:49:40

大查询对mha切换的影响的相关文章

mysql内存数据淘汰机制和大查询会不会把内存打爆?

首先我们说一下大查询会不会把内存打爆? 比如说主机内存有5g,但是我们一个大查询的数据有10g,这样会不会把内存打爆呢? 答案:不会 为什么? 因为mysql读取数据是采取边读边发的策略 select * from t1 这条语句的流程是这样的 1.读取数据放入net_buffer中,net_buffer大小是由net_buffer_length控制 2.net_buffer放满了以后,调用网络栈发送数据到客户端 3.如果发送成功就清空net_buffer,继续读取数据放入net_buffer中

windbg分析一次大查询导致的内存暴涨

项目上反馈了一个问题,就是在生产环境上,用户正常使用的过程中,出现了服务器内存突然暴涨,客户有点慌,想找下原因. 讲道理,内存如果是缓慢上涨一直不释放的话,应该是存在内存泄漏的,这种排查起来比较困难,还得找开发一块看:但像这种突然暴涨的,肯定是把某些大对象放到内存里了,而最有可能的,就是大查询了,比如把几百万数据查出来这种,但这种一般等用户用完这个功能内存就会降下来. 环境:IIS+.net framework.发现是w3wp进程一直在涨内存,也就是iis,确实是程序的锅. 分析内存问题的话,一

存储过程中使用参数和变量作为查询条件对性能的影响?

今日匆忙中写了2各存储过程,查询的表,查询的结构,返回的值基本一样,就是对参数的使用有点不同. 晚上到家想着优化下,看看能不能合并了.在几次重写后,拿着几个版本查看执行计划时,发现个以前没注意的问题. 第一个SP传入的2个时间参数直接用于里面的查询条件. 第二个SP传入的2个时间参数,在SP内又定义了2个时间变量,将参数通过简单计算后Set给了2个变量,然后在查询中使用这2个变量作为条件. 这2个SP,在执行开销上相差数倍. 在外面套一层SP,把时间算好了再当参数传给第二个SP,修改SP直接使用

MySQL MHA切换失败一例

先看下引起问题的密码啥样, 包含两个特殊字符[和~. $ egrep -w 'user|password' /etc/masterha/app1.cnf password=P[AI3M~5z user=mha_mgr 用户mha_mgr的作用, 如下文档中的说明, 可见其对数据库实例起到管理的作用. MySQL administrative database username to the target MySQL server. This should be root because it r

壹诺信用:多次查询信用,是否会影响申请信用卡?

众所周知,发卡机构对于信用卡的审批有着严格的条件,如果达不到要求很容易被拒.影响信用卡的申请因素有很多,比如年龄.工作.住房等等. 其中,个人征信也是非常重要的一项参考指标,信用记录良好是申卡成功的基础.那么多次查询信用是否会影响信用卡的申请? 信用查询太多还是会对办理信用卡产生一定的影响.银行审批信用卡的时候除了会查询申请人近半年的征信逾期记录外,对于征信报告上的查询次数也会做参考,并且对于不同的查询次数的处理方式不同. 例如:申请人的征信记录在6个月内被查询10次以上,这种就是频率太高了,如

求问各位大神关于fragment切换,软键盘隐藏的问题

============问题描述============ 问题背景,一个顶层linearlayout下面有个两个子linearlayout,第一个子linearlayout里面给一排button,可以水平滑动,第二个子linearlayout里面用来放fragment,xml如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="

mysql,show processlist,查询一直sending data,影响查询性能

MariaDB [(none)]> show processlist; +--------+--------+------------------+---------+-------------+---------+---------------+----------------------+-------- | Id     | User   | Host             | db      | Command     | Time    | State         | Info

MHA 切换的2个异常(masterha_master_switch line 53)

MHA 在测试手动故障转移和在线切换的过程中,碰到了2个比较诡异的问题,在使用IP地址调用的时候均无法测试成功,出现了Detected dead master xxx does not match with specified dead master以及xxx is not alive.下面是这2个错误问题的描述及解决方案. 1.MHA配置文件[[email protected] ~]# more /etc/masterha/app1.cnf [server default]manager_wo

大数据对人类思维的影响

每个人的行动决策思想来源都是对现实的认识与判断,大数据思维能使我们在决策过程中打破原有思维框架的局限.以数据为基础的决策有两个步骤:利用庞大的数据量对事物作出理解和判断,而后作出行动决策. 决策者的价值观会影响行动决策,人们对事物的理解和判断亦受制于自身思维框架的局限.物理学家在分析一个实验时,会很自然地应用物理定律来思考.理解和判断.所用的概念和语言也会有强烈的物理特征:社会科学家在面对一件事物时,首先也会优先从人际关系.社会地位.历史背景.社会效益等方面去分析.所用的概念和语言皆带有社会人文