勝日尋芳泗水濱咖城,無(wú)邊光景一時(shí)新冷尉。等閑識(shí)得東風(fēng)面殿怜,萬(wàn)紫千紅總是春 .....
嘟嘟嘟 ....手機(jī)響了
接到客服部的保障電話(huà),所有坐席都無(wú)法發(fā)送消息泻云,系統(tǒng)卡死了....
lz已迅雷不及掩耳盜鈴之勢(shì)檢查了服務(wù)器的各項(xiàng)資源贩绕,發(fā)現(xiàn)數(shù)據(jù)庫(kù)cpu有點(diǎn)高 ,登錄information_schema (Mysql自帶的數(shù)據(jù)庫(kù))壶愤,詳情介紹參考十分鐘了結(jié)MySQL information_schema(https://www.cnblogs.com/shengdimaya/p/6920677.html)
執(zhí)行sql 命令:
SELECT * FROM `PROCESSLIST` t WHERE t.COMMAND = 'Query' ORDER BY t.TIME desc;
PROCESSLIST這個(gè)命令可以查看到mysql 正在執(zhí)行線(xiàn)程淑倾,參數(shù)具體描述如下:
ID:連接mysql 服務(wù)器線(xiàn)程的唯一標(biāo)識(shí),進(jìn)程號(hào)征椒,可以通過(guò)kill來(lái)終止此線(xiàn)程的鏈接娇哆。
User:當(dāng)前線(xiàn)程連接數(shù)據(jù)庫(kù)的用戶(hù)
Host:顯示這個(gè)語(yǔ)句是從哪個(gè)ip 的哪個(gè)端口上發(fā)出的〔龋可用來(lái)追蹤出問(wèn)題語(yǔ)句的用戶(hù)
db: 線(xiàn)程連接的數(shù)據(jù)庫(kù)碍讨,如果沒(méi)有則為null
Command: 顯示當(dāng)前連接的執(zhí)行的命令,一般就是休眠或空閑(sleep)蒙秒,查詢(xún)(query)勃黍,連接(connect)
Time: 線(xiàn)程處在當(dāng)前狀態(tài)的時(shí)間,單位是秒
State:顯示使用當(dāng)前連接的sql語(yǔ)句的狀態(tài)晕讲,很重要的列覆获,后續(xù)會(huì)有所有的狀態(tài)的描述,請(qǐng)注意瓢省,state只是語(yǔ)句執(zhí)行中的某一個(gè)狀態(tài)弄息,一個(gè) sql語(yǔ)句,已查詢(xún)?yōu)槔诨椋赡苄枰?jīng)過(guò)copying to tmp table摹量,Sorting result,Sending data等狀態(tài)才可以完成
Info: 線(xiàn)程執(zhí)行的sql語(yǔ)句馒胆,如果沒(méi)有語(yǔ)句執(zhí)行則為null缨称。這個(gè)語(yǔ)句可以使客戶(hù)端發(fā)來(lái)的執(zhí)行語(yǔ)句也可以是內(nèi)部執(zhí)行的語(yǔ)句
上面簡(jiǎn)單介紹了一下 processlist命令,繼續(xù)故障分析:
如上圖祝迂,發(fā)現(xiàn)了這次故障的元兇睦尽,有update語(yǔ)句鎖表了
LOCK WAIT 55 lock struct(s), heap size 6544, 97 row lock(s)
MySQL thread id 1746505, OS thread handle 0x7f15c7383700, query id 192714382 10.53.158.69 direct_sit Sending data
update cx_etalk_session_relation k inner join (
select
r.id as id
from
cx_etalk_session_relation r, cx_etalk_session_history h
where
r.session_id = h.id and r.send_type = '1' and r.act_direction = '2' and r.is_receive = 'n'
and h.cust_channel = 'app'
and h.tenant_id = 'wandaph'
) m set k.is_receive = 'y' where k.id = m.id
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 1560 page no 159381 n bits 112 index `PRIMARY` of table `direct`.`cx_etalk_session_relation` trx id 523767684 lock_mode X locks rec but not gap waiting
通過(guò)MySQL執(zhí)行的sql快速的找到了,原始的sql語(yǔ)句
這條sql 是根據(jù)用戶(hù)手機(jī)設(shè)備號(hào)(deviceNo)去更新用戶(hù)未讀消息的標(biāo)志位液兽,不知道為啥用戶(hù)的設(shè)備號(hào)為空骂删,結(jié)果悲劇發(fā)生了
于是給開(kāi)發(fā)的新規(guī)范又多了一條:禁止在update , delete 語(yǔ)句中使用if動(dòng)態(tài)sql ,必須根據(jù)主鍵來(lái)更新跟刪除操作