Hướng dẫn how do i fix mysql skip - làm cách nào để sửa lỗi bỏ qua mysql

16.1.7.3 & NBSP; Bỏ qua giao dịch

Nếu sao chép dừng lại do sự cố với một sự kiện trong một giao dịch được sao chép, bạn có thể tiếp tục sao chép bằng cách bỏ qua giao dịch thất bại trên bản sao. Trước khi bỏ qua một giao dịch, hãy đảm bảo rằng luồng I/O sao chép được dừng cũng như luồng SQL sao chép.

Đầu tiên bạn cần xác định sự kiện được sao chép gây ra lỗi. Chi tiết về lỗi và giao dịch được áp dụng thành công cuối cùng được ghi lại trong Bảng Lược đồ hiệu suất replication_applier_status_by_worker. Bạn có thể sử dụng mysqlbinlog để truy xuất và hiển thị các sự kiện đã được ghi lại vào khoảng thời gian lỗi. Để hướng dẫn thực hiện việc này, xem Phần & NBSP; 7.5, Phục hồi điểm trong thời gian (gia tăng). Ngoài ra, bạn có thể phát hành SHOW RELAYLOG EVENTS trên bản sao hoặc SHOW BINLOG EVENTS trên nguồn.mysqlbinlog to retrieve and display the events that were logged around the time of the error. For instructions to do this, see Section 7.5, “Point-in-Time (Incremental) Recovery”. Alternatively, you can issue SHOW RELAYLOG EVENTS on the replica or SHOW BINLOG EVENTS on the source.

Trước khi bỏ qua giao dịch và khởi động lại bản sao, hãy kiểm tra các điểm sau:

  • Là giao dịch dừng sao chép từ một nguồn không xác định hoặc không đáng tin cậy? Nếu vậy, điều tra nguyên nhân trong trường hợp có bất kỳ cân nhắc bảo mật nào cho thấy bản sao không nên được khởi động lại.

  • Liệu giao dịch dừng sao chép có cần được áp dụng trên bản sao không? Nếu vậy, hoặc thực hiện các hiệu chỉnh thích hợp và áp dụng lại giao dịch hoặc đối chiếu thủ công dữ liệu trên bản sao.

  • Có phải giao dịch dừng sao chép cần phải được áp dụng trên nguồn? Nếu không, hãy hoàn tác giao dịch theo cách thủ công trên máy chủ nơi nó diễn ra ban đầu.

Để bỏ qua giao dịch, hãy chọn một trong các phương thức sau khi thích hợp:

  • Khi GTID được sử dụng (gtid_modeON), xem Phần & NBSP; 16.1.7.3.1, các giao dịch bỏ qua với GTIDS.

  • Khi các GTID không được sử dụng hoặc đang được thực hiện trong (gtid_mode

    FLUSH LOGS;
    PURGE BINARY LOGS TO 'binlog.000146';
    1,
    FLUSH LOGS;
    PURGE BINARY LOGS TO 'binlog.000146';
    2 hoặc
    FLUSH LOGS;
    PURGE BINARY LOGS TO 'binlog.000146';
    3), xem phần & nbsp; 16.1.7.3.2, các giao dịch bỏ qua mà không cần GTIDS.

Để khởi động lại sao chép sau khi bỏ qua giao dịch, phát hành

FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
4, với điều khoản
FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
5 nếu bản sao là bản sao đa nguồn.

16.1.7.3.1 & nbsp; bỏ qua các giao dịch với GTIDS

Khi GTID được sử dụng (gtid_modeON), GTID cho một giao dịch đã cam kết vẫn được duy trì trên bản sao ngay cả khi nội dung của giao dịch được lọc ra. Tính năng này ngăn một bản sao truy xuất các giao dịch được lọc trước đó khi nó kết nối lại với nguồn bằng cách sử dụng định vị tự động GTID. Nó cũng có thể được sử dụng để bỏ qua một giao dịch trên bản sao, bằng cách thực hiện một giao dịch trống thay cho giao dịch thất bại.

Nếu giao dịch không thành công tạo ra lỗi trong luồng công nhân, bạn có thể lấy GTID trực tiếp từ trường

FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
8 trong Bảng Lược đồ hiệu suất replication_applier_status_by_worker. Để xem giao dịch là gì, vấn đề SHOW RELAYLOG EVENTS trên bản sao hoặc
SET GLOBAL sql_slave_skip_counter = N
1 trên nguồn và tìm kiếm đầu ra cho một giao dịch trước GTID đó.

Khi bạn đã đánh giá giao dịch thất bại đối với bất kỳ hành động thích hợp nào khác như được mô tả trước đây (như cân nhắc bảo mật), để bỏ qua, hãy thực hiện một giao dịch trống trên bản sao có cùng GTID như giao dịch thất bại. Ví dụ:

SET GTID_NEXT='aaa-bbb-ccc-ddd:N';
BEGIN;
COMMIT;
SET GTID_NEXT='AUTOMATIC';

Sự hiện diện của giao dịch trống này trên bản sao có nghĩa là khi bạn đưa ra câu lệnh

SET GLOBAL sql_slave_skip_counter = N
2 để khởi động lại sao chép, bản sao sử dụng chức năng tự động trượt để bỏ qua giao dịch không thành công, vì nó thấy giao dịch với GTID đã được áp dụng. Nếu bản sao là bản sao nhiều nguồn, bạn không cần chỉ định tên kênh khi bạn thực hiện giao dịch trống, nhưng bạn cần chỉ định tên kênh khi bạn phát hành
FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
4.

Lưu ý rằng nếu ghi nhật ký nhị phân được sử dụng trên bản sao này, giao dịch trống sẽ nhập luồng sao chép nếu bản sao trở thành nguồn hoặc chính trong tương lai. Nếu bạn cần tránh khả năng này, hãy xem xét việc xóa và thanh lọc các bản ghi nhị phân của bản sao, như trong ví dụ này:

FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';

GTID của giao dịch trống vẫn tồn tại, nhưng bản thân giao dịch đã bị xóa bằng cách thanh lọc các tệp nhật ký nhị phân.

16.1.7.3.2 & nbsp; bỏ qua các giao dịch mà không có GTIDS

Để bỏ qua các giao dịch không thành công khi GTID không được sử dụng hoặc đang được thực hiện trong (gtid_mode

FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
1,
FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
2 hoặc
FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
3), bạn có thể bỏ qua một số lượng sự kiện được chỉ định bằng cách đưa ra tuyên bố
SET GLOBAL sql_slave_skip_counter = N
8. Ngoài ra, bạn có thể bỏ qua một sự kiện hoặc sự kiện bằng cách đưa ra tuyên bố
SET GLOBAL sql_slave_skip_counter = N
9 để di chuyển vị trí nhật ký nhị phân của nguồn về phía trước.

Khi bạn sử dụng các phương pháp này, điều quan trọng là phải hiểu rằng bạn không nhất thiết phải bỏ qua một giao dịch hoàn chỉnh, như luôn luôn như vậy với phương thức dựa trên GTID được mô tả trước đây. Các phương thức không dựa trên GTID này không nhận thức được các giao dịch như vậy, mà thay vào đó hoạt động trên các sự kiện. Nhật ký nhị phân được tổ chức như một chuỗi các nhóm được gọi là các nhóm sự kiện và mỗi nhóm sự kiện bao gồm một chuỗi các sự kiện.

  • Đối với các bảng giao dịch, một nhóm sự kiện tương ứng với một giao dịch.

  • Đối với các bảng không chuyển hóa, một nhóm sự kiện tương ứng với một câu lệnh SQL duy nhất.

Một giao dịch duy nhất có thể chứa các thay đổi đối với cả bảng giao dịch và không hoạt động.

Khi bạn sử dụng câu lệnh

SET GLOBAL sql_slave_skip_counter = N
8 để bỏ qua các sự kiện và vị trí kết quả nằm giữa một nhóm sự kiện, bản sao tiếp tục bỏ qua các sự kiện cho đến khi kết thúc nhóm. Thực thi sau đó bắt đầu với nhóm sự kiện tiếp theo. Tuyên bố
SET GLOBAL sql_slave_skip_counter = N
9 không có chức năng này, vì vậy bạn phải cẩn thận để xác định vị trí chính xác để khởi động lại sao chép khi bắt đầu một nhóm sự kiện. Tuy nhiên, sử dụng
SET GLOBAL sql_slave_skip_counter = N
9 có nghĩa là bạn không phải đếm các sự kiện cần bỏ qua, như bạn làm với
SET GLOBAL sql_slave_skip_counter = N
8 và thay vào đó bạn chỉ có thể chỉ định vị trí để khởi động lại.

