當執行大批量 INSERT/UPDATE 或匯入大型 SQL 檔案時,常遇到 Packet too large 或 MySQL server has gone away 錯誤,罪魁禍首通常是 max_allowed_packet 參數設定過小。
SHOW VARIABLES LIKE '%max_allowed_packet%';
-- 輸出範例:1048576 (即 1MB,預設值)
[mysqld]
max_allowed_packet = 20M
配置檔位置查詢:mysql --help | grep my.cnf(Windows 為 my.ini)
修改後必須重啟 MySQL 服務。
-- 注意:必須使用位元組為單位的數值表達式
SET GLOBAL max_allowed_packet = 2*1024*1024*10; -- 20MB
-- 驗證是否生效(需重新連線)
SHOW VARIABLES LIKE '%max_allowed_packet%';
某台機器修改 my.cnf 重啟無效,SET GLOBAL max_allowed_packet = 16M 也失效,但 SET GLOBAL max_allowed_packet = 2*1024*1024*10 卻成功。推測原因:
16M 字串單位存在 Bug64M 或 128M,現代硬體記憶體充足mysqldump --max_allowed_packet=128M、應用程式連線參數同步設大Aborted_clients、Connection_errors_internal 指標正確配置此參數,能徹底解決大 SQL 匯入、大欄位(BLOB/TEXT/JSON)讀寫失效問題。