萬盛學電腦網

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

MySQL 導入大數據報錯 "MySQL server has gone away" 解決:調大 max_allowed_packet

錯誤現象

ERROR 2006 (HY000) at line 12345: MySQL server has gone away

導入大 SQL 文件(含大 INSERT/Blob)時,連接中斷,實際是 Server 端主動關閉超大包連接。

根因

max_allowed_packet 默認 1MB (1048576),客戶端發送的數據包超過此限制,Server 切斷連接。

解決步驟

1. 確認當前值

mysql> SHOW VARIABLES LIKE 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+

2. 修改配置文件永久生效

[root@server ~]# vi /etc/my.cnf
[mysqld]
max_allowed_packet = 32M  # 視最大 SQL 文件/Blob 大小調整,建議 32M~256M

# 重啟生效
[root@server ~]# service mysqld restart

3. 臨時生效(無需重啟,僅當前會話/全局臨時)

-- 全局臨時(重啟失效)
mysql> SET GLOBAL max_allowed_packet = 33554432;  -- 32M

-- 會話級(僅當前連接)
mysql> SET SESSION max_allowed_packet = 33554432;

驗證

mysql> SHOW VARIABLES LIKE 'max_allowed_packet';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| max_allowed_packet | 33554432 |
+--------------------+----------+

再次導入大文件,錯誤消失。

補充說明

  • max_allowed_packet 同時限制客戶端發送與Server 發送的最大包體,雙端需一致(客戶端庫如 mysqlnd、JDBC 驅動也有對應設置)。
  • 過大值(>1G)可能導致內存分配失敗或 OOM,建議上限 256M~512M。
  • 配合 net_buffer_length(初始緩存,默認 16K)使用,大包會自動擴展至 max_allowed_packet。
copyright © 萬盛學電腦網 all rights reserved