Got fatal error 1236 from master when reading data from binary log: 'Cannot replicate anonymous transaction when AUTO_POSITION = 1, at file /database/mysql/mysql-bin.030053, position 154.; the first event '' at 4, the last event read from 'mysql-bin.030053' at 219, the last byte read from '/database/mysql/mysql-bin.030053' at 219.'
Такую ошибку получили при попытке переключиться по инструкции online migration to GTID replication. Решение не очевидное и нашлось методом гугления, проб.
Последовательность действий такая:
1. переключаем slave в режим ON_PERMISSIVE:
slave> set @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
2. при запущенном slave на master’e выполняем (далее, мы будем использовать это значение в п.4 для вставки в gtid_purged на slave)
master> show global variables like 'gtid_executed'; +---------------+-----------------------------------------------------------------------------------------------+ | Variable_name | Value | +---------------+-----------------------------------------------------------------------------------------------+ | gtid_executed | 1136d9c4-0ecf-11e5-be7e-28d2445d8ed0:1-83091, bcdd5c11-9d7b-11e2-8070-49715e847bda:1-22016897 | +---------------+-----------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)
3. переключаем slave на gtid:
slave> stop slave; set gtid_mode=on;change master to master_auto_position=1;
4. удаляем все транзакции из лога, предшествующие той, что мы получили из п.1:
slave> set global GTID_PURGED='1136d9c4-0ecf-11e5-be7e-28d2445d8ed0:1-83091,bcdd5c11-9d7b-11e2-8070-49715e847bda:1-22016897;
если ошибка
ERROR 1840 (HY000): GTID_PURGED can only be set when GTID_EXECUTED is empty.
то выполняем
slave> reset master; slave> show global variables like 'GTID_EXECUTED'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | gtid_executed | | +---------------+-------+
и снова
slave> set global GTID_PURGED='1136d9c4-0ecf-11e5-be7e-28d2445d8ed0:1-83091,bcdd5c11-9d7b-11e2-8070-49715e847bda:1-22016897;
5. запускаем slave
slave>start slave;
Примечание.
Если вдруг не помогло, тогда делаем так:
a) делаем stop slave, reset slave, reset master, change master to … master_auto_position=1;
b) открываем на мастере лог на котором остановили репликацию (через stop slave, ибо при ошибки оно ругается на лог, который на пару дней идёт раньше) и в самом начале находим такое (у меня цепочка из мастер-слейвов, поэтому таких записей аж 3):
# at 123
#170306 9:21:20 server id 25 end_log_pos 274 CRC32 0xadda8e15 Previous-GTIDs
# 1136d9c4-0ecf-11e5-be7e-28d2445d8ed0:1-93203839,
# 53d58b0f-eb6f-11e6-9215-392e3ca483a1:1-564449,
# bcdd5c11-9d7b-11e2-8070-49715e847bda:1-36168727
c) теперь в gtid_purged надо прописать именно эти позиции; до этого было так (одинаковыми цветами обозначил одни и те же id серверов):
Executed_Gtid_Set:
1136d9c4-0ecf-11e5-be7e-28d2445d8ed0:1-28:1219-83091,
53d58b0f-eb6f-11e6-9215-392e3ca483a1:1-39715,
b6f43c68-8a31-11e2-82ab-003048c1b686:1-4376,
bcdd5c11-9d7b-11e2-8070-49715e847bda:1-21286887
а после установки стало вот так:
Executed_Gtid_Set:
1136d9c4-0ecf-11e5-be7e-28d2445d8ed0:1-93203839,
53d58b0f-eb6f-11e6-9215-392e3ca483a1:1-564449,
b6f43c68-8a31-11e2-82ab-003048c1b686:1-4377,
bcdd5c11-9d7b-11e2-8070-49715e847bda:1-36168727
то есть я заменил 3 строки из 4-ох (4-ая отвечает за позицию непосредственно текущего слейва)
d) запустить slave;
slave>start slave;