Máy chủ MySQL đã biến mất việc cản trở việc nhập các bãi lớn


14

Tôi đang cố gắng nhập một bãi chứa sql lớn (2GB) vào mysql cục bộ của mình trên máy mac. Tôi đã có thể làm điều này trong quá khứ (tôi đang sử dụng MAMP), nhưng bây giờ tôi nhận được ERROR 2006 (HY000) tại dòng 7758: Máy chủ MySQL đã biến mất mỗi khi tôi cố gắng nhập kết xuất. Cơ sở dữ liệu chứa các bảng innodb.

Tôi đã thử sao chép tập tin 4G-my-innodb-heavy-4G của tôi vào my.cnf của tôi để xem các cài đặt đó có giúp ích gì không, nhưng không gặp may.

Bất kỳ ý tưởng về những gì để điều chỉnh?

Tôi đang sử dụng "Mac OS X ver 10.6 (x86, 64-bit), DMG Lưu trữ." Từ đây: http://dev.mysql.com/downloads/mysql/

Câu trả lời:


15

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à

  1. mysqldump lớn hơn nhiều
  2. 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.ccsql / 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".


Tôi đã thử giải quyế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.
naxoc

Tôi đã kết thúc việc loại bỏ một chèn từ bãi chứa sql đó là một dòng rất, rất dài. Điều đó đã sửa nó (và dòng không cần thiết).
naxoc

BTW vui lòng đảm bảo rằng ký tự mặc định cho kết xuất dữ liệu có thể được hỗ trợ trong Hệ điều hành MacOSX và trong MySQL.
RolandoMySQLDBA

@naxov - Tôi chỉ tò mò về một dòng bạn nghi ngờ trong bãi rác. Có bất kỳ lĩnh vực văn bản hoặc BLOB liên quan ???
RolandoMySQLDBA

Có một trường văn bản rất dài.
naxoc

2

Điều này kéo dài bao lâu trước khi hết thời gian? Bước đầu tiên sẽ đặt cược để kiểm tra wait_timeoutinteractive_timeoutcài đặt để đảm bảo rằng chúng đủ lớn để bạn nhập:

SHOW VARIABLES LIKE '%_timeout';
SET SESSION wait_timeout=28800;

Mặc định là 8 giờ (28800), vì vậy đó không phải là vấn đề. Các dấu hiệu khác của vấn đề này có thể được tìm thấy ở đây . Một trong đó nổi bật là:

Một ứng dụng khách chạy trên một máy chủ khác không có các đặc quyền cần thiết để kết nối với máy chủ MySQL từ máy chủ đó.

Xác minh quyền trước tiên, nhưng sau đó đi qua danh sách các vấn đề tiềm ẩn.


Đó là tất cả trên localhost, vì vậy hoặc tôi không hiểu ý của bạn hoặc đó không phải là vấn đề. Ý của bạn là quyền như trong đặc quyền trong mysql?
naxoc

2

Vâng, thường chơi với Wait_timeout và max_allowed_packets cũng cho phép tôi xử lý thông báo lỗi.


Điều đó đã không làm việc cho tôi. Tôi đã phải chỉnh sửa sql trong tệp kết xuất và loại bỏ một dòng rất dài gây ra vấn đề.
naxoc

người ta không nên chơi với một số thông số mà anh ta không hiểu
Jeredepp

2

Nó có thể không phải là điều "chính xác" để làm, nhưng nó có thể hoạt động (được thực hiện, phải không?):

Hãy thử chia khối lớn của bạn thành nhiều tệp và chạy từng tệp một. Cách tiếp cận của tôi sẽ là phá vỡ nó một nửa và thử nghiệm. Sau đó chia mỗi nửa một nửa, kiểm tra lại, v.v.

Tôi hơi tò mò liệu dung lượng RAM bạn có trong hộp của bạn có liên quan gì đến việc này không. MySQL có tải toàn bộ kết xuất vào bộ nhớ khi chạy nó không? Tôi không biết ... nhưng nếu bạn chỉ có 2GB RAM và một số trong số đó đang được sử dụng để chạy HĐH và các ứng dụng khác, thì đây có thể là vấn đề.


2

Những người chưa thành công với các đề xuất khác có thể xem xét xem xét tập lệnh nhập khẩu đổ rác MySQL BigDump so le .

Đó là một cách giải quyết để nhập các cơ sở dữ liệu lớn vào MySQL. Tôi đã sử dụng nó thành công để nhập một kết xuất MySQL lớn vào môi trường phát triển cục bộ của mình (tôi đang sử dụng MAMP trong trường hợp này).

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.