И так, представим себе ситуацию: есть GTID репликация и нужно подключить ещё один канал с другого мастера. Вроде бы и тривиальная задача: change master to … channel master2, но при запуске репликации на новом канале master2 она свалится с ошибкой:
The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.', Error_code: 1236
Как же быть? Опишу по шагам, как это исправить.
Останавливаем все каналы репликации:
mysql>stop slave;
Запоминаем позицию Executed_Gtid_Set из вывода show slave status. Пример:
Executed_Gtid_Set: 1136d9c4-0ecf-11e5-be7e-28d2445d8ed0:1-383562252,
53d58b0f-eb6f-11e6-9215-392e3ca483a1:1-1095535,
82ad4575-4739-11e6-a34c-8a4ad13bb2ca:1-57542,
bcdd5c11-9d7b-11e2-8070-49715e847bda:1-40721635
Выполняем сброс slav’a в канале master2:
mysql>reset slave for channel 'master2';
Выполняем сброс мастера:
mysql>reset master;
Делаем gtid_purge (что бы slave знал с какого момента нужно выполнять поиск) но так, что добавляем ещё ID мастера master2 (поскольку gtid_purge общий для всех, то отдельно задать его для канала нельзя, поэтому задаём общий, с учётом всех ID, которые могут встретиться при репликации). Пример:
mysql>set global GTID_PURGED='1136d9c4-0ecf-11e5-be7e-28d2445d8ed0:1-383562252,
53d58b0f-eb6f-11e6-9215-392e3ca483a1:1-1095535,
82ad4575-4739-11e6-a34c-8a4ad13bb2ca:1-57542,
bcdd5c11-9d7b-11e2-8070-49715e847bda:1-40721635
10a3410d-e30a-11e6-b657-bfec5e13431a:1-1073549';
Как видно, мы добавили последнюю строку, которая является ID и позицией master2.
Запускаем все slav’ы:
mysql>start slave;
а так же принудительно новый канал репликации (он не поднимется, так как до этого был остановлен ошибкой 1236):
mysql>start slave for channel 'master2';
Примечание.
Если вы подключаете ещё один master, данные с которого уже присутствуют на slav’e и у вас будет просто огромные (десятки, сотни тысяч секунд) цифры по отставанию репликации, то можно выполнить такой хак:
mysql>stop slave for channel 'master2';
mysql>reset slave for channel 'master2';
mysql>start slave for channel 'master2';