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

MySQL 5.5/5.6/5.7/8.0 max_allowed_packet 修改全版本指南

     編輯:MySQL 資料庫相關知識

錯誤觸發場景

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.51 MB1 GB客戶端/服務端分別生效
5.64 MB1 GB
5.74 MB1 GB
8.064 MB1 GB大幅提升默認值

修改方法:配置文件永久生效 (推薦)

Linux: /etc/my.cnf 或 /etc/my.cnf.d/custom.cnf

[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 (安裝目錄或 C:\ProgramData\MySQL\MySQL Server X.Y\my.ini)

關鍵避坑:Windows 下 my.ini 常被系統鎖定/權限受限,直接編輯保存失敗。

  1. 以**管理員身份**啟動編輯器 (Notepad++, VS Code, 記事本)。
  2. 或:複製 my.ini 到桌面 → 編輯保存 → 管理員身份複製回原目錄覆蓋。
  3. 或:在 [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] 段同步設置 (見上)。
  • 應用層連接池/驅動參數:JDBC maxAllowedPacket、Go maxAllowedPacket DSN 參數等。

主從複製場景特殊要求

主庫寫入大事務產生大 Binlog Event,從庫 SQL 線程接收時受 slave_max_allowed_packet (5.6+ 默認 1G,通常足夠) 限制,但**網絡傳輸層**受 max_allowed_packet 限制。建議主從**同步調大**至一致值。

安全與效能平衡

  • 不要盲目設 1G:過大值可能導致惡意/錯誤大包攻擊佔用內存,或掩蓋應用層 BLOB 濫用問題。
  • 建議值:業務最大行大小 × 2 ~ 4 (如最大 10MB 圖片 → 設 32M/64M)。
  • 監控告警:監控 Max_used_connections、Aborted_connects、錯誤日誌中 Packet too large 計數。

驗證清單

  1. 配置文件三段 ([mysqld], [client], [mysqldump]) 均已設置並重啟/重新連接。
  2. SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet'; 顯示預期值 (單位字節)。
  3. 實測寫入/讀取大於舊限制的行:INSERT INTO t (blob_col) VALUES (REPEAT('x', 10*1024*1024)); (10MB)。
  4. mysqldump --max_allowed_packet=256M db t > /tmp/test.sql 導出成功。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved