При использовании 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