Смотрим в
mysql>show slave status\G;
...
Executed_Gtid_Set: 1136d9c4-0ecf-11e5-be7e-28d2445d8ed0:1-373587249,
53d58b0f-eb6f-11e6-9215-392e3ca483a1:1-1081544,
bcdd5c11-9d7b-11e2-8070-49715e847bda:1-40596661
...
В данном случае ID-шник непосредственного мастера bcdd5c11-9d7b-11e2-8070-49715e847bda. Значит gtid_next задаётся в формате ID:position, а в executed_gtid_set выглядит как ID:1-position:
mysql> stop slave;
mysql> set gtid_next="bcdd5c11-9d7b-11e2-8070-49715e847bda:40596661";
Query OK, 0 rows affected (0.00 sec)
вставляем пустую транзакцию и выставляем NEXT POSITION в AUTO, после стартуем slave:
mysql> begin; commit;
mysql> set gtid_next = "AUTOMATIC";
mysql> start slave;
Примечание.
Покажем это на реальном примере. Допустим, репликация остановилась с ошибкой:
Error 'Operation DROP USER failed for 'repl-user'@'10.10.22.21'' on query. Default database: 'mysql'. Query: 'drop user 'repl-user'@'10.10.22.21''
Когда у вас всего одна связка серверов – то делайте как в объяснении выше. Но когда у вас каскадная репликация + несколько source’ов, и в итоге Executed_Gtid_Set выглядит как-то так:
Executed_Gtid_Set: c1e6c877-0b28-11e8-ac90-00259029542c:1-10244393,
a9445ca7-0c35-31e8-9813-74e0078275c5:1-2632716216,
b6ed606b-233e-e394-9344-3424ac29df21:1-723531812,
d2bcb314-0031-12ab-bd34-836473a34c3a:1-62548120
Как понять, что писать в gtid_next? Очень просто:
1) открываем relay-log на слейве, который отвечает тому каналу репликации, на котором она остановилась
2) ищем сам запрос и поднимаемся чуть выше до первого SET @@SESSION.GTID_NEXT ; выглядит это как-то так:
#180206 9:07:35 server id 51 end_log_pos 525244062 CRC32 0x244fb3fd GTID last_committed=771256 sequence_number=771257 SET @@SESSION.GTID_NEXT= 'a9445ca7-0c35-31e8-9813-74e0078275c5:2632716217'/*!*/; # at 525244307 #180206 9:07:35 server id 51 end_log_pos 525244186 CRC32 0xe2b02729 Query thread_id=16476934 exec_time=0 error_code=0 use `mysql`/*!*/; SET TIMESTAMP=1517908055/*!*/; SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=2/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; drop user 'repl-user'@'10.10.22.21' /*!*/;
3) указываем именно это значение, делаем пустую транзакцию и запускаем репликацию:
mysql> stop slave for channel 'repl1';set gtid_next='a9445ca7-0c35-31e8-9813-74e0078275c5:2632716217';begin; commit;set gtid_next = "AUTOMATIC";start slave for channel 'repl1';
Можно так же воспользоваться mysql-utilites, а точнее mysqlslavetrx:
# mysqlslavetrx --slaves={USER}:{PASS}@localhost --dryrun --gtid-set=bcdd5c11-9d7b-11e2-8070-49715e847bda:69294946
но при этом нужно дополнительно выполнить stop/start slave перед/после.