Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lỗi MySQL thường gặp:"Gặp lỗi khi đọc gói thông tin liên lạc"

MySQL là cơ sở dữ liệu nổi tiếng thứ hai trên thế giới theo trang web DB Engine sau Oracle. Điều làm cho MySQL nổi tiếng có lẽ là vì nó là một Hệ quản trị cơ sở dữ liệu rất nhanh, đáng tin cậy và linh hoạt. MySQL cũng là một trong những cơ sở dữ liệu được hỗ trợ trong ClusterControl. Bạn có thể dễ dàng triển khai, mở rộng quy mô, giám sát và thực hiện nhiều việc với ClusterControl.

Hôm nay chúng ta sẽ không nói về bất kỳ lỗi nào trong số đó, nhưng chúng ta sẽ thảo luận về một trong những lỗi phổ biến đối với MySQL và các mẹo khắc phục sự cố có thể xảy ra. Khi làm việc với các ticket, rất nhiều lần khi chúng tôi kiểm tra các báo cáo lỗi hoặc nhật ký, chúng tôi thấy dòng này “Đã xảy ra lỗi khi đọc gói thông tin liên lạc” khá thường xuyên. Chúng tôi nghĩ rằng sẽ có lợi nếu chúng tôi viết blog liên quan đến lỗi này không chỉ cho khách hàng của chúng tôi mà còn cho những độc giả khác. Đừng chờ đợi thêm nữa, đã đến lúc đi sâu hơn!

Giao thức Máy khách / Máy chủ MySQL

Trước hết, chúng ta cần hiểu cách MySQL giao tiếp giữa máy khách và máy chủ. Cả máy khách và máy chủ đều đang sử dụng giao thức MySQL được thực hiện bởi Connectors, MySQL Proxy và cả giao tiếp giữa máy chủ nhân bản chính và máy chủ nô lệ. Giao thức MySQL hỗ trợ các tính năng như mã hóa minh bạch qua SSL, nén trong suốt, giai đoạn kết nối và cũng như giai đoạn lệnh.

Cả số nguyên và chuỗi đều là kiểu dữ liệu cơ bản được sử dụng trong suốt giao thức MySQL. Bất cứ khi nào máy khách và máy chủ MySQL muốn giao tiếp với nhau hoặc gửi dữ liệu, nó sẽ chia dữ liệu thành các gói có kích thước tối đa là 16MB và cũng sẽ thêm một tiêu đề gói vào mỗi đoạn. Bên trong mỗi gói, sẽ có một trọng tải là nơi các kiểu dữ liệu (số nguyên / chuỗi) đóng vai trò của chúng.

Xem xét CLIENT_PROTOCOL_41 được bật, đối với hầu hết mọi lệnh mà máy khách gửi đến máy chủ, máy chủ sẽ trả lời bất kỳ gói nào sau đây dưới dạng phản hồi:

OK_Packet

Đây là tín hiệu cho mọi lệnh thành công.

ERR_Packet

Tín hiệu cho biết gói có lỗi.

EOF_Packet

Gói này chứa cờ cảnh báo hoặc trạng thái.

Cách Chẩn đoán Vấn đề

Thông thường, có hai loại sự cố kết nối là lỗi giao tiếp hoặc kết nối bị hủy. Bất cứ khi nào xảy ra bất kỳ sự cố kết nối nào trong số này, các nguồn thông tin sau đây là điểm khởi đầu tốt để khắc phục sự cố và phân tích:

  • Nhật ký lỗi

  • Nhật ký truy vấn chung

  • Biến trạng thái Aborted_xxx và Connection_errors_xxx

  • Bộ nhớ đệm máy chủ

Lỗi kết nối và lý do có thể xảy ra

Trong trường hợp xảy ra bất kỳ lỗi kết nối nào và tùy thuộc vào lỗi, nó sẽ tăng bộ đếm trạng thái cho Aborted_clients hoặc Aborted_connects trong các biến trạng thái. Như được lấy từ tài liệu MySQL, Aborted_clients có nghĩa là số lượng kết nối đã bị hủy bỏ do máy khách đã chết mà không đóng kết nối đúng cách. Đối với Aborted_connects, nó có nghĩa là số lần thử kết nối với máy chủ MySQL không thành công.

Nếu bạn khởi động máy chủ MySQL với tùy chọn --log-warning, rất có thể bạn sẽ thấy ví dụ về thông báo sau trong nhật ký lỗi của mình. Như bạn đã nhận thấy, thông báo cho biết rõ ràng nó liên quan đến kết nối hủy bỏ, do đó bộ đếm trạng thái Aborted_connects sẽ được tăng lên trong biến trạng thái:

[Cảnh báo] Đã hủy kết nối 154669 tới db:'wordpress' người dùng:'wpuser' host:'hostname' (Đã xảy ra lỗi khi đọc các gói thông tin liên lạc)

Thông thường, các nỗ lực kết nối không thành công có thể xảy ra do những lý do sau. Khi bạn nhận thấy điều này, nó có thể chỉ ra rằng một người không được phép sắp vi phạm cơ sở dữ liệu và bạn có thể muốn xem xét nó sớm nhất có thể:

  • Máy khách không có đặc quyền truy cập cơ sở dữ liệu.

  • Đã sử dụng sai thông tin đăng nhập.

  • Một gói kết nối có thông tin không chính xác.

  • Do đã đạt đến giới hạn kết nối connect_timeout.

