前幾天在群里有個(gè)朋友問(wèn)到max_allowed_packet被自動(dòng)重置的問(wèn)題,于是打算寫(xiě)個(gè)文章來(lái)描述下,因?yàn)橛龅竭@個(gè)問(wèn)題的人不少,但是提到的解決方案幾乎沒(méi)有。
max_allowed_packet指的是服務(wù)器接收的包的大小,該值設(shè)置過(guò)小,可能導(dǎo)致數(shù)據(jù)寫(xiě)入失敗,通??梢酝ㄟ^(guò)修改my.cnf或者在命令行通過(guò)set max_allowed_packet來(lái)實(shí)現(xiàn)。
但是在實(shí)際情況中,我們很多時(shí)候會(huì)遇到這樣的一種情況:通過(guò)各種方式設(shè)置了max_allowed_packet的值,但是一段時(shí)間后,max_allowed_packet還是莫名其妙的變成了1024,而my.cnf里面的值還是之前設(shè)置的大于1024的值。
這個(gè)問(wèn)題看起來(lái)很詭異,但是至少可以確定一點(diǎn),那就是該值通過(guò)某某連接,在連接里面通過(guò)set命令給重置了。
一般來(lái)說(shuō),引起該問(wèn)題不外乎如下幾種情況:
設(shè)置不當(dāng):設(shè)置該值需要修改my.cnf配置,但是一共需要設(shè)置兩處,如下:
[client]
max_allowed_packet=10240
[mysqld]
max_allowed_packet=10240
mysqld里面控制的是服務(wù)端,mysql里面控制的是客戶(hù)端,如果只設(shè)置一處,則當(dāng)有客戶(hù)端連接的時(shí)候,該值會(huì)被重置。
內(nèi)存不足:當(dāng)mysql執(zhí)行大批次查詢(xún)語(yǔ)句大時(shí)候,因?yàn)榉?wù)器內(nèi)存不足,引起預(yù)警,mysql會(huì)重置這個(gè)值,已保證數(shù)據(jù)庫(kù)的穩(wěn)定。
黑客攻擊:其實(shí)在生產(chǎn)環(huán)境下,大多數(shù)的情況,還真是被攻擊了,針對(duì)這個(gè)情況,需要集中查看,安全不容小覷,mysql 有g(shù)eneral_log, 會(huì)記錄所有執(zhí)行的sql命令,因?yàn)楹馁M(fèi)性能,默認(rèn)是關(guān)閉。