萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL max_allowed_packet 參數調優指南

參數作用

max_allowed_packet 控制 **Server 單次接收/發送的最大封包大小**,影響:

  • 單條 SQL 語句長度(含 INSERT ... VALUES (...),(...) 批次大小)。
  • LOAD DATA INFILE 讀取緩衝。
  • Replication 主從傳輸事件大小。
  • WHERE ... IN (...) 列表長度。
  • 函數/存儲過程傳參大小。

預設值與範圍

  • 預設:4 MB (MySQL 5.6+) / 1 MB (舊版)。
  • 最大:1 GB (1073741824)。
  • 必須為 1024 的倍數。

修改方法

方法一:配置檔永久生效(需重啟)

[mysqld]
max_allowed_packet = 64M  # 視業務調整,常見 16M~256M

查找配置檔:mysql --help | grep my.cnf。

方法二:運行時動態調整(即時生效,重啟失效)

SET GLOBAL max_allowed_packet = 67108864;  -- 64M = 64*1024*1024
SHOW VARIABLES LIKE 'max_allowed_packet';

注意:SET GLOBAL 需 SUPER 權限,且**不影響已建立的連線**,新連線生效。

常見報錯場景

場景錯誤訊息對策
大批次 INSERTPacket too large / Got a packet bigger than 'max_allowed_packet'拆分批次、增大參數、改用 LOAD DATA
大欄位 (TEXT/BLOB/JSON)同前增大參數、應用層分片寫入
超長 IN 列表同前改用臨時表 JOIN、或分批
主從同步中斷Got a packet bigger than 'max_allowed_packet' bytes (Slave SQL thread)主從同步調大 slave_max_allowed_packet (5.6+)

客戶端同步調整

客戶端也有同名參數,需同步放大:

  • 命令列:mysql --max-allowed-packet=64M
  • mysqldump:mysqldump --max-allowed-packet=256M
  • Connector/J:maxAllowedPacket 連線屬性。
  • Python mysqlclient:max_allowed_packet 連線參數。

最佳實踐

  1. 預設 4M 足夠多數 OLTP,僅在**大物件、批次寫入、長 IN 列表**場景調大。
  2. 建議上限 **256M**,過大易導致 OOM、網路阻塞、Replication 延遲。
  3. 配合 net_buffer_length (預設 16K) 協同調整,避免頻繁擴充緩衝區。
  4. 監控 Aborted_connects、Bytes_received 異常飆升,檢查是否封包過大被丟棄。

總結

max_allowed_packet 是 MySQL 通訊層的「安全閥」。動態調整解燃眉之急,配置檔固化長期生效,**客戶端同步放大**常被忽略導致「Server 改了沒用」。大物件寫入優先考慮 LOAD DATA 或流式分片,避免單封包過大。

copyright © 萬盛學電腦網 all rights reserved