ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes
# 或
Your 'max_allowed_packet' variable is set to less than 16777216 Byte (16MB).
常見於:大 BLOB/TEXT 寫入、大批量 INSERT、mysqldump 導出大行、主從複製大事務。
| 版本 | 默認值 | 最大值 | 備註 |
|---|---|---|---|
| 5.5 | 1 MB | 1 GB | 客戶端/服務端分別生效 |
| 5.6 | 4 MB | 1 GB | |
| 5.7 | 4 MB | 1 GB | |
| 8.0 | 64 MB | 1 GB | 大幅提升默認值 |
[mysqld]
max_allowed_packet = 256M # 建議 64M-256M,視業務最大行大小而定
[client]
max_allowed_packet = 256M # 客戶端工具 (mysqldump, mysql) 也需同步調大
[mysqldump]
max_allowed_packet = 256M # 導出大行必備
systemctl restart mysqld
關鍵避坑:Windows 下 my.ini 常被系統鎖定/權限受限,直接編輯保存失敗。
my.ini 到桌面 → 編輯保存 → 管理員身份複製回原目錄覆蓋。[mysqld] 段下新增行,保存後 net stop mysql && net start mysql。-- 服務端全局 (需 SUPER 權限)
SET GLOBAL max_allowed_packet = 268435456; -- 256M,單位字節
-- 當前會話
SET SESSION max_allowed_packet = 268435456;
-- 驗證
SHOW VARIABLES LIKE 'max_allowed_packet';
SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet';
注意:動態修改僅影響**新建連接**,現有連接保持舊值。配置文件修改需重啟才能覆蓋所有連接。
服務端調大了,但 mysqldump、mysql 客戶端默認值仍舊,導出/導入大行仍會報錯。
mysqldump --max_allowed_packet=256M ...[mysqldump] / [client] 段同步設置 (見上)。maxAllowedPacket、Go maxAllowedPacket DSN 參數等。主庫寫入大事務產生大 Binlog Event,從庫 SQL 線程接收時受 slave_max_allowed_packet (5.6+ 默認 1G,通常足夠) 限制,但**網絡傳輸層**受 max_allowed_packet 限制。建議主從**同步調大**至一致值。
Max_used_connections、Aborted_connects、錯誤日誌中 Packet too large 計數。[mysqld], [client], [mysqldump]) 均已設置並重啟/重新連接。SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet'; 顯示預期值 (單位字節)。INSERT INTO t (blob_col) VALUES (REPEAT('x', 10*1024*1024)); (10MB)。mysqldump --max_allowed_packet=256M db t > /tmp/test.sql 導出成功。