導入大字段數據(長文本、Blob、批量 INSERT)時,常遇到 Got a packet bigger than 'max_allowed_packet' bytes 或 MySQL server has gone away 錯誤。根因是單個數據包超過服務端限制。
SET GLOBAL 需 SUPER 權限,SET SESSION 當前連接生效# my.cnf / my.ini [mysqld] 區段
[mysqld]
max_allowed_packet = 256M # 視業務最大字段調整,建議 64M-1G
修改後重啟 MySQL 服務生效。
-- 全局生效(需 SUPER 權限,重啟失效)
SET GLOBAL max_allowed_packet = 268435456; -- 256M,單位字節
-- 會話級生效(當前連接)
SET SESSION max_allowed_packet = 268435456;
服務端調大後,客戶端工具也需相應調整,否則仍會在發送端被截斷:
| 工具/驅動 | 調整方式 |
|---|---|
| mysql 命令行 | mysql --max_allowed_packet=256M ... |
| mysqldump | mysqldump --max_allowed_packet=256M ... |
| MySQL Workbench | Preferences → SQL Editor → Max Packet Size |
| JDBC | 連接串 ?maxAllowedPacket=268435456 或 Driver 屬性 |
| PHP PDO | PDO::MYSQL_ATTR_MAX_BUFFER_SIZE (PHP 7.1+) |
| Python PyMySQL | connect(..., max_allowed_packet=268435456) |
| 風險 | 說明 |
|---|---|
| 內存壓力 | 每個連接分配該大小緩衝區,過大導致 OOM |
| 網絡阻塞 | 超大包傳輸佔用帶寬,影響並發 |
| 攻擊面擴大 | 惡意大包消耗服務端資源 |
建議值:
64M(覆蓋絕大多數場景)256M-512M1G(臨時調大,導入後恢復)max_allowed_packet 而非 net_read_timeout/net_write_timeoutMax_used_connections * max_allowed_packet 理論峰值內存精準調整 max_allowed_packet,配合客戶端同步,可徹底解決大包傳輸失敗問題。