Một trong những kẻ giết người thầm lặng của Kết nối MySQL là Gói MySQL.
Đầu tiên, hãy tìm hiểu gói MySQL là gì.
Theo trang 99 của "Tìm hiểu nội bộ MySQL" (ISBN 0-596-00957-7) , đây là đoạn 1-3 giải thích các gói MySQL:
Mã giao tiếp mạng MySQL được viết theo giả định rằng các truy vấn luôn luôn ngắn một cách hợp lý và do đó có thể được gửi đến và xử lý bởi máy chủ trong một đoạn, được gọi là một gói theo thuật ngữ MySQL. Máy chủ phân bổ bộ nhớ cho bộ đệm tạm thời để lưu trữ gói và nó yêu cầu đủ để phù hợp với nó hoàn toàn. Kiến trúc này yêu cầu một biện pháp phòng ngừa để tránh việc máy chủ hết bộ nhớ --- giới hạn về kích thước của gói, tùy chọn này thực hiện.
Mã quan tâm liên quan đến tùy chọn này được tìm thấy trong
sql / net_serv.cc . Hãy xem my_net_read () , sau đó thực hiện cuộc gọi đến my_real_read () và đặc biệt chú ý đến
net_realloc () .
Biến này cũng giới hạn độ dài của kết quả của nhiều chuỗi functon. Xem sql / field.cc và
sql / intem_strfunc.cc để biết chi tiết.
Biết điều này về Gói MySQL cho phép Nhà phát triển / DBA tăng kích thước của chúng để chứa nhiều BLOB bên trong một gói ngay cả khi chúng lớn đến mức đáng ghét. Chắc chắn, một gói quá nhỏ sẽ gây ra vấn đề cho các kết nối mở về mặt này.
Theo Tài liệu MySQL
Bạn cũng có thể gặp các lỗi này nếu bạn gửi truy vấn đến máy chủ không chính xác hoặc quá lớn. Nếu mysqld nhận được một gói quá lớn hoặc không đúng thứ tự, nó giả định rằng có lỗi gì đó với máy khách và đóng kết nối. Nếu bạn cần các truy vấn lớn (ví dụ: nếu bạn đang làm việc với các cột BLOB lớn), bạn có thể tăng giới hạn truy vấn bằng cách đặt biến max_allowed_packet của máy chủ, có giá trị mặc định là 1MB. Bạn cũng có thể cần tăng kích thước gói tối đa ở cuối máy khách. Thông tin thêm về cài đặt kích thước gói được đưa ra trong Phần C.5.2.10, Gói dữ liệu quá lớn.
Một câu lệnh INSERT hoặc REPLACE chèn nhiều hàng lớn cũng có thể gây ra các loại lỗi này. Một trong những câu lệnh này sẽ gửi một yêu cầu đến máy chủ bất kể số lượng hàng được chèn vào; do đó, bạn thường có thể tránh lỗi bằng cách giảm số lượng hàng được gửi cho mỗi CHERTN hoặc THAY THẾ.
SỰ GIỚI THIỆU
Hãy thử nâng max_allowed_packet lên một số lớn hơn nhiều, vì mặc định là 1M. Tôi sẽ đề xuất khoảng 10 lần trường văn bản hoặc BLOB lớn nhất bạn có trong bộ dữ liệu hiện tại của mình.
Để đặt max_allowed_packet thành 256M, bạn có thể thêm nó vào /etc/my.cnf hoặc my.ini
[mysqld]
max_allowed_packet=256M
để trang trải khởi động lại trong tương lai của mysqld. Để cài đặt giá trị ngay bây giờ trên máy chủ, vui lòng chạy này:
SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;
Hãy thử một lần !!!