查看MySQL數(shù)據(jù)庫的死鎖日志

10多年的金湖網(wǎng)站建設(shè)經(jīng)驗(yàn),針對設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整金湖建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“金湖網(wǎng)站設(shè)計(jì)”,“金湖網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
1. 使用終端或命令提示符登錄到MySQL,輸入命令:mysql -h xxxx.xxx.xxx -P 3306 -u username -p?解釋:xxxx.xxx.xxx是數(shù)據(jù)庫IP地址,username是數(shù)據(jù)庫用戶名,輸入命令后,會讓你輸入username對應(yīng)的密碼,就可以登錄了
2. 如何查看MySQL數(shù)據(jù)庫的死鎖信息?在MySQL客戶端下輸入命令:?show engine innodb status \G;
3. 如何定位MySQL數(shù)據(jù)庫的死鎖信息?在打印出來的信息中找到“LATEST DETECTED DEADLOCK”一節(jié)內(nèi)容,看圖中紅線
4. 如何分析日志,定位死鎖原因?看3里面的圖,紫色劃線部分?分析:?事務(wù)1,等待?RECORD LOCKS space id 553 page no 376 n bits 368 index `index_user_id` of table `tbj`.`score_user`,這個(gè)位置的X鎖?事務(wù)2,持有?RECORD LOCKS space id 553 page no 376 n bits 368 index `index_user_id` of table `tbj`.`score_user`這個(gè)地方的S鎖?事務(wù)2,等待這個(gè)地方的X鎖?理論上這個(gè)事務(wù)2是可以提交的不會,死鎖,但是這個(gè)事務(wù)日志只打印最后一部分死鎖,信息,這里面隱含的條件是,事務(wù)1也持有?RECORD LOCKS space id 553 page no 376 n bits 368 index `index_user_id` of table `tbj`.`score_user`這個(gè)地方的S鎖,這樣,事務(wù)2不能加X鎖,同時(shí)事務(wù)1也不能加X鎖,產(chǎn)生死鎖。
1,查看數(shù)據(jù)庫的隔離級別:
mysql select @@tx_isolation;
2,去查看先當(dāng)前庫的線程情況:
mysql show processlist;
沒有看到正在執(zhí)行的慢SQL記錄線程,再去查看innodb的事務(wù)表INNODB_TRX,看下里面是否有正在鎖定的事務(wù)線程,看看ID是否在show full processlist里面的sleep線程中,如果是,就證明這個(gè)sleep的線程事務(wù)一直沒有commit或者rollback而是卡住了,我們需要手動kill掉。
mysql SELECT * FROM information_schema.INNODB_TRX;
如果有記錄,則找到trx_mysql_thread_id這個(gè)字段對應(yīng)的id, 將其kill掉。假如id=100
mysql-kill 100
SELECT CONCAT_WS('','kill',' ',t.trx_mysql_thread_id,';')a FROM information_schema.INNODB_TRX t;
4,總結(jié)分析
表數(shù)據(jù)量也不大,按照普通的情況來說,簡單的update應(yīng)該不會造成阻塞的,mysql都是autocommit,不會出現(xiàn)update卡住的情況,去查看下autocommit的值。
mysql select @@autocommit;
1表示自動提交。0表示不自動提交。
如果你發(fā)現(xiàn)自己的數(shù)據(jù)庫autocommit=0,將它改正吧。
解除死鎖的兩種方法:
(1)終止(或撤銷)進(jìn)程。終止(或撤銷)系統(tǒng)中的一個(gè)或多個(gè)死鎖進(jìn)程,直至打破循環(huán)環(huán)路,使系統(tǒng)從死鎖狀態(tài)中解除出來。
(2)搶占資源。從一個(gè)或多個(gè)進(jìn)程中搶占足夠數(shù)量的資源,分配給死鎖進(jìn)程,以打破死鎖狀態(tài)。
鎖是需要事務(wù)結(jié)束后才釋放的。
一個(gè)是 MVCC,一個(gè)是兩階段鎖協(xié)議。
為什么要并發(fā)控制呢?是因?yàn)槎鄠€(gè)用戶同時(shí)操作 MySQL 的時(shí)候,為了提高并發(fā)性能并且要求如同多個(gè)用戶的請求過來之后如同串行執(zhí)行的一樣(為了解決臟讀、不可重復(fù)讀、幻讀)
官方定義:
兩階段鎖協(xié)議是指所有事務(wù)必須分兩個(gè)階段對數(shù)據(jù)加鎖和解鎖,在對任何數(shù)據(jù)進(jìn)行讀、寫操作之前,事務(wù)首先要獲得對該數(shù)據(jù)的封鎖;在釋放一個(gè)封鎖之后,事務(wù)不再申請和獲得任何其他封鎖。
對應(yīng)到 MySQL 上分為兩個(gè)階段:
但是兩階段鎖協(xié)議不要求事務(wù)必須一次將所有需要使用的數(shù)據(jù)加鎖(innodb在需要的索引列數(shù)據(jù)才鎖行),并且在加鎖階段沒有順序要求,所以這種并發(fā)控制方式會形成死鎖。
MySQL有兩種死鎖處理方式:
死鎖檢測 (默認(rèn)開啟)
死鎖檢測的原理是構(gòu)建一個(gè)以事務(wù)為頂點(diǎn)、鎖為邊的有向圖,判斷有向圖是否存在環(huán),存在即有死鎖。
回滾
檢測到死鎖之后,選擇插入更新或者刪除的行數(shù)最少的事務(wù)回滾,基于 INFORMATION_SCHEMA.INNODB_TRX 表中的 trx_weight 字段來判斷。
收集死鎖信息:
減少死鎖:
死鎖解決:
一、show ENGINE INNODB status
查看死鎖位置,分析。
二、
首先解決死鎖可以從死鎖發(fā)生的條件入手,最容易解決的就是更改獲取資源的順序;
其次是避免長事務(wù),讓事務(wù)執(zhí)行的時(shí)間盡可能少,讓事務(wù)的覆蓋范圍盡可能小,長事務(wù)會導(dǎo)致并發(fā)度降低,且會有更多的SQL查 詢延遲;
給整個(gè)方法加事務(wù)是否是必須的?可以不加事務(wù)的盡量不加。
網(wǎng)站欄目:mysql怎么排查死鎖 mysql查詢死鎖sql
轉(zhuǎn)載注明:http://chinadenli.net/article10/hijhdo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、品牌網(wǎng)站建設(shè)、定制開發(fā)、網(wǎng)站建設(shè)、網(wǎng)站制作、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)