[mysql] Got fatal error 1236 from master when reading data from binary log

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;

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

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