首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL max_allowed_packet 參數配置指南:避免大數據寫入失敗

     編輯:MySQL 綜合教學

問題現象

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 ...

配置建議與上限

業務類型建議值說明
常規 Web16M - 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,通常無需調整。

排查清單(調大後仍報錯)

  1. 客戶端也調大了嗎?(mysql --max-allowed-packet、JDBC maxAllowedPacket、Python max_allowed_packet)。
  2. 檢查 SHOW GLOBAL VARIABLES 是否生效(動態調整需重新連接)。
  3. 是否觸發 wait_timeout/interactive_timeout 導致「MySQL server has gone away」誤判?
  4. Binlog 格式 ROW 時大事務產生巨大事件,考慮拆分事務或改 MIXED。

總結

max_allowed_packet 是 MySQL 通信層的「單包體積上限」,默認 4MB 過小。生產環境建議配置文件設 64M 起步,客戶端同步調大,並配合 slave_max_allowed_packet 保障複制穩定。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved