Error Code: 1153. Got a packet bigger than 'max_allowed_packet' bytes
常見於:大 SQL 檔匯入、大 BLOB/TEXT 欄位寫入、主從複寫大事務傳輸。
SHOW VARIABLES LIKE 'max_allowed_packet';
-- 結果範例:
-- +--------------------+---------+
-- | Variable_name | Value |
-- +--------------------+---------+
-- | max_allowed_packet | 4194304 | -- 4MB (預設值常見 4MB 或 16MB)
-- +--------------------+---------+
單位為**位元組**。1M = 1048576 bytes。
# Linux: /etc/my.cnf 或 /etc/mysql/my.cnf
# Windows: my.ini (MySQL 安裝目錄或 C:\ProgramData\MySQL\)
[mysqld]
max_allowed_packet = 64M # 視最大 SQL/欄位大小設定,建議 64M~256M
# 重啟生效
systemctl restart mysqld # Linux
# Windows: 服務管理器重啟 MySQL
SET GLOBAL max_allowed_packet = 67108864; -- 64M = 64*1024*1024
-- 或
SET GLOBAL max_allowed_packet = 64*1024*1024;
需重新連線生效。注意:僅影響新連線,當前連線不生效。
# mysqldump 指定
mysqldump --max_allowed_packet=64M -u root -p db > backup.sql
# mysql 客戶端指定
mysql --max_allowed_packet=64M -u root -p db < backup.sql
| 場景 | 建議值 | 說明 |
|---|---|---|
| 一般 Web 應用 | 16M~64M | 足夠大多數情況 |
| 大量 BLOB/TEXT/JSON | 128M~256M | 視最大欄位大小而定 |
| 主從複寫大事務 | 256M~512M | 避免 Slave SQL 執行緒中斷 |
| mysqldump 跨版本遷移 | 1G | 防止超大 INSERT 语句被截斷 |
max_allowed_packet 已調大並重啟slave_max_allowed_packet(MySQL 5.7+,複寫專用)過大值(>1G)可能導致記憶體壓力或封包攻擊風險,**按需設定**,並監控 Max_used_connections * max_allowed_packet 理論峰值記憶體。