Ведомое устройство репликации mysql 5.6 gtid зависло (блокировка системы)?
-
29-09-2020 - |
Вопрос
Я настроил репликацию на основе gtid 5.6 (в 5.6.26), казалось, она работала, когда я это делал, она реплицировала мою случайную тестовую базу данных поверх той, которую я создал помимо обычных данных.Однако в какой-то момент что-то должно было произойти, потому что все, что я вижу, это:
mysql> SHOW SLAVE STATUS\G *************************** 1. row *************************** Slave_IO_State: System lock Master_Host: xxxxxxxxxxxxxxxxxx Master_User: xxxxxxxxxxxxxxxx Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysqld-bin.000141 Read_Master_Log_Pos: 169293671 Relay_Log_File: mysqld-relay-bin.000003 Relay_Log_Pos: 16861206 Relay_Master_Log_File: mysqld-bin.000141 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 16860994 Relay_Log_Space: 169298584 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 55203 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 7846a847-62c7-11e5-91a6-e06995de432e Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: System lock Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: 7846a847-62c7-11e5-91a6-e06995de432e:4757140-5030085 Executed_Gtid_Set: 7846a847-62c7-11e5-91a6-e06995de432e:1-4783274 Auto_Position: 1
теперь изначально «Slave_SQL_Running_State» говорило «чтение события из журнала реле» или что-то в этом роде, теперь оно также изменилось на системную блокировку (состояние ввода-вывода всегда говорило это).
Кажется, Seconds_Behind_Master
постоянно увеличивается, и размер журнала ретрансляции в файловой системе быстро увеличивается, в то время как Executed_gtid_set
кажется, что-то меняется, но все равно что-то кажется неправильным, потому что оно так сильно отстает....
Вот список процессов:
mysql> show processlist; +------+-------------+-----------+------+---------+-------+---------------------------------------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +------+-------------+-----------+------+---------+-------+---------------------------------------+------------------+ | 1877 | root | localhost | NULL | Sleep | 6076 | | NULL | | 1878 | root | localhost | NULL | Query | 0 | init | show processlist | | 1886 | system user | | NULL | Connect | 783 | System lock | NULL | | 1887 | system user | | NULL | Connect | 0 | System lock | NULL | | 1888 | system user | | NULL | Connect | 783 | Waiting for an event from Coordinator | NULL | | 1889 | system user | | NULL | Connect | 55455 | System lock | NULL | +------+-------------+-----------+------+---------+-------+---------------------------------------+------------------+
Я попытался остановить ведомое устройство и запустить его снова, но это не помогло.
Есть ли у кого-нибудь идеи, что я мог бы попытаться сделать, чтобы эта работа снова заработала?Был бы очень признателен.
Спасибо
Решение
Поскольку я вижу более 2 system user
записи в списке процессов, я предполагаю, что вы используете многопоточную репликацию (раб_параллельные_работники > 1).
Это похоже на ошибку
- Ошибка № 73066:Задержка репликации с многопоточной репликацией
- Ошибка № 72794:Ретрансляционный журнал без xid_log_event может привести к зависанию параллельной репликации.
Об этом 29 октября 2014 года заявил David Moss
Спасибо за ваш отзыв.Эта проблема была описана в ошибке 17326020, и в журналы изменений MySQL 5.6.21 и 5.7.5 было добавлено следующее:
Когда нить ввода/вывода воссоединялся с мастером, используя GTID и многопоточные рабы, находясь в середине транзакции, он не смог прервать транзакцию, оставив частичную транзакцию в журнале реле, а затем снова получить ту же транзакцию.Это произошло при выполнении вращения реле.Теперь при повторном подключении сервер проверяет, прежде чем вращать журнал в таких случаях, и сначала ждет любую текущую транзакцию.
Поэтому ничего нового для устранения этой ошибки добавлено не будет, и я закрываю ее как исправленную.
10 декабря 2014 года об этом заявил Laurynas Biveinis
Проблема:
С помощью MTS, GTIDS и автопозиции, когда работник применяет частичную транзакцию, оставленную на реле с помощью повторного подключения потока IO, он будет ждать, пока событие журнала XID совершит транзакцию.
К сожалению, координатор потока SQL достигнет события вращения мастера в следующем файле Relaylog и будет ждать, пока все работники выполнят свои задачи, прежде чем применять вращение.
Анализ:
По мере того, как вся транзакция снова извлечена в систему IO после переподключения, раб должен отказаться от частичной транзакции после того, как вы заметил, что это вращается от мастера.
Эта ошибка сообщает о той же проблеме, которая уже исправлена по ошибке № 17326020, и сообщаемая проблема больше не воспроизводима.Итак, этот патч просто добавляет новый тестовый пример.
ПРЕДПОЛОЖЕНИЕ
Бегать FLUSH BINARY LOGS;
на Мастере
Посмотрите, вызовет ли это движение ответ потоков SQL.
Если это не так, продолжайте и удалите раб_параллельные_работники от my.cnf
и перезапустите MySQL.
Поскольку вы запустили MySQL, главный и подчиненный, и получили error 1236
, это означает, что вы пытаетесь установить репликацию из невозможной позиции.В контексте полученного GTID и сообщения об ошибке двоичные журналы, необходимые для полной идентификации набора запросов в наборе GTID, больше не существуют.
Оглянитесь на свой SHOW SLAVE STATUS\G
Retrieved_Gtid_Set: 7846a847-62c7-11e5-91a6-e06995de432e:4757140-5030085
Executed_Gtid_Set: 7846a847-62c7-11e5-91a6-e06995de432e:1-4783274
Исходя из этого, последний выполненный GTID равен 7846a847-62c7-11e5-91a6-e06995de432e:4783274
Это означает, что двоичный журнал, который имеет или имел 7846a847-62c7-11e5-91a6-e06995de432e:4783275
более не существует.
Я могу видеть, что это происходит, если вы остановили репликацию на ведомом устройстве, оставили репликацию выключенной на время, достаточное для того, чтобы мастер мог выполнить ротацию своих двоичных журналов (через expire_logs_days), которые ведомому устройству все еще нужно было видеть, а затем включили репликацию.
В вашем конкретном случае попробуйте сделать дамп двоичного журнала mysqlbinlog. mysqld-bin.000141
.Если ничего не получится, придется перезагружать Слейв и настраивать репликацию с нуля.