Ошибка Could not execute Write_rows event on table при репликации MySQL

При использовании GTID для репликации, могут быть следующие ошибки, обычно когда на слейве нужно выполнить операцию с данными или таблицами, которые ещё “не доехали”:

Could not execute Write_rows event on table
Could not execute Update_rows event on table
Error 'Duplicate entry '4' for key 'PRIMARY''

Ранее, без использовании GTID, подошёл бы вариант

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n 

Но так как в данном случае транзакции имеют номера, для решения проблемы “Could not execute…” необходимо посмотреть статус репликации:

show slave status \G

Где интересует два поля:

Retrieved_Gtid_Set: 19eaecea-1ee3-11e9-9153-080027514a3a:1-4601:14736-15495
Executed_Gtid_Set: 19eaecea-1ee3-11e9-9153-080027514a3a:1-5:4602-14736

Как видно, затык произошёл на слейве Executed_Gtid_Set на транзакции 080027514a3a:1-5, то есть следующая транзакция 6 вызывает ошибку и её нужно пропустить. Всего их 080027514a3a:4601, что уже говорит о чём-то нехорошем, если косяки появились в самом начале.

STOP SLAVE;
SET GTID_NEXT="19eaecea-1ee3-11e9-9153-080027514a3a:6";
BEGIN; COMMIT;
SET GTID_NEXT="AUTOMATIC";
START SLAVE;

После этого можно снова проверить статус слейва и убедиться, что ошибка либо исчезла, либо репликация споткнулась на следующей транзакции. Вручную слишком трудозатратно выпиливать все проблемные места. В моём случае ошибок было много, и решением было просто сброс мастера на слейве и новый дамп с мастера:

reset master;
cat dump1.sql | mysql sitemanager
start slave;

Также есть плохой, но быстрый путь в случае ошибок с GTID. Смотрим на мастере

master > show global variables like 'GTID_EXECUTED';
+---------------+-------------------------------------------+
| Variable_name | Value                                     |
+---------------+-------------------------------------------+
| gtid_executed | 9a511b7b-7059-11e2-9a24-08002762b8af:1-14 |
+---------------+-------------------------------------------+

И добавляем на слейв значение GTID_EXECUTED с мастера:

slave> set global GTID_EXECUTED="9a511b7b-7059-11e2-9a24-08002762b8af:1-14"
ERROR 1238 (HY000): Variable 'gtid_executed' is a read only variable

Получается ошибка. А теперь значение GTID_EXECUTED с мастера добавляем в GTID_PURGED слейва:

slave1 > set global GTID_PURGED="9a511b7b-7059-11e2-9a24-08002762b8af:1-14";
ERROR 1840 (HY000): GTID_PURGED can only be set when GTID_EXECUTED is empty.

В случае проблем, выполнить на слейве

reset master;
slave1 > show global variables like 'GTID_EXECUTED';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_executed |       |
+---------------+-------+
slave1 > set global GTID_PURGED="9a511b7b-7059-11e2-9a24-08002762b8af:1-14";
slave1> start slave io_thread;
slave1> show slave status \G

Ваш комментарий будет первым

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *