今天同事說他維護的mysql 的主從 上,從庫出現了2個多小時的延遲,
從庫 show full processlist;
會看到有一條 state 為system lock 的進程,在執行一條update語句,條件列send_id列上有二級索引。
查了如下帖子
MySQL:從庫出現system lock的原因_老葉茶館-CSDN博客
他分析的system lock 出現的原因,記錄一下,作為以后分析問題的參考。
從庫出現system lock 應該視為正在干活,而不是名稱看到的“lock”,這是由於slave端不存在語句(row格式)的執行,都是Event的直接apply,狀態沒有切換的機會,也可以認為是slave端狀態划分不嚴謹,其實做一個pstack就能完全看出問題。下面是產生的必要條件:
1. 由於大量的小事務,比如如UPDATE/DELETE table where處理一行數據,這會出現只包含一行數據庫的DML event的語句,如果table是一張大表,則會加劇這種可能。
2. 這個表上沒有主鍵或者唯一鍵,問題加劇。
3. 由於類似Innodb lock堵塞,也就是slave從庫修改了數據同時和sql_thread也在修改同樣的數據,問題加劇。
4. 確實I/O扛不住了,可以嘗試修改參數。
如果是大量的表沒有主鍵或者唯一鍵可以考慮修改參數slave_rows_search_algorithms 試試。
我認為mysql 主庫開了並行,從庫sql thread 為單線程,跑批時出現延遲應該正常。