The combination of max_allowed_packet variable and replication in MySQL is a common source of headaches. In a nutshell, max_allowed_packet is the maximum size of a MySQL network protocol packet that the server can create or read. It has a default value of 1MB [= 5.6.6] and a maximum size of 1GB. This adds some constraints in our replication environment:
- Máy chủ chính không nên ghi các sự kiện vào nhật ký nhị phân lớn hơn max_allowed_packet
- Tất cả các nô lệ trong chuỗi sao chép phải có cùng max_allowed_packet với máy chủ chính
Đôi khi, ngay cả khi tuân theo hai quy tắc cơ bản đó, chúng ta vẫn có thể gặp vấn đề
Ví dụ: có những tình huống [còn gọi là lỗi] khi chủ ghi nhiều dữ liệu hơn giới hạn max_allowed_packet khiến các nô lệ ngừng hoạt động. Để sửa lỗi này, Oracle đã tạo một biến mới có tên là Slave_max_allowed_packet. Biến cấu hình mới này có sẵn từ 5. 1. 64, 5. 5. 26 và 5. 6. 6 ghi đè giá trị max_allowed_packet cho chuỗi nô lệ. Do đó, bất kể giá trị max_allowed_packet là bao nhiêu, các luồng của nô lệ sẽ có giới hạn 1GB, giá trị mặc định của Slave_max_allowed_packet. Thủ thuật hay hoạt động như mong đợi
Đôi khi, ngay cả với cách giải quyết đó, chúng tôi có thể gặp lỗi max_allowed_packet trong các máy chủ nô lệ. Điều đó có nghĩa là có một gói lớn hơn 1GB, điều không nên xảy ra trong tình huống bình thường. Tại sao? . Hãy xem ví dụ sau
Slave ngừng hoạt động với thông báo sau
Vỏ bọc1
Last_IO_Error. Gặp phải lỗi nghiêm trọng 1236 từ . master when reading data from binary log: 'nhật ký sự kiện đã vượt quá max_allowed_packet;
Phần quan trọng là "có lỗi nghiêm trọng 1236 từ chủ". Master không thể đọc sự kiện mà nó đã ghi vào nhật ký nhị phân vài giây trước. Để kiểm tra vấn đề chúng ta có thể
- Sử dụng mysqlbinlog để đọc nhật ký nhị phân từ vị trí không thành công với –start-position
Đây là một ví dụ được lấy từ Diễn đàn Percona của chúng tôi
Vỏ bọc1
2
3
4
5
6
7
8
#121003 5. 22. 26 id máy chủ 1 end_log_pos 398528
# sự kiện không xác định
# tại 398528
#960218 6. 48. 44 id máy chủ 1813111337 end_log_pos 1835008
# sự kiện không xác định
LỖI. Lỗi trong Nhật ký sự kiện. . read_log_event[]. 'Sự kiện quá lớn', data_len. 1953066613, event_type. 8
DÒNG KHÁC ;
# Kết thúc tệp nhật ký
Kiểm tra kích thước của sự kiện, 1953066613 byte. Hoặc thông báo “Sự kiện không xác định”. Một cái gì đó rõ ràng là sai ở đó. Một điều thông thường khác cần kiểm tra là id máy chủ đôi khi không tương ứng với giá trị thực. Trong ví dụ này, người đã đăng sự kiện nhật ký nhị phân đã xác nhận rằng id máy chủ đã sai
- Kiểm tra nhật ký lỗi của chủ
1
[LỖI] Lỗi trong Log_event:. read_log_event[]. 'Sự kiện quá lớn', data_len. 1953066613, event_type. 8
Một lần nữa, sự kiện lớn hơn dự kiến. Không có cách nào mà chủ và nô lệ có thể đọc/ghi nó, vì vậy giải pháp là bỏ qua sự kiện đó trong nô lệ và xoay nhật ký trên chủ. Sau đó, sử dụng pt-table-checksum để kiểm tra tính nhất quán của dữ liệu
mysql 5. 6 bao gồm tổng kiểm tra sao chép để tránh các sự cố với lỗi nhật ký. Bạn có thể đọc thêm về nó trong bài đăng trên blog của Stephan
Phần kết luận
Lỗi trên máy chủ nô lệ về max_allowed_packet có thể do nhiều nguyên nhân khác nhau. Mặc dù lỗi nhật ký nhị phân không phổ biến, nhưng đây là điều đáng để kiểm tra khi bạn cạn kiệt ý tưởng