Sửa lỗi 'Got a packet bigger than max_allowed_packet bytes' trong MySQL

beginner🗄️ MySQL2026-03-24| MySQL 5.7 / 8.0, Linux (Ubuntu/Debian/CentOS), macOS, Windows, cũng ảnh hưởng đến MariaDB

Error Message

ERROR 1153 (08S01): Got a packet bigger than 'max_allowed_packet' bytes
#mysql#max_allowed_packet#cấu hình#blob#dữ liệu-lớn

Chuyện Gì Vừa Xảy Ra

Bạn đang chạy lệnh INSERT hoặc LOAD DATA INFILE — có thể đang import một SQL dump, lưu blob, hoặc đẩy một JSON payload lớn — thì MySQL ném ra lỗi này:

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

MySQL truyền dữ liệu giữa client và server theo từng packet. Biến max_allowed_packet đặt giới hạn kích thước tối đa của một packet, từ đó giới hạn kích thước của bất kỳ hàng hoặc truy vấn đơn lẻ nào. Các phiên bản MySQL cũ mặc định là 4 MB; MySQL 8.0 nâng lên 64 MB. Dù thế nào, nếu dữ liệu của bạn vượt quá giới hạn, server sẽ hủy toàn bộ thao tác.

Lỗi này thường xảy ra khi:

  • Import file dump .sql có chứa dữ liệu BLOB hoặc TEXT lớn
  • Chèn ảnh hoặc PDF đã mã hóa base64 vào cột MEDIUMBLOB/LONGBLOB
  • Đẩy giá trị cột JSON lớn qua ORM
  • Chạy mysqldump trên một server rồi restore sang server khác có giới hạn thấp hơn

Debug: Kiểm Tra Giới Hạn Hiện Tại

Trước khi thay đổi bất cứ điều gì, hãy kiểm tra giá trị thực tế mà cả client lẫn server đang dùng.

-- Chạy bên trong mysql client
SHOW VARIABLES LIKE 'max_allowed_packet';

Kết quả trả về sẽ trông như thế này:

+--------------------------+---------+
| Variable_name            | Value   |
+--------------------------+---------+
| max_allowed_packet       | 4194304 |
+--------------------------+---------+

Giá trị này tính theo byte. 4194304 = 4 MB. Bạn đang cố chèn một blob 20 MB? Đó chính là vấn đề.

Hãy kiểm tra thêm giá trị ở cấp session — global và session có thể khác nhau nếu ai đó đã thay đổi trong lúc runtime:

SHOW SESSION VARIABLES LIKE 'max_allowed_packet';

Giải Pháp 1: Tăng max_allowed_packet trong my.cnf (Sửa Vĩnh Viễn)

Đối với môi trường production, đây là cách sửa đúng đắn. Mở file cấu hình của MySQL — đường dẫn cụ thể tùy thuộc vào distro bạn đang dùng:

  • /etc/mysql/mysql.conf.d/mysqld.cnf (Ubuntu/Debian)
  • /etc/my.cnf (CentOS/RHEL)
  • /etc/mysql/my.cnf

Thêm hoặc cập nhật phần [mysqld]:

[mysqld]
max_allowed_packet = 128M

Sau đó cập nhật phần [mysql] để giới hạn phía client khớp với server. Nếu hai giá trị không khớp, bạn sẽ gặp lỗi khó hiểu trông như thể server đang bỏ qua cấu hình của bạn:

[mysql]
max_allowed_packet = 128M

Restart MySQL để áp dụng thay đổi:

# Ubuntu/Debian
sudo systemctl restart mysql

# CentOS/RHEL
sudo systemctl restart mysqld

Chọn kích thước đủ lớn để chứa payload lớn nhất bạn dự kiến. Các giá trị phổ biến: 64M, 128M, 256M. Giới hạn cứng tối đa là 1 GB (1G).

Giải Pháp 2: Đặt Động (Không Cần Restart)

Không thể restart ngay lúc này — chẳng hạn đang là giờ cao điểm trên server production? Hãy thay đổi giá trị global trong lúc runtime. Lưu ý là giá trị sẽ bị reset về mặc định sau lần restart tiếp theo trừ khi bạn cũng cập nhật my.cnf.

-- Yêu cầu quyền SUPER hoặc SYSTEM_VARIABLES_ADMIN
SET GLOBAL max_allowed_packet = 128 * 1024 * 1024; -- 128 MB

