Mysql
捕捉無響應/高負載的mysql,也許是用monit?
我間歇性地出現 mysql 導致機器上的高負載,使 Web 應用程序不可用。我正在使用monit來監控它,但它沒有發現問題,顯然是因為它仍然可以連接到mysql。這是我的mysql監控腳本:
check process mysqld with pidfile /var/run/mysqld/mysqld.pid group database start program = "/etc/init.d/mysql start" stop program = "/etc/init.d/mysql stop" if failed port 3306 protocol mysql then restart if failed unixsocket /var/run/mysqld/mysqld.sock protocol mysql then restart if 5 restarts within 5 cycles then timeout
當問題發生時,機器上的負載很高,mysql 佔用了幾乎所有的 cpu。您仍然可以使用
mysql
命令行工具“登錄”到 mysql,但任何選擇/更新都不會響應。當這個問題出現時,我應該用什麼來捕捉?
通過 MySQL 客戶端檢查程序列表。(
show full processlist;
) 從那時起,您可以隔離查詢在哪裡執行以及是否需要優化或是否應該停止優化。從那時起,您可以
kill $NUMBER;
終止問題連接,而不是重新啟動 MySQL。由於不希望的操作重新啟動已經在執行的東西應該是最後的手段,通常是一個壞主意。尤其是數據庫,因為您冒著數據風險。
當然,具體情況決定了不同的行動。例如,如果您知道特定軟體中存在失控的記憶體洩漏,則沒有任何操作正在執行,恢復資源的唯一方法是重新啟動:然後這樣做。
此外,如果您每分鐘都損失大量資金,則重新啟動可能是合理的。例如,如果您看不到快速恢復的路徑,並且您認為重新啟動將恢復服務,那麼如果數據或應用程序的風險將小於您正在損失的資金,那麼重新啟動將是有意義的。此原則適用,但可能會根據您的行業、服務和 SLA 略有不同。