Mysql

更改了 max_allowed_pa cket 並仍然收到“數據包太大”錯誤

  • September 10, 2019

我使用 mysqldump 創建一個用於備份的平面文件。我已使用此文件在備用伺服器上重新創建數據庫。我在命令行上通過 ssh 執行導入過程,但收到多個Packet too Large錯誤。

我用更大的 max_allowed_pa​​cket(即 1000M)重新啟動了 mysql,但仍然收到錯誤。我什至嘗試在導入文件中設置 max_allowed_pa​​cket,仍然收到錯誤。

有沒有辦法確保設置 max_allowed_pa​​cket 和/或使用 mysqldump 來創建一個不會導致此問題的文件?

以供參考:

未壓縮的 mysqldump 文件約為 2GB

數據庫類型為 INNODB

我首先想到的是max_allowed_pa​​cket實際控制的內容。這是我發現的:

根據“Understanding MySQL Internals” (ISBN 0-596-00957-7) 的第 99 頁,這裡有第 1-3 段對其進行解釋:

MySQL 網路通信程式碼是在查詢總是相當短的假設下編寫的,因此可以以一個塊的形式發送到伺服器並由伺服器處理,在 MySQL 術語中稱為*數據包。*伺服器為臨時緩衝區分配記憶體來儲存數據包,並請求足夠的記憶體以完全容納它。這種架構需要採取預防措施來避免伺服器記憶體不足——這個選項可以實現數據包大小的上限。

與此選項相關的程式碼可在 sql/net_serv.cc中找到。查看my_net_read(),然後按照對**my_real_read()**的呼叫並特別注意 net_realloc()

此變數還限制了許多字元串函式的結果的長度。有關詳細資訊,請參閱sql/field.ccsql/intem_strfunc.cc

鑑於 max_allowed_pa​​cket 的定義,然後我從 ServerFault 中發現了其他內容:如果您有很多大 blob 對象,innodb_log_file_size 和 innodb_log_buffer_size 的組合必須大於最大 blob 對象的十倍

牢記這兩件事,我會將 /etc/my.cnf 中的 innodb_log_file_size 增加到允許的最大大小 2047M。這當然需要以下

service mysql stop
rm -f /var/lib/mysql/ib_logfile*
service mysql start

這將容納您數據中可能存在的任何大塊。

引用自:https://dba.stackexchange.com/questions/886