[mysql] Multi source replication

И так, представим себе ситуацию: есть 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';

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

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