處理MySQL資料庫出現大量Locked的一個案例
做為一款輕量級資料庫軟體,MySQL在使用過程中遇到訪問速度慢,或者無法響應這類的問題,解決方式基本都有定式,一般第一反應都會是登入到MySQL, show processlist看看當前連線狀態。
雖說簡單,但show processlist顯示的資訊確實是相當有用,有一回,三思收到反饋說MySQL查詢很慢,於是,趕緊登入到mysql中,執行show processlist檢視當前連線資訊:
mysql> show processlist;
+--------+-------------+--------------------+-------+---------+-------+----------------------------------+----------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+-------------+--------------------+-------+---------+-------+----------------------------------+----------------------------------------------------------------------------------+
| 1 | system user | | NULL | Connect | 342266| Waiting for master to send event | NULL |
| 2 | system user | | hdpic | Connect | 872 | Locked | UPDATE a SET STATE=0 WHERE ID=83752 |
| 123890 | hdpic_read | 192.168.1.79:54910 | hdpic | Query | 1512 | Sending data | select z.ID,z.TITLE,z.CREATOR_USER_NICK,z.CREATOR_USER_IDEN,z.LASTEDITOR_TI |
| 124906 | hdpic_read | 192.168.1.39:18844 | hdpic | Query | 845 | Locked | select * from a where ((ID = 78789) AND (STATE != 0)) |
| 124912 | hdpic_read | 192.168.1.39:18862 | hdpic | Query | 845 | Locked | select * from a where ((ID = 16031) AND (STATE != 0)) |
| 124914 | hdpic_read | 192.168.1.39:18865 | hdpic | Query | 837 | Locked | select * from a where ((ID = 39109) AND (STATE != 0)) |
| 124917 | hdpic_read | 192.168.1.39:18875 | hdpic | Query | 833 | Locked | select * from a where ((ID = 16031) AND (STATE != 0)) |
................
................
................一堆的Locked,怪不得慢啊,阻塞的時間不短了,十幾分鍾。
通常來說存在Locked就說明當前讀寫操作存在被阻塞的情況,一般我們看到鎖都會下意識認為是由於寫阻塞了讀,上面的結果看彷彿也符合這一特徵:只有一條UPDATE,而無數條的SELECT。猜是必須的,但不能瞎猜,這畢竟是線上系統,就算想殺連線的執行緒,也是要殺掉造成阻塞的那個,不能把所有Locked的全殺了,不然DBA本人很快也要被人殺了,因此具體情況如何還是需要繼續分析。
從show processlist檢視到的資訊來看,UPDATE的語句是很簡單的,分析a的表結構,該表為MyISAM表,ID為該表主鍵,該條更新應該能夠瞬間執行完,即使系統繁忙也不應該,而且通過檢視當前的系統狀態,整體負載很低,iostat中看I/Owait幾可忽略,該寫操作不太可能這麼長時間都沒有執行完。
這個時候再分析show processlist中顯示的資訊,發現id 123890的語句執行時間最長,肯定是在該UPDATE語句之前執行的,通過show full processlist檢視語句詳表,看到該查詢也訪問到了a表,經此分析,應該是該語句長時間的讀阻塞了寫,而被阻塞的寫操作由於處於最優先處理佇列,又阻塞了其它的讀。
不過這些都還只是我們的推論,考慮到線上系統服務的可靠性,最好還是能找到更確切的證據,而後再做操作。
mysqladmin命令有一個debug引數,可以分析當前MySQL服務的狀態資訊,同時也可以用來幫助我們定位當前鎖的詳細情況,這裡我們通過該命令分析一下當前MySQL服務的詳細狀態,執行mysqladmin命令如下:
[root@phpmysql02 data]# mysqladmin -ujss -p -S /data/3306/mysql.sock debug
Enter password:debug會將狀態資訊生成到mysql的錯誤檔案,一般鎖的資訊都會儲存在最後幾行,這裡我們在作業系統層error log最後幾行:
[root@phpmysql02 data]# tail -10 phpmysql02.err
Thread database.table_name Locked/Waiting Lock_type
2 hdpic.t_wiki_zutu Waiting - write Highest priority write lock
123890 hdpic.t_wiki_zutu_category Locked - read Low priority read lock
123890 hdpic.t_wiki_zutu_photo Locked - read Low priority read lock
123890 hdpic.t_wiki_zutu Locked - read Low priority read lock
124906 hdpic.t_wiki_zutu Waiting - read Low priority read lock從上述資訊可以看出,123890持有的讀鎖阻塞了2的寫入和124906的讀操作,這個狀態符合我們的推論,接下來處理就比較單純了,如果現狀不可接受,不能繼續等待,將123890殺掉,釋放資源即可:
mysql> kill 123890;
Query OK, 0 rows affected (0.00 sec)再次執行show processlist檢視:
mysql> show processlist;
+--------+-------------+--------------------+-------+---------+--------+----------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+--------+-------------+--------------------+-------+---------+--------+----------------------------------+------------------+
| 1 | system user | | NULL | Connect | 342390 | Waiting for master to send event | NULL |
| 124906 | hdpic_read | 192.168.1.39:18844 | hdpic | Sleep | 1 | | NULL |
| 124912 | hdpic_read | 192.168.1.39:18862 | hdpic | Sleep | 2 | | NULL |
| 124914 | hdpic_read | 192.168.1.39:18865 | hdpic | Sleep | 1 | | NULL |
| 124917 | hdpic_read | 192.168.1.39:18875 | hdpic | Sleep | 1 | | NULL |
| 124919 | hdpic_read | 192.168.1.39:18877 | hdpic | Sleep | 2 | | NULL |
................
................
................已經沒有Locked的連線,此時向前端人員詢問,告知響應慢的現象也已經消除,服務恢復正常。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-696781/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PHP+MySQL 千萬級資料處理案例(一)PHPMySql
- ES同步Mysql資料庫(包括出現問題怎麼處理哦)MySql資料庫
- 小程式處理大量資料列表的方法
- 前端如何處理十萬級別的大量資料前端
- 伺服器中了locked勒索病毒怎麼處理,locked勒索病毒解密,資料恢復伺服器解密資料恢復
- EasyExcel處理Mysql百萬資料的匯入匯出案例,秒級效率,拿來即用!ExcelMySql
- 一個簡單易用的資料庫壞塊處理方案資料庫
- mysql,sqlserver資料庫單表資料過大的處理方式MySqlServer資料庫
- 大量資料如何做分頁處理
- 分享2個近期遇到的MySQL資料庫的BUG案例MySql資料庫
- MySQL資料庫InnoDB壞頁處理修復MySql資料庫
- 記一次 MySQL 資料庫單表恢復事故處理MySql資料庫
- 計算機伺服器中了_locked勒索病毒如何處理,_locked勒索病毒解密資料恢復計算機伺服器解密資料恢復
- Oracle資料庫出現ORA-19566 LOB壞塊的處理記錄Oracle資料庫
- PHP+MySQL 千萬級資料處理案例(二) 分表的意義PHPMySql
- mysql 4.1.7忘記資料庫密碼的處理辦法MySql資料庫密碼
- 計算機伺服器中了locked勒索病毒怎麼處理,locked勒索病毒解密資料恢復計算機伺服器解密資料恢復
- OracleDG資料庫gap處理一列Oracle資料庫
- MySQL 處理重複資料MySql
- 計算機伺服器中了locked勒索病毒怎麼處理,locked勒索病毒解密處理流程計算機伺服器解密
- MySQL資料庫出現 Ignoring query to other databaseMySql資料庫Database
- Mysql資料庫亂碼出現的各個階段以及對應方法MySql資料庫
- MySQL:雙主單寫 主庫偶爾出現大量延遲的原因MySql
- laravel實現100w大量資料插入資料庫Laravel資料庫
- 使用navicat匯出查詢大量資料結果集並匯入到其他資料庫(mysql)資料庫MySql
- MySQL大量髒資料,如何只保留最新的一條?MySql
- Dede呼叫資料庫失敗,無法實現資料處理資料庫
- 用PHP的生成器yield處理大量資料,確實很快!PHP
- 【資料庫資料恢復】Oracle資料庫檔案出現壞塊報錯的資料恢復案例資料庫資料恢復Oracle
- Debezium zookeeper kafka mysql資料處理KafkaMySql
- 主庫千萬級的資料更新後,STANDBY日誌應用大量延遲的問題處理
- MySQL資料庫之mysql5.7基礎 檢視一個資料庫中的所有表MySql資料庫
- Polars提供Javascript的資料處理庫 - levelupJavaScript
- 一次ORACLE資料庫undo壞塊處理Oracle資料庫
- 建立一個MySQL資料庫中的datetime型別MySql資料庫型別
- 雲伺服器資料庫出現大量TIME_WAIT解決辦法伺服器資料庫AI
- 大量time-wait的處理方法AI
- MySQL資料庫的事務處理用法與例項程式碼詳解MySql資料庫
- 技術分享 | 用圖資料庫來降低 MySQL 處理多層關係的延遲(一)資料庫MySql