MySQL 依據 max_allowed_packet 限制單次網路封包大小。當 INSERT/UPDATE 包含大欄位(BLOB、TEXT、長 JSON、Base64 圖片)且超過此限制時,會報錯:
ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes
預設值通常為 4MB (4,194,304) 或 16MB(版本差異),易在遷移、匯入、批次處理大物件時觸發。
SHOW VARIABLES LIKE 'max_allowed_packet'; -- 例:1048576 (1MB) 或 4194304 (4MB) 或 16777216 (16MB)
# 找到配置檔 mysql --help | grep my.cnf # 通常:/etc/my.cnf 或 /etc/mysql/my.cnf # 編輯 [mysqld] 區段 [mysqld] max_allowed_packet = 64M # 視業務需求調整,建議 32M~256M # 重啟 MySQL systemctl restart mysqld # 或 service mysql restart
SET GLOBAL max_allowed_packet = 67108864; -- 64M (bytes) -- 或 SET GLOBAL max_allowed_packet = 64*1024*1024;
注意:GLOBAL 變更需 SUPER 權限,且不影響已建立的連線,新連線生效。
mysql --max_allowed_packet=64M -u root -p
mysqldump --max_allowed_packet=64M -u root -p db_name > dump.sql
| 參數 | 建議值 | 說明 |
|---|---|---|
net_buffer_length | 16384 (16KB) | 通訊緩衝區初始大小,隨封包增長自動擴展至 max_allowed_packet |
slave_max_allowed_packet | 同 max_allowed_packet | 從庫接收主庫封包的上限(5.6+),防止複製中斷 |
SHOW VARIABLES LIKE 'max_allowed_packet'; -- 確認輸出為 67108864 (64M)
max_allowed_packet 是 MySQL 大物件寫入的關鍵閘門。掌握永久配置 + 動態調整 + 客戶端參數三種方式,並配合業務評估合理設定,能徹底解決「封包過大」錯誤,保障資料遷移、備份還原、批次匯入的順利進行。