4 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個(gè)贊
對(duì)我來(lái)說(shuō),解決這個(gè)問(wèn)題的是增加最大數(shù)據(jù)包大小。
在 中my.cnf
,我添加了:
max_allowed_packet=200M
然后service mysql stop
,,,service mysql start
它成功了:)

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊
我們收到了類(lèi)似的關(guān)于數(shù)據(jù)包亂序的 PHP 警告。為我們解決這個(gè)問(wèn)題的是增加MySQL my.cnf 中的max_connections 。您當(dāng)前的 max_connections 可能是 1024。我們將其增加到 4096,警告消失了。在 MySQL 中,您可以使用以下命令查看當(dāng)前的 max_connections:
SHOW VARIABLES LIKE "%max_connections%"; or mysqladmin variables | grep max_connections

TA貢獻(xiàn)1943條經(jīng)驗(yàn) 獲得超7個(gè)贊
我遇到了一個(gè)可重現(xiàn)的類(lèi)似問(wèn)題,這是一個(gè)編程錯(cuò)誤:
我使用的是無(wú)緩沖的數(shù)據(jù)庫(kù)游標(biāo),并且在觸發(fā)其他數(shù)據(jù)庫(kù)操作之前沒(méi)有關(guān)閉游標(biāo)。拋出的確切錯(cuò)誤是Packets out of order. Expected 1 received 2.

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
首先要檢查的是wait_timeout
MySQL 服務(wù)器的時(shí)間,與應(yīng)用程序在查詢之間花費(fèi)的時(shí)間有關(guān)。通過(guò)在 SQL 查詢之間休眠時(shí)間超過(guò)wait_timeout秒,我能夠一致地重新創(chuàng)建此錯(cuò)誤。
如果您的應(yīng)用程序執(zhí)行查詢,然后在一段時(shí)間內(nèi)執(zhí)行其他操作,并且花費(fèi)的時(shí)間超過(guò)該時(shí)間,則 MySQL 服務(wù)器將終止連接,但您的 PHP 代碼可能不知道服務(wù)器已斷開(kāi)連接。如果 PHP 應(yīng)用程序隨后嘗試使用關(guān)閉的連接發(fā)出另一個(gè)查詢,它將生成此錯(cuò)誤(在我的測(cè)試中,與Expected 0 received 1
.
您可以通過(guò)以下方式解決此問(wèn)題:
wait_timeout
在服務(wù)器上全局?jǐn)U展或使用命令在每個(gè)會(huì)話的基礎(chǔ)上擴(kuò)展SET session wait_timeout=<new_value>;
捕獲錯(cuò)誤并重試一次
wait_timeout
當(dāng)您知道查詢之間已經(jīng)過(guò)去了超過(guò)幾秒時(shí),搶先重新連接到服務(wù)器。
此錯(cuò)誤也可能由于其他問(wèn)題而發(fā)生。我會(huì)檢查您是否使用持久連接,而不是一遍又一遍地連接到服務(wù)器。有時(shí),連接過(guò)程,尤其是許多并發(fā)工作人員的連接過(guò)程,會(huì)導(dǎo)致大量網(wǎng)絡(luò)開(kāi)銷(xiāo),從而可能導(dǎo)致此類(lèi)問(wèn)題。
另外,有時(shí),在生產(chǎn)、高交易量的服務(wù)器中,會(huì)發(fā)生奇怪的網(wǎng)絡(luò)問(wèn)題,并且這種情況可能只是偶爾發(fā)生,甚至在您的情況下似乎是通過(guò)環(huán)回接口發(fā)生的。
無(wú)論如何,最好編寫(xiě)您的代碼,以便它可以優(yōu)雅地處理錯(cuò)誤并重試。通常,您可以將 SQL 查詢包裝在 a 中try..catch
,以便在發(fā)生此錯(cuò)誤時(shí)捕獲它并重試。
- 4 回答
- 0 關(guān)注
- 332 瀏覽
添加回答
舉報(bào)