Ведомое устройство репликации mysql 5.6 gtid зависло (блокировка системы)?

dba.stackexchange https://dba.stackexchange.com/questions/117068

  •  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).

Это похоже на ошибку

Об этом 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.Если ничего не получится, придется перезагружать Слейв и настраивать репликацию с нуля.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top