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. Ngay cả Chủ đề I / O của Bản sao MySQL cũng có thể là nạn nhân của việc 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Ế.
Ít nhất, bạn phải đảm bảo kích thước gói cho cả máy bạn mysqldump'd và máy bạn đang tải giống hệt nhau.
Có thể có hai (2) cách tiếp cận bạn có thể thực hiện:
TIẾP CẬN # 1: Thực hiện mysqldump bằng cách sử dụng --skip-Extended-insert
Điều này sẽ đảm bảo Gói MySQL không bị ngập với nhiều trường BLOB, văn bản. Bằng cách đó, các SQL INSERT được thực hiện cùng một lúc. Những nhược điểm chính là
- mysqldump lớn hơn nhiều
- tải lại một bãi như vậy mất nhiều thời gian hơn.
TIẾP CẬN # 2: Tăng max_allowed_packet
Đây có thể là cách tiếp cận ưa thích vì thực hiện đây chỉ là một khởi động lại mysql. Hiểu những gì MySQL Packet có thể làm rõ điều này.
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 về nó:
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.
Đưa ra lời giải thích này, việc tạo các INSERT số lượng lớn sẽ tải / dỡ gói MySQL khá nhanh. Điều này đặc biệt đúng khi max_allowed_packet quá nhỏ so với tải dữ liệu đã cho đến.
PHẦN KẾT LUẬN
Trong hầu hết các bản cài đặt của MySQL, tôi thường đặt nó thành 256M hoặc 512M. Bạn nên thử nghiệm với các giá trị lớn hơn khi tải dữ liệu tạo ra lỗi "MySQL đã biến mất".
max_allowed_packet
đến 900M và tôi đã sử dụng--skip-extended-insert
(và bạn đã đúng - điều đó tạo ra các bãi rác db), nhưng nó vẫn thất bại. Tôi đang nghi ngờ một dòng cụ thể trong bãi chứa bây giờ mà tôi có thể có thể làm việc xung quanh. Nhưng nó vẫn kỳ lạ - bãi chứa có thể được nhập tốt trên máy chủ CentOS của tôi.