更改了 max_allowed_pa cket 並仍然收到“數據包太大”錯誤
我使用 mysqldump 創建一個用於備份的平面文件。我已使用此文件在備用伺服器上重新創建數據庫。我在命令行上通過 ssh 執行導入過程,但收到多個
Packet too Large
錯誤。我用更大的 max_allowed_packet(即 1000M)重新啟動了 mysql,但仍然收到錯誤。我什至嘗試在導入文件中設置 max_allowed_packet,仍然收到錯誤。
有沒有辦法確保設置 max_allowed_packet 和/或使用 mysqldump 來創建一個不會導致此問題的文件?
以供參考:
未壓縮的 mysqldump 文件約為 2GB
數據庫類型為 INNODB
我首先想到的是max_allowed_packet實際控制的內容。這是我發現的:
根據“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.cc和 sql/intem_strfunc.cc。
鑑於 max_allowed_packet 的定義,然後我從 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
這將容納您數據中可能存在的任何大塊。