16.1.7.3.2.1 & nbsp; bỏ qua các giao dịch với
CHANGE MASTER TO MASTER_LOG_FILE='source_log_name', MASTER_LOG_POS=source_log_pos;
4

Khi bạn đã đánh giá giao dịch thất bại cho bất kỳ hành động thích hợp nào khác như được mô tả trước đây (chẳng hạn như cân nhắc bảo mật), hãy tính số lượng sự kiện mà bạn cần bỏ qua. Một sự kiện thường tương ứng với một câu lệnh SQL trong nhật ký nhị phân, nhưng lưu ý rằng các câu lệnh sử dụng

CHANGE MASTER TO MASTER_LOG_FILE='source_log_name', MASTER_LOG_POS=source_log_pos;
5 hoặc
CHANGE MASTER TO MASTER_LOG_FILE='source_log_name', MASTER_LOG_POS=source_log_pos;
6 được tính là hai sự kiện trong nhật ký nhị phân.

Nếu bạn muốn bỏ qua giao dịch hoàn chỉnh, bạn có thể đếm các sự kiện vào cuối giao dịch hoặc bạn chỉ có thể bỏ qua nhóm sự kiện có liên quan. Hãy nhớ rằng với

CHANGE MASTER TO MASTER_LOG_FILE='source_log_name', MASTER_LOG_POS=source_log_pos;
7, bản sao tiếp tục bỏ qua đến cuối nhóm sự kiện. Hãy chắc chắn rằng bạn không bỏ qua quá xa về phía trước và đi vào nhóm sự kiện hoặc giao dịch tiếp theo, vì điều này sau đó làm cho nó bị bỏ qua.

Phát hành câu lệnh

CHANGE MASTER TO MASTER_LOG_FILE='source_log_name', MASTER_LOG_POS=source_log_pos;
8 như sau, trong đó
CHANGE MASTER TO MASTER_LOG_FILE='source_log_name', MASTER_LOG_POS=source_log_pos;
9 là số lượng sự kiện từ nguồn để bỏ qua:

SET GLOBAL sql_slave_skip_counter = N

Tuyên bố này không thể được ban hành nếu

CHANGE MASTER TO MASTER_AUTO_POSITION=0, MASTER_LOG_FILE='binlog.000145', MASTER_LOG_POS=235;
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
0 được đặt hoặc nếu các luồng bản sao đang chạy.

Tuyên bố

CHANGE MASTER TO MASTER_LOG_FILE='source_log_name', MASTER_LOG_POS=source_log_pos;
7 không có hiệu lực ngay lập tức. Khi bạn đưa ra câu lệnh
FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
4 cho lần tiếp theo sau câu lệnh
CHANGE MASTER TO MASTER_LOG_FILE='source_log_name', MASTER_LOG_POS=source_log_pos;
8 này, giá trị mới cho biến hệ thống
CHANGE MASTER TO MASTER_AUTO_POSITION=0, MASTER_LOG_FILE='binlog.000145', MASTER_LOG_POS=235;
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
4 được áp dụng và các sự kiện được bỏ qua. Câu lệnh
FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
4 đó cũng tự động đặt giá trị của biến hệ thống trở lại 0. Nếu bản sao là bản sao đa nguồn, khi bạn đưa ra câu lệnh
FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
4 đó, mệnh đề
FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
5 là bắt buộc. Đảm bảo rằng bạn đặt tên đúng kênh, nếu không các sự kiện được bỏ qua trên kênh sai.

16.1.7.3.2.2 & nbsp; bỏ qua các giao dịch với
SET GLOBAL sql_slave_skip_counter = N
9

Khi bạn đã đánh giá giao dịch không thành công cho bất kỳ hành động thích hợp nào khác như được mô tả trước đây (chẳng hạn như xem xét bảo mật), hãy xác định tọa độ (tệp và vị trí) trong nhật ký nhị phân của nguồn đại diện cho vị trí phù hợp để khởi động lại sao chép. Đây có thể là sự khởi đầu của nhóm sự kiện sau sự kiện gây ra vấn đề hoặc bắt đầu giao dịch tiếp theo. Chủ đề I/O sao chép bắt đầu đọc từ nguồn tại các tọa độ này vào lần tiếp theo chủ đề bắt đầu, bỏ qua sự kiện thất bại. Đảm bảo rằng bạn đã xác định chính xác vị trí, vì câu lệnh này không tính đến các nhóm sự kiện.

