[mysql] skip replication with GTID

Смотрим в

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. Значит увеличим его счётчик транзакций на 1 (40596661, стало 40596662, обратите внимание, что gtid_next задаётся в формате ID:position, а в executed_gtid_set оно выглядит как ID:1-position, то есть отличаются на ‘-1’):

mysql> stop slave;
mysql> set gtid_next="bcdd5c11-9d7b-11e2-8070-49715e847bda:40596662";
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 перед/после.

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

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