Fix lỗi MySQL max_allowed_packet

Nếu website bạn có thông báo lỗi “…packet bigger than ‘max_allowed_packet’ bytes for query…” (thường nằm trong file error log của PHP) thì .pep.vn sẽ hướng dẫn bạn cách fix lỗi của MySQL trong bài hướng dẫn này.

Fix lỗi MySQL max_allowed_packet - MySQL - Cơ sở dữ liệu - Database

MySQL Logo

max_allowed_packet là gì?

max_allowed_packet là một biến giúp bạn cấu hình xác định kích thước tối đa của một gói tin (một câu lệnh gửi từ MySQL client đến MySQL hoặc một row của table gửi từ MySQL Server đến MySQL Client). Việc xác định kích thước tối đa này giúp bạn quản lý bộ nhớ hiệu quả hơn và an toàn hơn cho MySQL Server của bạn.

Cách fix lỗi MySQL max_allowed_packet

Khi bạn mở file log error của PHP ra thì đôi lúc bạn sẽ gặp thông báo lỗi sau “…packet bigger than ‘max_allowed_packet’ bytes for query…“, đây là lỗi thường gặp khi bạn gửi dữ liệu có độ dài quá lớn vượt mức cho phép đến MySQL Server

Thông thường thì MySQL Client và MySQL Server đều có biến max_allowed_packet của riêng chúng. Vì thế nếu bạn gặp vấn đề về max_allowed_packet thì bạn cần phải thiết lập tham số này ở cả 2 phía Server và Client.

May mắn là nếu bạn đang sử dụng MySQL extension cho PHP để truy vấn đến MySQL Server như MySQLi (sử dụng trong WordPress), MySQL (không nên dùng vì đã phản đối từ PHP 5.5.0 và gỡ bỏ trong PHP 7), Mysqlnd (MySQL Native Driver – mới nhất và hỗ trợ nhiều tính năng hơn các driver khác),… thì không cần phải thiết lập tham số max_allowed_packet phía client.

Tuy nhiên, nếu bạn sử dụng MySQL Command-Line Tool (mysql shell) để truy vấn đến MySQL Server thì bạn phải thiết lập tham số max_allowed_packet cho nó bằng cách dùng lệnh sau :

mysql --max_allowed_packet=128M -u root -h 127.0.0.1 -p

Ví dụ :

[[email protected] ~]# mysql --max_allowed_packet=128M -u root -h 127.0.0.1 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 503139
Server version: 5.5.44 MySQL Community Server (GPL) by Remi

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Trong phiên kết nối này thì mysql client sẽ có max_allowed_packet là 128MB, có nghĩa là bạn có thể nhận và gửi dữ liệu từ 128MB trở xuống, nếu trên 128MB sẽ không thực hiện được. Theo mặc định của mysql client thì giá trị max_allowed_packet sẽ là 16MB.

Thiết lập max_allowed_packet trên MySQL Server

Theo mặc định của MySQL Server thì max_allowed_packet sẽ có giá trị là 1MB, chúng ta có thể kiểm tra giá trị hiện tại của MySQL Server bằng cách thực hiện lệnh mysql sau :

SHOW VARIABLES LIKE 'max_allowed_packet';

Ví dụ :

mysql> SHOW VARIABLES LIKE 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 |
+--------------------+---------+
1 row in set (0.00 sec)

mysql>

Theo ví dụ trên thì giá trị hiện tại của max_allowed_packet trên Server của xTraffic.pep.vn đang là 1048576 bytes (1MB) đúng bằng giá trị mặc định của MySQL Server.

Nếu bạn có thể chỉnh sửa giá trị của file my.cnf (thường nằm trong “/etc/my.cnf” trên VPS/Server sử dụng CentOS) thì bạn hãy mở file my.cnf và chỉnh sửa hoặc thêm vào dòng sau :

[mysqld]
max_allowed_packet = 128M

Lưu lại file my.cnf và khởi động lại MySQL Server bằng lệnh sau :

service mysqld restart

Kiểm tra lại tham số max_allowed_packet mới bằng lệnh mysql sau :

mysql> SHOW VARIABLES like 'max_allowed_packet';
+--------------------+-----------+
| Variable_name      | Value     |
+--------------------+-----------+
| max_allowed_packet | 134217728 |
+--------------------+-----------+
1 row in set (0.00 sec)

mysql>

Giá trị max_allowed_packet bây giờ là 134217728 bytes (128 MB).

Vừa rồi là cách thay đổi giá trị max_allowed_packet bằng file my.cnf mà xTraffic.pep.vn khuyên bạn nên sử dụng. Tuy nhiên, bạn vẫn có thể thay đổi giá trị max_allowed_packet của MySQL Server đơn giản hơn bằng cách thực hiện lệnh mysql sau :

SET GLOBAL max_allowed_packet = 128 * 1024 * 1024;

Ví dụ lệnh sau sẽ thiết lập max_allowed_packet của MySQL Server có giá trị là 256 MB

mysql> SET GLOBAL max_allowed_packet = 256 * 1024 * 1024;
Query OK, 0 rows affected (0.00 sec)

mysql>

Tuy nhiên, nếu bạn sử dụng cách này thì mỗi khi MySQL Server khởi động lại thì giá trị max_allowed_packet sẽ trở về giá trị mặc định là 1 MB, do đó bạn nên sử dụng cách cấu hình bằng file my.cnf để mọi thiết lập của bạn được giữ nguyên kể cả khi MySQL Server khởi động lại.