MySQL : max_allowed_pa cket 大於 1 GB 有可能嗎?
在數字取證領域,1GB 的數據包大小很常見,我遇到了麻煩。
使用內部 python 腳本,我們從檔案中提取文本,一些文件大到 4 GB,其中的文本可以輕鬆達到 1GB。然後我們使用 Sphinxsearch 使其可搜尋。
所以現在我在將這些文本插入數據庫時面臨數據包數據包太大錯誤。
機器是 64 核,64 GB 記憶體,可以輕鬆處理太字節。
所以我該怎麼做?
另一個問題是,在 < 1GB 數據包期間,增加 max_allow_packet 是否也會增加記憶體使用量?
作業系統:Linux 2.6.39 Mysql:5.1 和 5.5
在更改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 的 MySQL 文件,對於 max_allowed_packet 超過 1G 基本上無能為力。然而,關於 BLOB 和文本數據調整,還有一個方面需要探索。
Server Fault 中的另一個問題對 InnoDB 和 BLOB 做出了以下斷言:如果您有很多大 blob 對象,則innodb_log_file_size和innodb_log_buffer_size 的總和必須大於最大 blob 對象的十倍。如果你不這樣做(而且你不應該 [ 1 , 2 ]),那麼真的沒有必要為它費心。查看 MySQL 性能部落格以獲取有關如何計算的詳細報告。
還有一個方面需要考慮:使用選項net_buffer_length(預設 16K)作為 MySQL Packet 的初始化大小。數據包可以動態擴展為 max_allowed_packet。它不可避免地會縮回到 net_buffer_length 指定的大小。net_buffer_length 的最大值為 1M。您可能希望將此值設置為 1M。如果您通過 1G 加速可能無濟於事,但也不會受到傷害。
如果你真的想要一個大於 1G 的 MySQL 數據包,我引用的書摘會告訴你使用什麼原始碼來定義 MySQL 數據包內部。您可以自由嘗試提高限制。但是,如果程式碼假定 1G 除了設置明確的數字外,原始碼可能有其自身的內部限制。
我希望這個資訊有幫助!!!