通信信息包是發(fā)送至MySQL服務(wù)器的單個SQL語句,或發(fā)送至客戶端的單一行。
在MySQL 5.1服務(wù)器和客戶端之間最大能發(fā)送的可能信息包為1GB。
當(dāng)MySQL客戶端或mysqld服務(wù)器收到大于max_allowed_packet字節(jié)的信息包時,將發(fā)出“信息包過大”錯誤,并關(guān)閉連接。對于某些客戶端,如果通信信息包過大,在執(zhí)行查詢期間,了能回遇到“丟失與MySQL服務(wù)器的連接”錯誤。
客戶端和服務(wù)器均有自己的max_allowed_packet變量,因此,如你打算處理大的信息包,必須增加客戶端和服務(wù)器上的該變量。
如果你正在使用mysql客戶端程序,其max_allowed_packet變量的默認(rèn)值為16MB。要想設(shè)置較大的值,可用下述方式啟動mysql:
mysql> mysql --max_allowed_packet=32M |
它將信息包的大小設(shè)置為32MB。
服務(wù)器的默認(rèn)max_allowed_packet值為1MB。如果服務(wù)器需要處理大的查詢,可增加該值(例如,如果準(zhǔn)備處理大的BLOB列)。例如,要想將該設(shè)置為16MB,可采用下述方式啟動服務(wù)器:
mysql> mysqld --max_allowed_packet=16M |
也能使用選項文件來設(shè)置max_allowed_packet。要想將服務(wù)器的該變量設(shè)置為16MB,可在選項文件中增加下行內(nèi)容:
[mysqld] max_allowed_packet=16M |
增加該變量的值十分安全,這是因為僅當(dāng)需要時才會分配額外內(nèi)存。例如,僅當(dāng)你發(fā)出長查詢或mysqld必須返回大的結(jié)果行時mysqld才會分配更多內(nèi)存。該變量之所以取較小默認(rèn)值是一種預(yù)防措施,以捕獲客戶端和服務(wù)器之間的錯誤信息包,并確保不會因偶然使用大的信息包而導(dǎo)致內(nèi)存溢出。
如果你正是用大的BLOB值,而且未為mysqld授予為處理查詢而訪問足夠內(nèi)存的權(quán)限,也會遇到與大信息包有關(guān)的奇怪問題。如果懷疑出現(xiàn)了該情況,請嘗試在mysqld_safe腳本開始增加ulimit -d 256000,并重啟mysqld。