Lưu ý một điều: thay đổi này không áp dụng cho các kết nối đang mở. Hãy ngắt kết nối và kết nối lại sau khi chạy lệnh này.

Giải Pháp 3: Truyền Flag Khi Import SQL Dump

Nếu lỗi xảy ra trong quá trình import bằng lệnh mysql, bạn có thể đặt kích thước packet trực tiếp trên command line — không cần chỉnh cấu hình server:

mysql --max_allowed_packet=128M -u root -p your_database < dump.sql

Cách này chỉ nâng giới hạn phía client cho session đó. Server vẫn phải chấp nhận packet, nên cách này chỉ hoạt động hoàn toàn khi bạn kiểm soát cả hai phía hoặc giới hạn phía server đã đủ cao.

Giải Pháp 4: Tăng Giới Hạn Khi Dump

Đôi khi lỗi xuất hiện ngay trong quá trình chạy mysqldump — dump đang tạo ra các câu lệnh SQL đã vượt quá kích thước cho phép. Cách sửa giống nhau, flag cũng vậy:

mysqldump --max_allowed_packet=128M -u root -p your_database > dump.sql

Xác Nhận Đã Sửa Xong

Sau khi restart MySQL (hoặc chạy SET GLOBAL và kết nối lại), xác nhận giá trị mới đã có hiệu lực:

SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet';

Với 128 MB đã được đặt, bạn sẽ thấy:

+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| max_allowed_packet       | 134217728 |
+--------------------------+-----------+

134217728 = 128 × 1024 × 1024 = 128 MB. Giờ hãy thử lại thao tác bị lỗi. Với import từ dump:

mysql -u root -p your_database < dump.sql
echo "Exit code: $?"

Exit code 0 nghĩa là thành công.

Vẫn Lỗi Sau Khi Tăng Giới Hạn?

Một số tình huống vẫn có thể gây lỗi dù bạn đã thay đổi cấu hình:

  • Nhiều file config ghi đè lẫn nhau: MySQL đọc cấu hình từ nhiều vị trí, và file đọc sau có thể ghi đè setting của bạn bằng một giá trị thấp hơn. Chạy mysql --verbose --help | grep -A 1 'Default options' để xem chính xác những file nào được load và theo thứ tự nào.
  • Kết nối cũ vẫn dùng giá trị cũ: SET GLOBAL chỉ ảnh hưởng đến kết nối mới. Bất kỳ session nào đã mở trước khi bạn chạy lệnh vẫn đang dùng giới hạn cũ — hãy ngắt kết nối và kết nối lại.
  • Giới hạn ở phía driver: JDBC, mysqlclient của Python, và các connector khác đôi khi có cài đặt max_allowed_packet riêng được nhúng trong connection string hoặc cấu hình driver. Hãy kiểm tra ở đó nữa.
  • Sai kiểu cột cho kích thước dữ liệu: BLOB chỉ chứa tối đa 65 KB. MEDIUMBLOB lên đến 16 MB. LONGBLOB xử lý tới 4 GB. Nếu bạn đang nhét 10 MB vào cột BLOB thông thường, không tăng kích thước packet nào có thể giúp được — bạn cần alter kiểu cột trước.

Bài Học Rút Ra

  • Luôn đặt max_allowed_packet trong cả [mysqld] lẫn [mysql]. Sự không khớp giữa giới hạn server và client gây ra các lỗi trông có vẻ ngẫu nhiên cho đến khi bạn nhận ra hai giá trị đang lệch nhau.
  • Khi cài đặt một instance MySQL mới có xử lý file hoặc dữ liệu nhị phân, hãy nâng max_allowed_packet lên ít nhất 64M ngay từ đầu. Giá trị mặc định 4 MB là di sản cũ — hầu hết ứng dụng hiện đại đều sẽ chạm đến giới hạn này sớm hay muộn.
  • Thủ thuật mysql --verbose --help để liệt kê các file config bị dùng quá ít. Đây là cách nhanh nhất để xác nhận các chỉnh sửa của bạn thực sự được đọc, chứ không bị file khác âm thầm ghi đè.
  • Khi xử lý nhiều file config với các format khác nhau hoặc debug lỗi cú pháp, đôi khi tôi dán một đoạn vào YAML ↔ JSON Converter trên ToolCraft để kiểm tra cấu trúc cho chắc. Không có gì được upload — tất cả chạy trên trình duyệt.

Related Error Notes