MySQL Timeout解析

shwenwen發表於2010-12-01

connect_timeout、interactive_timeout、wait_timeout、net_read_timeout、net_write_timeout、

[@more@]

“And God said, Let there be network: and there was timeout”
在使用MySQL的過程中,你是否遇到了眾多讓人百思不得其解的Timeout?
那麼這些Timeout之後,到底是程式碼問題,還是不為人知的匠心獨具?
本期Out-man,講述我們們MySQL DBA自己的Timeout。

先看一下比較常見的Timeout引數和相關解釋:
connect_timeout
The number of seconds that the mysqld server waits for a connect packet before responding with Bad handshake.
interactive_timeout
The number of seconds the server waits for activity on an interactive connection before closing it.
wait_timeout
The number of seconds the server waits for activity on a noninteractive connection before closing it.
net_read_timeout
The number of seconds to wait for more data from a connection before aborting the read.
net_write_timeout
The number of seconds to wait for a block to be written to a connection before aborting the write.

從以上解釋可以看出,connect_timeout在獲取連線階段(authenticate)起作用,interactive_timeout和wait_timeout在連線空閒階段(sleep)起作用,而net_read_timeout和net_write_timeout則是在連線繁忙階段(query)起作用。

獲取MySQL連線是多次握手的結果,除了使用者名稱和密碼的匹配校驗外,還有IP->HOST->DNS->IP驗證,任何一步都可能因為網路問題導致執行緒阻塞。為了防止執行緒浪費在不必要的校驗等待上,超過connect_timeout的連線請求將會被拒絕。

即使沒有網路問題,也不能允許客戶端一直佔用連線。對於保持sleep狀態超過了wait_timeout(或interactive_timeout,取決於CLIENT_INTERACTIVE標誌)的客戶端,MySQL會主動斷開連線。

即使連線沒有處於sleep狀態,即客戶端忙於計算或者儲存資料,MySQL也選擇了有條件的等待。在資料包的分發過程中,客戶端可能來不及響應(傳送、接收、或者處理資料包太慢)。為了保證連線不被浪費在無盡的等待中,MySQL也會選擇有條件(net_read_timeout和net_write_timeout)地主動斷開連線。

這麼多Timeout足以證明MySQL是多麼樂於斷開連線。而樂於斷開連線的背後,主要是為了防止服務端共享資源被某客戶端(mysql、mysqldump、頁面程式等)一直佔用。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/143526/viewspace-1042436/,如需轉載,請註明出處,否則將追究法律責任。

相關文章