Lỗi đọc các gói giao tiếp của MySQL


42

Trong nhật ký lỗi của MySQL, tôi thấy một vài cảnh báo như sau:

120611 16:12:30 [Warning] Aborted connection 2619503 to db: 'db_name' user: 'user_name' host: 'webapp_hostname' (Got an error reading communication packets)

Không nhận thấy bất kỳ mất dữ liệu nào, vì vậy tôi tự hỏi cảnh báo này có nghĩa là gì hoặc nguyên nhân gây ra nó và liệu người ta có thể giải quyết vấn đề gây ra những vấn đề này như thế nào. Đây là trên RHEL 6.1 và MySQL Enterprise 5.5.

Câu trả lời:


50

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.ccsql / 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 !!!


Giải thích rất tốt.
Vasilis Lourdas

4

Chủ yếu theo mặc định max_connections sẽ là 100. Hãy thử tăng tham số cấu hình

max_connections = 400, sau khi thiết lập trong my.cnf khởi động lại máy chủ hoặc thiết lập nó một cách linh hoạt:

    set @@global.max_connections = 400;

Chỉ cần thử đề xuất ở trên để tránh các thông báo cảnh báo này và cũng đảm bảo mạng của bạn không bị rớt gói.


2

Tôi đã gặp vấn đề này gần đây sau khi chuyển từ MySQL Enterprise 5.1.x sang 5.7.x , mà không có bất kỳ thay đổi mã quan trọng nào đối với ứng dụng, ' ghi chú ' bắt đầu xuất hiện.

Trong trường hợp của tôi, nguyên nhân gốc rễ cho ' ghi chú ' xuất hiện là chương trình thoát với các kết nối vẫn mở. Tình huống cho các kết nối không bị đóng có liên quan nhiều hơn một chút và không liên quan đến MySQL nhưng ACE, chủ đề và TSS.


0

Dòng my.ini này đã giải quyết vấn đề của tôi:

log_error_verbosity=1

Tham khảo liên kết này


16
Tôi không nghĩ rằng bạn đã giải quyết vấn đề tiềm ẩn nhưng chỉ đơn giản là dừng nó được ghi lại.
dùng19292

1
Tôi đã có cùng một thông báo được báo cáo là "Ghi chú". Sử dụng log_error_verbosity = 2 thực sự giải quyết được "vấn đề" (nhưng không nên xử lý "Cảnh báo")
xtian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.