之后的 show slave status 都被堵,是因為在執行 show slave status 前,會請求一個mutex:
mysql_mutex_lock(&LOCK_active_mi); res= show_slave_status(thd, active_mi); mysql_mutex_unlock(&LOCK_active_mi); 之前死鎖的 show slave status 沒有退出,后面的 show slave status 自然堵在這個 mutex 上,并且因為無法檢測 thd->killed,所以一直無法退出。
如果你使用的 MySQL 版本已經修掉這個bug,也就是在 5.6.21 版本及之后,那么 kill SQL 線程是安全的。
死鎖重現 如果為了測試或研究代碼,要想復現死鎖該怎么辦呢?如果直接在備庫執行一個 FTWRL,很可能是復現不了的,因為FTWRL是獲取2個鎖,全局讀鎖和全局 COMMIT 鎖,SQL 線程非常可能被全局讀鎖堵到(Waiting for global read lock),而不是被 COMMIT 鎖堵(Waiting for commit lock)。