Cách an toàn nhất để chuyển đổi định dạng binlog khi chạy là gì?


25

Vì các cảnh báo sau trong mysqld.log:

[Cảnh báo] Câu lệnh không an toàn được ghi vào nhật ký nhị phân sử dụng định dạng câu lệnh kể từ BINLOG_FORMAT = STATMENT. Câu lệnh không an toàn vì nó sử dụng mệnh đề LIMIT. Điều này không an toàn vì tập hợp các hàng bao gồm không thể dự đoán được.

Tôi muốn chuyển định dạng sao chép sang MIXED.

Nhưng theo tài liệu của MySQL:

Chuyển đổi định dạng sao chép trong thời gian chạy không được khuyến nghị khi có bất kỳ bảng tạm thời nào tồn tại, bởi vì các bảng tạm thời chỉ được ghi lại khi sử dụng sao chép dựa trên câu lệnh, trong khi với sao chép dựa trên hàng thì chúng không được ghi.

Vì vậy, câu hỏi là làm thế nào tôi có thể xác định nếu có bất kỳ bảng tạm thời tồn tại để chuyển định dạng nhật ký nhị phân một cách an toàn?


1
Cảnh báo nhanh. Cảnh giác với điều này khi đi từ RBR-> SBR và sử dụng cam kết đã đọc: bug.mysql.com/orms.php?id=62493
Morgan Tocker

Câu trả lời:


35

Vì một binlog sẽ có một định dạng cụ thể tại thời điểm bạn thực hiện việc này, nên bạn có thể quyết định không đánh bạc với hai định dạng này mặc dù MySQL (eh Oracle [vẫn không thể tắt lưỡi]) đã xây dựng tính năng này.

Để chơi nó hoàn toàn an toàn mà không cần khởi động lại mysql, hãy thử như sau:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Điều này sẽ để lại binlog cuối cùng ở định dạng 'MIXED'. Áp dụng binlog (tiếp theo cuối cùng) tồn tại chỉ đơn thuần là đóng lại binlog cuối cùng ở định dạng trước đó.

Tất cả các phiên hiện có trước lần đầu tiên FLUSH LOGS;sẽ bắt đầu viết trong binlog cuối cùng một lần UNLOCK TABLES;được thực thi.

Hãy thử một lần !!!

CẨN THẬN

Cung cấp tín dụng khi tín dụng đáo hạn, câu trả lời của tôi thực sự cõng với câu trả lời của @ Jonathan . Tôi chỉ đóng và mở binlogs trên đó. Anh ta được +1 khi đưa ra điều này trước.

CẬP NHẬT 2011-10-12 13:58 EDT

Nếu bạn làm điều này với một Master đang hoạt động và có một hoặc nhiều Slaves được sao chép từ Master đó, bạn cũng cần quan tâm đến nhật ký chuyển tiếp ở định dạng mới. Dưới đây là những gì bạn có thể làm:

Trên nô lệ, chạy STOP SLAVE;

Trên Master chạy các:

FLUSH TABLES WITH READ LOCK;
FLUSH LOGS;
SET GLOBAL binlog_format = 'MIXED';
FLUSH LOGS;
UNLOCK TABLES;

Trên nô lệ, chạy START SLAVE;

Chạy STOP SLAVE;START SLAVE;xoay các bản ghi chuyển tiếp và làm cho các mục mới được sao chép bất kỳ định dạng nào. Bạn cũng có thể muốn áp dụng thay đổi binlog_format trong nô lệ.


3
Một điều cần lưu ý là các cài đặt sao chép mysql thực sự được đặt trên cơ sở mỗi phiên khách. Đặt binlog_format toàn cầu chỉ thay đổi giá trị cho các phiên MỚI. Do đó, nếu bạn đang chạy nó trên một hệ thống có máy khách được kết nối liên tục, mọi thay đổi bạn thực hiện đối với cài đặt sẽ không được áp dụng ngay lập tức ngay cả khi bạn thực hiện thao tác xả và khóa như được chỉ định ở đây - chúng sẽ không có hiệu lực cho đến khi máy khách kết nối lại (hoặc đặt giá trị trong phiên của riêng họ nhưng theo kinh nghiệm của tôi thì trước đây có nhiều khả năng hơn).
Austin Mill

Đối với những người tò mò, bạn cũng có thể đặt "binlog_format = 'MIXED';" vào my.cnf của bạn.
Christian

2
FYI, câu trả lời này không phù hợp với câu trả lời ở đây: dba.stackexchange.com/questions/58539/ Kẻ
HTTP500

Hướng dẫn sử dụng : Điều này có nghĩa là việc thay đổi định dạng ghi nhật ký trên bản sao nhân bản không khiến nô lệ thay đổi định dạng ghi nhật ký của nó để khớp. (..sher ..) Thay đổi định dạng ghi nhật ký nhị phân trên bản gốc trong khi quá trình sao chép đang diễn ra hoặc không thay đổi nó trên nô lệ có thể gây ra kết quả không mong muốn hoặc thậm chí khiến việc sao chép hoàn toàn thất bại.
Halfgaar

@Halfgaar Chỉ trong tuần vừa qua, tôi đã chuyển một nô lệ từ MIXED sang TUYÊN BỐ ba lần mà không có hiệu ứng xấu. Tôi đã làm điều đó bởi vì nhân rộng đã bị phá vỡ do một điều kiện chủng tộc. Bảng trở nên không tồn tại trên một nô lệ trước khi thực hiện truy vấn. Vì vậy, tôi chuyển sang TUYÊN BỐ để ổn định như tình huống đó. Tất nhiên, tất cả các bài viết đã dừng lại trong khi tôi làm điều này. BTW tôi cũng đã làm Master.
RolandoMySQLDBA

6

Để chuyển binlog_format trong thời gian chạy, bạn có thể làm:

set global binlog_format = 'MIXED';

Điều này sẽ đặt tất cả các phiên MỚI thành định dạng binlog hỗn hợp. Tất cả các phiên hiện tại sẽ là bất cứ điều gì đã được thiết lập trước đó cho đến khi chúng kết thúc.

Bạn cũng có thể làm set session binlog_format = 'MIXED';thủ công để giải quyết bất kỳ vấn đề nào với phiên cụ thể.


Tôi không hỏi đường, tôi hỏi cách an toàn nhất và làm thế nào tôi có thể kiểm tra xem có tồn tại bất kỳ bảng tạm thời nào không.
lượng tử

3
Đặt biến toàn cục trước và đợi các phiên còn lại kết thúc, là cách an toàn nhất.
Jonathan
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.