萬盛學電腦網

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

MySQL max_allowed_packet 過小導致匯入失敗:查詢與修改完整教學

錯誤現象

Error Code: 1153. Got a packet bigger than 'max_allowed_packet' bytes

常見於:大 SQL 檔匯入、大 BLOB/TEXT 欄位寫入、主從複寫大事務傳輸。

查看目前設定

SHOW VARIABLES LIKE 'max_allowed_packet';
-- 結果範例:
-- +--------------------+---------+
-- | Variable_name      | Value   |
-- +--------------------+---------+
-- | max_allowed_packet | 4194304 |  -- 4MB (預設值常見 4MB 或 16MB)
-- +--------------------+---------+

單位為**位元組**。1M = 1048576 bytes。

修改方法

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

# Linux: /etc/my.cnf 或 /etc/mysql/my.cnf
# Windows: my.ini (MySQL 安裝目錄或 C:\ProgramData\MySQL\)

[mysqld]
max_allowed_packet = 64M  # 視最大 SQL/欄位大小設定,建議 64M~256M

# 重啟生效
systemctl restart mysqld  # Linux
# Windows: 服務管理器重啟 MySQL

方法二:動態修改立即生效(重啟後失效)

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

需重新連線生效。注意:僅影響新連線,當前連線不生效。

方法三:客戶端指定(僅限該連線)

# mysqldump 指定
mysqldump --max_allowed_packet=64M -u root -p db > backup.sql

# mysql 客戶端指定
mysql --max_allowed_packet=64M -u root -p db < backup.sql

常見場景建議值

場景建議值說明
一般 Web 應用16M~64M足夠大多數情況
大量 BLOB/TEXT/JSON128M~256M視最大欄位大小而定
主從複寫大事務256M~512M避免 Slave SQL 執行緒中斷
mysqldump 跨版本遷移1G防止超大 INSERT 语句被截斷

排查清單

  1. 確認 Server 端 max_allowed_packet 已調大並重啟
  2. 確認 Client 端(mysqldump/mysql/應用連線池)也設定足夠大
  3. 檢查 slave_max_allowed_packet(MySQL 5.7+,複寫專用)
  4. 若用中間件(ProxySQL/MyCat),確認其中間件也轉發大封包

安全提醒

過大值(>1G)可能導致記憶體壓力或封包攻擊風險,**按需設定**,並監控 Max_used_connections * max_allowed_packet 理論峰值記憶體。

copyright © 萬盛學電腦網 all rights reserved