Đã thay đổi max_allowed_packet và vẫn nhận được lỗi 'Gói quá lớn'


8

Tôi sử dụng mysqldump để tạo một tệp phẳng cho mục đích sao lưu. Tôi đã sử dụng tệp này để tạo lại cơ sở dữ liệu trên một máy chủ thay thế. Tôi đã chạy quá trình nhập thông qua ssh trên dòng lệnh và tôi đã nhận được nhiều Packet too Largelỗi.

Tôi đã khởi động lại mysql với max_allowed_packet lớn hơn nhiều (tức là 1000M) và vẫn nhận được lỗi. Tôi thậm chí đã cố gắng đặt max_allowed_packet trong tệp nhập, vẫn nhận được lỗi.

Có cách nào để đảm bảo max_allowed_packet được đặt và / hoặc sử dụng mysqldump sẽ tạo một tệp không gây ra sự cố này không?

Để tham khảo:

tệp mysqldump không nén là ~ 2GB

loại cơ sở dữ liệu là INNODB

Câu trả lời:


5

Điều đầu tiên tôi nghĩ đến là những gì max_allowed_packet thực sự kiểm soát. Đây là những gì tôi tìm thấy:

Theo trang 99 của "Tìm hiểu về 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 định nghĩa về max_allowed_packet, sau đó tôi đã phát hiện ra một thứ khác từ ServerFault: innodb_log_file_size và innodb_log_buffer_size kết hợp phải lớn hơn mười lần đối tượng blob lớn nhất của bạn nếu bạn có nhiều đối tượng lớn nhất

Giữ hai điều này trong tâm trí, tôi sẽ tăng innodb_log_file_size trong /etc/my.cnf lên kích thước tối đa được phép cho nó, 2047M. Điều này tất nhiên đòi hỏi những điều sau đây

service mysql stop
rm -f /var/lib/mysql/ib_logfile*
service mysql start

Điều này sẽ chứa bất kỳ đốm màu lớn nào bạn có thể có trong dữ liệu của mình.


Tò mò về việc 10 đến từ đâu - đó chỉ là quy tắc ngón tay cái hay có mã trong MySQL nói rằng phân bổ 10 bộ đệm cố định, do đó bạn cần 10 để đảm bảo rằng 1 trong số chúng đủ lớn?
Gaius

Là cuốn sách này có thẩm quyền?
Pacerier

2

MySQL max_allowed_packetvẫn phải nằm trong giới hạn của trình bao khởi động nó - điều đó có ulimit -acho thấy điều đó data seg sizelà không giới hạn không?


2

Vì một số lý do, max_allowed_packetbị bỏ qua bởi mysqldump- bởi thiết kế ? Bổ sung thực tế là net_buffer_length. Vì vậy, thay vì thử

mysqldump --net_buffer_length=100k -u root -p databasename > dump.sql

Điều đó rất giác ngộ !!! Vì báo cáo lỗi thảo luận về phần chèn mở rộng kết hợp với vấn đề này, có thể thực hiện --skip-Extended-insert có thể bù một số nhưng chắc chắn sẽ tạo ra một mysqldump lớn hơn. +1 cho Bạn tìm thấy viên kim cương này trong phần thô mà Oracle sẽ để lại cho đến chết !!!
RolandoMySQLDBA

--skip-extend-insert chắc chắn hoạt động, nhưng trên cơ sở dữ liệu của tôi đã làm chậm quá trình khôi phục 100 lần khiến nó không thể sử dụng được.
Leopd

Tôi xin lỗi, xin chia buồn. Có thể yêu cầu mysqldump tạo các tệp CSV và thử tải lại bằng cách sử dụng LOAD DATA INFILE và tăng số lượng lớn_insert_buffer_size lên 1G hoặc 2G. Này, bạn không bao giờ biết !!!
RolandoMySQLDBA
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.