2012-09-05 46 views
7

Tôi đang sử dụng lỗi nhật ký để ghi cảnh báo/lỗi vào một tệp. Khi tôi thực hiện lệnh INSERT IGNORE..SELECT, nó chỉ tiếp tục viết các thông báo cảnh báo này.Tắt cảnh báo cảnh báo không an toàn mysql

120905 3:01:23 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT IGNORE... SELECT is unsafe because the order in which rows are retrieved by the SELECT determines which (if any) rows are ignored. This order cannot be predicted and may differ on master and the slave. 

Tôi muốn dừng trình ghi nhật ký mysql tiếp tục ghi lỗi trên và hơn. (Tôi không thể nhìn thấy nhật ký khác vì chúng điền vào toàn bộ logfile ...)

Trước hết, tôi chèn (a, b, c) vào một bảng. c phải là duy nhất trong bảng, và a, b được sử dụng để chọn. Truy vấn sẽ được như thế này

SELECT c FROM table WHERE a=value1 AND value2<b AND b<value3 

Và truy vấn chèn của tôi là

INSERT IGNORE INTO table VALUES (,,),(,,)...(,,) 

tôi nghĩ rằng tôi có thể thay đổi các truy vấn không để sản xuất cảnh báo, nhưng dữ liệu của tôi chứa trường độc đáo và tôi cần phải đảm bảo rằng các đệ là duy nhất trong bảng. Và 500 ~ 2000 hàng nên được chèn vào trong mỗi vài giây, vì vậy tôi cần phải chèn số lượng lớn.

Nếu đã có hàng chục triệu hàng được chèn vào và tôi cần chèn thêm 2000 hàng khác sau vài giây. Làm thế nào tôi có thể chèn chúng một cách an toàn vào bảng mà không làm đầy logfile với các cảnh báo?

(Tôi không thể tắt các bản ghi nhị phân vì tôi cần phải sử dụng sao chép mysql.)

+0

Bạn đang sao chép các bảng - bởi vì nếu bạn là lỗi này là đáng kể. –

+0

Có, tôi đang sử dụng sao chép mysql để sao lưu, lý do khả năng mở rộng – user1640242

+0

Vậy bạn đã đọc thông báo lỗi chưa? – zerkms

Trả lời

13

Bạn có thể sử dụng

SET GLOBAL LOG_WARNINGS = 0 

để tắt khai thác gỗ và

SET GLOBAL LOG_WARNINGS = 1 

để bật lại. Đề xuất cá nhân của tôi là để bọc các truy vấn vi phạm với những thay vì thiết lập nó trên toàn cầu để bạn có thể theo dõi nếu các truy vấn khác gây ra vấn đề là tốt.

Lưu ý rằng các phiên bản cũ hơn của MySQL không hỗ trợ tính năng này.

+2

Là một biến toàn cầu, điều này sẽ tắt cảnh báo cho tất cả các phiên được kết nối với cơ sở dữ liệu, phải không? – rjh

+0

Vì MySQL 5.6.4 biến này chỉ được định nghĩa là GLOBAL. – BoraMa

0

Tôi nghĩ câu hỏi này vẫn mở. Sử dụng set max_error_count=0; your unsafe queries; set max_error_count=64;

trước các truy vấn bạn muốn chạy nó là một biến phiên giao dịch, do đó bạn không cần phải là siêu người dùng sử dụng. Không chỉ, không có cảnh báo nào được phát hành khi bạn gọi cảnh báo giới hạn 5; nhưng các cảnh báo như vậy không báo cáo trong tệp nhật ký mysql. bạn cũng có thể sử dụng nó trong các thủ tục được lưu trữ. Sau truy vấn của bạn, bạn biết rằng không an toàn, bạn có thể đặt biến này về giá trị ban đầu.

Các vấn đề liên quan