我們在使用MySQL的時候,由于各種原因會出現(xiàn)超時的情況,我認為常見的有連接超時、等待超時、鎖等待超時等等。可以使用show variables 來看看默認的各種類型超時時間。mysql中超時時間單位為秒。
show variables like '%timeout%'
默認超時時間
連接超時
- connect_timeout:這個我認為可以講是最常見的超時情況了,它是設(shè)置連接的超時時間,默認10秒。它主要指的是mysql客戶端與服務(wù)器之間的tcp連接結(jié)果,并且是多次連接的結(jié)果,每次連接除了基本的用戶名和密碼之外,還需要進行主機權(quán)限驗證、域名解析。如果此過程中有任何網(wǎng)絡(luò)故障,通過設(shè)置連接超時,可以防止他們之間反復(fù)進行連接重試,網(wǎng)絡(luò)故障不是一時半會能解決,超時設(shè)置可以使得程序正常中斷,便于我們后續(xù)操作。
- wait_timeout:默認值為28800秒。這個超時主要防止一些非網(wǎng)絡(luò)問題導(dǎo)致客戶端長期占用連接情況,例如某些原因?qū)е骆i表,而我們應(yīng)用卻一直要請求更新表,這樣如果超過了等待時間,mysql會主動斷開連接。
- interactive_timeout:默認值為28800秒。主要防止某些mysql服務(wù)器對象保持了睡眠狀態(tài)超過了交互式等待時間,mysql會主動斷開連接。交互式連接主要指的是客戶端在命令行窗口,什么都不操作,而服務(wù)器在等待輸入命令時候也要保持的連接。
- net_write_timeout:默認值60秒。主要是客戶端進行一個大數(shù)據(jù)查詢,mysql服務(wù)器返回結(jié)果集數(shù)據(jù)量很大,網(wǎng)絡(luò)傳輸數(shù)據(jù)會耗時,如果耗時超過60秒,mysql主動斷開,避免連接浪費。
- net_read_timeout:默認值60秒,與上述返回相反,客戶端讀取了這個大的數(shù)據(jù)源,如果超時,則mysql主動斷開。
鎖等待超時
- Innodb_lock_wait_timeout:默認值50秒,行鎖等待超時時間,當出現(xiàn)行級鎖鎖等待現(xiàn)象時候,鎖等待時間超過50秒,會導(dǎo)致行級鎖等待的sql語句回滾,如果希望整個事務(wù)回滾,需要開啟innodb_rollback_on_timeout參數(shù)。
- innodb_rollback_on_timeout:默認值為OFF,設(shè)置為on,則因行級鎖超時則會直接回滾整個事務(wù)操作。
由此可見,innodb存儲引擎一旦出現(xiàn)鎖超時異常,默認不會回滾事務(wù),這對應(yīng)用來說,非常不合理,所以鎖等待超時異常發(fā)生后,你的應(yīng)用程序應(yīng)該自定義處理,要嘛提交事務(wù),要嘛回滾事務(wù)。
復(fù)制連接超時
slave_net_timeout:mysql進行主從復(fù)制時候,當從服務(wù)器從主服務(wù)器讀取二進制日志失敗后,它會繼續(xù)等待slave_net_timeout設(shè)置的時間后,重連服務(wù)器并獲取數(shù)據(jù),默認值60秒。
MyISAM表延遲插入超時
delayed_insert_tiemout:為MyISAM存儲引擎設(shè)置的,主要為insert語句超時時間,在鎖表情況下,insert語句會一直處于等待中,當超過默認值300秒,則中斷連接。
總結(jié)
本節(jié)重點講解了各種超時情況,只有了解它們,我們才有可能針對性的優(yōu)化,并且在超時異常出現(xiàn)之后,能快速定位及處理。當然應(yīng)用環(huán)境不同,超時異常產(chǎn)生原因復(fù)雜,這都需要我們在生產(chǎn)中積累經(jīng)驗。