我們?cè)谑褂肕ySQL的時(shí)候,由于各種原因會(huì)出現(xiàn)超時(shí)的情況,我認(rèn)為常見(jiàn)的有連接超時(shí)、等待超時(shí)、鎖等待超時(shí)等等。可以使用show variables 來(lái)看看默認(rèn)的各種類型超時(shí)時(shí)間。mysql中超時(shí)時(shí)間單位為秒。
show variables like '%timeout%'

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