4 回答

TA貢獻1780條經驗 獲得超1個贊
對我來說,解決這個問題的是增加最大數據包大小。
在 中my.cnf
,我添加了:
max_allowed_packet=200M
然后service mysql stop
,,,service mysql start
它成功了:)

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

TA貢獻1943條經驗 獲得超7個贊
我遇到了一個可重現的類似問題,這是一個編程錯誤:
我使用的是無緩沖的數據庫游標,并且在觸發其他數據庫操作之前沒有關閉游標。拋出的確切錯誤是Packets out of order. Expected 1 received 2.

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