首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL max_allowed_packet 參數配置:避免大資料寫入失敗

     編輯:MySQL 資料庫相關知識

問題背景

MySQL 依據 max_allowed_packet 限制單次網路封包大小。當 INSERT/UPDATE 包含大欄位(BLOB、TEXT、長 JSON、Base64 圖片)且超過此限制時,會報錯:

ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes

預設值通常為 4MB (4,194,304) 或 16MB(版本差異),易在遷移、匯入、批次處理大物件時觸發。

查看當前值

SHOW VARIABLES LIKE 'max_allowed_packet';
-- 例:1048576 (1MB) 或 4194304 (4MB) 或 16777216 (16MB)

修改方法

方法 1:修改配置檔永久生效(推薦)

# 找到配置檔
mysql --help | grep my.cnf
# 通常:/etc/my.cnf 或 /etc/mysql/my.cnf

# 編輯 [mysqld] 區段
[mysqld]
max_allowed_packet = 64M  # 視業務需求調整,建議 32M~256M

# 重啟 MySQL
systemctl restart mysqld
# 或
service mysql restart

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

SET GLOBAL max_allowed_packet = 67108864;  -- 64M (bytes)
-- 或
SET GLOBAL max_allowed_packet = 64*1024*1024;

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

方法 3:客戶端指定(僅對當前會話)

mysql --max_allowed_packet=64M -u root -p
mysqldump --max_allowed_packet=64M -u root -p db_name > dump.sql

相關參數協同調整

參數建議值說明
net_buffer_length16384 (16KB)通訊緩衝區初始大小,隨封包增長自動擴展至 max_allowed_packet
slave_max_allowed_packet同 max_allowed_packet從庫接收主庫封包的上限(5.6+),防止複製中斷

最佳實踐

  1. 評估業務最大欄位:Base64 圖片、長文本、JSON 文件大小上限。
  2. 預留 2~3 倍餘量:如最大 10MB,設 32MB 或 64MB。
  3. 避免過大:超大封包增加 OOM 風險、複製延遲、緩衝區壓力。
  4. 應用層分片:極大物件建議存檔案系統/物件存儲,DB 只存路徑。

驗證修改

SHOW VARIABLES LIKE 'max_allowed_packet';
-- 確認輸出為 67108864 (64M)

結語

max_allowed_packet 是 MySQL 大物件寫入的關鍵閘門。掌握永久配置 + 動態調整 + 客戶端參數三種方式,並配合業務評估合理設定,能徹底解決「封包過大」錯誤,保障資料遷移、備份還原、批次匯入的順利進行。

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