Lỗi MySQL: không thể ghi vào nhật ký nhị phân


8

Tôi có một hệ thống (được kế thừa từ một công ty phát triển khác) và tôi chưa biết tất cả các tính năng của nó. Xây dựng:
- ứng dụng khách / ứng dụng web (symfony 1.4)
- DB - MySQL.

Dự án được triển khai trên 2 máy chủ:
1-st: nginx server + PHP + DB Master;
2-st: DB Slave.

Khi dữ liệu được sửa đổi bởi máy khách web tại DB Master, DB Slave hoạt động tốt và dữ liệu có quá trình sao chép bình thường. Khi dữ liệu được sửa đổi bởi MySQL Management Client, tôi có một thông báo:

Không thể thực thi câu lệnh: không thể ghi vào nhật ký nhị phân vì BINLOG_FORMAT = STATMENT và ít nhất một bảng sử dụng công cụ lưu trữ giới hạn cho ghi nhật ký theo hàng. InnoDB bị giới hạn ở tính năng ghi nhật ký hàng khi mức cô lập giao dịch được ĐỌC VÀ ĐỌC KHÔNG HOÀN THÀNH

Và sau đó, DB Slave rơi xuống và quá trình sao chép bị phá vỡ (lỗi chèn ... mục nhập trùng lặp ...).

Thông báo tương tự xảy ra (ở tình huống này - lỗi) với cùng một văn bản, khi tôi cố gắng chèn dữ liệu bằng ứng dụng / mô-đun java (nó chạy trong giao dịch) và sau khi ngoại lệ, giao dịch quay trở lại và không có sửa đổi nào xảy ra.

Làm cách nào tôi có thể giải quyết vấn đề này và làm cho hệ thống hoạt động và làm cho dữ liệu chứng nhận có thể có trên DB Master và DB Slaves hoạt động ở chế độ bình thường?

Câu trả lời:


18

Có 3 phương thức mà MySQL có thể sử dụng để ghi vào nhật ký nhị phân:

  1. TUYÊN BỐ

    Điều này có nghĩa là mọi câu lệnh SQL trên bản gốc được ghi lại trong nhật ký và được thực thi trên Slave. Điều này có thể gây ra vấn đề nếu câu lệnh SQL chứa các câu lệnh như "NOW ()", "RAND ()" và bất cứ điều gì không xác định. Điều này cũng cần sự hỗ trợ từ công cụ lưu trữ đang sử dụng.

  2. HÀNG

    Điều này có nghĩa là mỗi hàng được thay đổi bởi một câu lệnh sẽ được ghi riêng trong nhật ký nhị phân. Điều này cung cấp các bản ghi nhị phân lớn hơn (nói chung) so với ghi nhật ký dựa trên câu lệnh, nhưng hầu như luôn được đảm bảo để cung cấp bản sao chính xác cần thiết.

  3. TRỘN

    Điều này cho phép MySQL lựa chọn giữa ghi nhật ký dựa trên nhị phân và hàng theo yêu cầu.

Nếu bạn gặp lỗi này, một đề xuất là thay đổi biến BINLOG_FORMAT thành MIXED. Điều này cho phép MySQL tự động chuyển đổi giữa ghi nhật ký dựa trên ROW và STATMENT theo yêu cầu.


Đúng! Thông minh!
Chaki_Black

4
Một đề xuất tuyệt vời, nhưng làm thế nào để bạn thay đổi BINLOG_FORMAT?
Trebor Rude

2
Có thể rất muộn nhưng, nó có thể giúp cho tất cả những ai muốn biết cách thay đổi BINLOG_FORMAT dba.stackexchange.com/questions/6150/ Lỗi
Vivek Dhayalan

Trebor Rude: Bạn nên đọc tài liệu mysql, giải thích chi tiết điều này! dev.mysql.com/doc/refman/5.6/vi/ từ
Lifeboy 17/2/2017

Câu trả lời này giúp tôi giải quyết vấn đề. Cảm ơn!
Tung
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.