Biến trạng thái cho Aborted_clients sẽ được máy chủ tăng lên nếu máy khách quản lý để kết nối nhưng bị ngắt kết nối hoặc kết thúc theo cách không thích hợp. Ngoài ra, máy chủ cũng sẽ ghi thông báo Kết nối bị hủy bỏ vào nhật ký lỗi. Đối với loại lỗi này, thường có thể do nguyên nhân sau:

  • Máy khách không đóng kết nối đúng cách trước khi thoát (không gọi mysql_close ()).

  • Khách hàng đã vượt quá thời gian chờ đợi hoặc giây tương tác.

  • Chương trình hoặc ứng dụng khách đột ngột kết thúc khi đang truyền dữ liệu.

Ngoài các lý do trước đó, các lý do có thể có khác cho cả kết nối bị hủy bỏ và các sự cố máy khách bị hủy bỏ có thể liên quan đến bất kỳ lý do nào sau đây:

  • Cấu hình TCP / IP bị rối.

  • Giá trị biến quá nhỏ đối với max_allowed_packet.

  • Cấp phát bộ nhớ không đủ cho các truy vấn.

  • Phần cứng bị lỗi như ethernet, công tắc, cáp, v.v.

  • Vấn đề với thư viện luồng.

  • Vấn đề về hội chứng song công trong đó quá trình truyền ở chế độ liên tục tạm dừng (nếu bạn sử dụng giao thức ethernet với Linux, cả hai mặt và song công).

Cách Khắc phục Lỗi Giao tiếp MySQL

Bây giờ chúng ta đã biết được rất nhiều khả năng gây ra lỗi kết nối MySQL. Theo kinh nghiệm của chúng tôi, hầu hết thời gian vấn đề này liên quan đến tường lửa hoặc sự cố mạng. Công bằng mà nói, không dễ để chẩn đoán loại vấn đề này. Tuy nhiên, giải pháp sau có thể hữu ích cho bạn trong việc giải quyết lỗi này:

  • Nếu ứng dụng của bạn đang dựa vào wait_timeout để đóng kết nối, bạn nên thay đổi logic ứng dụng để đóng đúng cách khi kết thúc bất kỳ hoạt động nào.

  • Đảm bảo giá trị cho max_allowed_packet nằm trong phạm vi có thể chấp nhận được để khách hàng không nhận được bất kỳ lỗi nào liên quan đến "gói quá lớn".

  • Đối với các vấn đề về độ trễ kết nối có thể do DNS, bạn nên kiểm tra xem có bỏ qua tên- đã bật giải quyết.

  • Nếu bạn đang sử dụng một ứng dụng PHP hoặc bất kỳ chương trình nào khác, tốt nhất là đảm bảo rằng nó không bị hủy. các kết nối thường được đặt ở max_execution_time.

  • Nếu bạn nhận thấy nhiều thông báo TIME_WAIT từ netstat, bạn nên xác nhận rằng các kết nối được quản lý tốt trên kết thúc ứng dụng.

  • Nếu bạn đang sử dụng Linux và nghi ngờ sự cố là do kết nối mạng, tốt nhất bạn nên kiểm tra giao diện mạng bằng cách sử dụng lệnh ifconfig-a và kiểm tra kết quả đầu ra trên máy chủ MySQL xem có lỗi nào không.

  • Đối với người dùng ClusterControl, bạn có thể bật Nhật ký kiểm tra từ Cụm -> Bảo mật -> Nhật ký kiểm tra. Bằng cách bật tính năng này, nó có thể giúp bạn thu hẹp việc tìm ra truy vấn nào là thủ phạm.

  • Các công cụ mạng như tcpdump và Wireshark có thể hữu ích trong việc xác định các sự cố mạng tiềm ẩn, các vấn đề về thời gian chờ và các vấn đề tài nguyên cho MySQL.

  • Thường xuyên kiểm tra phần cứng bằng cách đảm bảo không có thiết bị nào bị lỗi, đặc biệt là đối với ethernet, bộ chia, bộ chuyển mạch, cáp v.v ... Nên thay thế thiết bị bị lỗi để đảm bảo kết nối luôn tốt.

Kết luận

Có rất nhiều lý do có thể dẫn đến sự cố gói kết nối MySQL. Bất cứ khi nào vấn đề này xảy ra, nó chắc chắn sẽ ảnh hưởng đến công việc kinh doanh và hoạt động hàng ngày. Mặc dù loại sự cố này không dễ chẩn đoán và phần lớn là do mạng hoặc tường lửa, nhưng bạn nên xem xét tất cả các bước đã được đề xuất trước đó để khắc phục sự cố. Chúng tôi thực sự hy vọng bài đăng trên blog này có thể giúp bạn theo một cách nào đó, đặc biệt là khi bạn gặp phải vấn đề này.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bảng được chỉ định hai lần, vừa là mục tiêu cho 'CẬP NHẬT' và là nguồn riêng cho dữ liệu trong mysql

  2. Làm cách nào để thay thế một biểu thức chính quy trong MySQL?

  3. Tôi nên xử lý --secure-file-priv trong MySQL như thế nào?

  4. id chèn cuối cùng mysqli

  5. Nguyên nhân gây ra lỗi MySQL 2014 Không thể thực thi truy vấn trong khi các truy vấn không có bộ đệm khác đang hoạt động