max_allowed_packet 控制 **Server 單次接收/發送的最大封包大小**,影響:
INSERT ... VALUES (...),(...) 批次大小)。LOAD DATA INFILE 讀取緩衝。WHERE ... IN (...) 列表長度。[mysqld]
max_allowed_packet = 64M # 視業務調整,常見 16M~256M
查找配置檔:mysql --help | grep my.cnf。
SET GLOBAL max_allowed_packet = 67108864; -- 64M = 64*1024*1024
SHOW VARIABLES LIKE 'max_allowed_packet';
注意:SET GLOBAL 需 SUPER 權限,且**不影響已建立的連線**,新連線生效。
| 場景 | 錯誤訊息 | 對策 |
|---|---|---|
| 大批次 INSERT | Packet too large / Got a packet bigger than 'max_allowed_packet' | 拆分批次、增大參數、改用 LOAD DATA |
| 大欄位 (TEXT/BLOB/JSON) | 同前 | 增大參數、應用層分片寫入 |
| 超長 IN 列表 | 同前 | 改用臨時表 JOIN、或分批 |
| 主從同步中斷 | Got a packet bigger than 'max_allowed_packet' bytes (Slave SQL thread) | 主從同步調大 slave_max_allowed_packet (5.6+) |
客戶端也有同名參數,需同步放大:
mysql --max-allowed-packet=64Mmysqldump --max-allowed-packet=256MmaxAllowedPacket 連線屬性。max_allowed_packet 連線參數。net_buffer_length (預設 16K) 協同調整,避免頻繁擴充緩衝區。Aborted_connects、Bytes_received 異常飆升,檢查是否封包過大被丟棄。max_allowed_packet 是 MySQL 通訊層的「安全閥」。動態調整解燃眉之急,配置檔固化長期生效,**客戶端同步放大**常被忽略導致「Server 改了沒用」。大物件寫入優先考慮 LOAD DATA 或流式分片,避免單封包過大。