Phát hành câu lệnh

SET GLOBAL sql_slave_skip_counter = N
9 như sau, trong đó replication_applier_status_by_worker0 là tệp nhật ký nhị phân chứa vị trí khởi động lại và replication_applier_status_by_worker1 là số đại diện cho vị trí khởi động lại như đã nêu trong tệp nhật ký nhị phân:

CHANGE MASTER TO MASTER_LOG_FILE='source_log_name', MASTER_LOG_POS=source_log_pos;

Nếu bản sao là bản sao nhiều nguồn, bạn phải sử dụng mệnh đề

FLUSH LOGS;
PURGE BINARY LOGS TO 'binlog.000146';
5 để đặt tên cho kênh thích hợp trên câu lệnh replication_applier_status_by_worker3.

Tuyên bố này không thể được ban hành nếu replication_applier_status_by_worker4 được đặt hoặc nếu các luồng sao chép đang chạy. Nếu bạn cần sử dụng phương thức này để bỏ qua một giao dịch khi replication_applier_status_by_worker4 thường được đặt, bạn có thể thay đổi cài đặt thành replication_applier_status_by_worker6 trong khi phát hành câu lệnh, sau đó thay đổi lại sau đó. Ví dụ:

CHANGE MASTER TO MASTER_AUTO_POSITION=0, MASTER_LOG_FILE='binlog.000145', MASTER_LOG_POS=235;
CHANGE MASTER TO MASTER_AUTO_POSITION=1;

Làm cách nào để sửa lỗi độ trễ sao chép mysql?

Đầu tiên, chúng tôi đảm bảo rằng MySQL không bao giờ đồng bộ hóa nhật ký nhị phân vào đĩa. Thay vào đó, chúng tôi để hệ điều hành làm điều đó theo thời gian. Lưu ý rằng giá trị mặc định SYNC_BINLOG là 0, nhưng chúng tôi đã sử dụng giá trị cao hơn để tránh các vấn đề thay vì sự cố.make sure that MySQL never synchronizes the binary log to disk. Instead, we let the operating system do it from time to time. Note that sync_binlog default value is 0, but we used a higher value to avoid problems instead of crash.

Điều gì gây ra độ trễ sao chép MySQL?

Điều này là do bản sao MySQL là một luồng đơn (SQL_Thread), theo mặc định.Nếu một khối lượng lớn các ghi vào thể hiện DB nguồn xảy ra song song, thì các ghi vào bản sao đọc được nối tiếp bằng một sql_thread duy nhất.Điều này có thể gây ra độ trễ giữa thể hiện DB nguồn và đọc bản sao.If a high volume of writes to the source DB instance occurs in parallel, then the writes to the read replica are serialized using a single SQL_THREAD. This can cause a lag between the source DB instance and read replica.

Làm thế nào để tôi bỏ qua GTID?

Chúng ta có thể bỏ qua một lỗi trong sao chép dựa trên GTID bằng các bước sau: Dừng nô lệ;Đặt gtid_next = 'server_uuid: last_transaction_number+1';BẮT ĐẦU;LÀM;Đặt gtid_next = "tự động";Bắt đầu nô lệ;Nhưng nếu một bản sao đang chạy với thông tin kênh, làm thế nào để bỏ qua giao dịch cho một kênh cụ thể?STOP SLAVE; set GTID_NEXT='SERVER_UUID:LAST_TRANSACTION_NUMBER+1' ; BEGIN; COMMIT; SET GTID_NEXT="AUTOMATIC"; START SLAVE; But if a replication is running with channel information, than how to skip the transaction for a particular channel ?

Độ trễ sao chép MySQL là gì?

Độ trễ sao chép là chi phí của độ trễ cho (các) giao dịch hoặc (các) hoạt động được tính toán bởi chênh lệch thời gian thực thi giữa chính/chính so với nút chờ/nô lệ.the cost of delay for transaction(s) or operation(s) calculated by its time difference of execution between the primary/master against the standby/slave node.