ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes
-- 或
ERROR 2006 (HY000): MySQL server has gone away
典型場景:大文本/BLOB 寫入、批量 INSERT 超長 SQL、LOAD DATA 大行、Replication 大事務。
SHOW VARIABLES LIKE 'max_allowed_packet';
+--------------------+---------+
| Variable_name | Value |
+--------------------+---------+
| max_allowed_packet | 4194304 | -- 4MB (默認)
+--------------------+---------+
# /etc/my.cnf 或 /etc/mysql/my.cnf
[mysqld]
max_allowed_packet = 64M # 視業務調整,建議 16M-256M
[client]
max_allowed_packet = 64M # 客戶端發送大包也需同步調大
重啟生效:systemctl restart mysqld。
SET GLOBAL max_allowed_packet = 67108864; -- 64M (字節單位)
-- 或
SET GLOBAL max_allowed_packet = 64*1024*1024;
驗證:SHOW VARIABLES LIKE 'max_allowed_packet';。
mysql --max-allowed-packet=64M -uroot -p
mysqldump --max-allowed-packet=64M ...
| 業務類型 | 建議值 | 說明 |
|---|---|---|
| 常規 Web | 16M - 32M | 覆蓋絕大多數 JSON/文本字段 |
| 存儲圖片/文檔 (BLOB/TEXT) | 64M - 256M | 單行最大 1GB (LONGBLOB),但網絡傳輸受限 |
| 主從複制大事務 | 128M - 512M | 配合 slave_max_allowed_packet (5.6+) |
硬上限:1GB (1073741824 字節),超過報錯。
slave_max_allowed_packet (5.6+):從庫接收主庫 Binlog 事件的包大小上限,**必須 ≥ 主庫 max_allowed_packet**,否則複制中斷。net_buffer_length:通信緩衝區初始大小,動態增長至 max_allowed_packet,通常無需調整。mysql --max-allowed-packet、JDBC maxAllowedPacket、Python max_allowed_packet)。SHOW GLOBAL VARIABLES 是否生效(動態調整需重新連接)。wait_timeout/interactive_timeout 導致「MySQL server has gone away」誤判?max_allowed_packet 是 MySQL 通信層的「單包體積上限」,默認 4MB 過小。生產環境建議配置文件設 64M 起步,客戶端同步調大,並配合 slave_max_allowed_packet 保障複制穩定。