Назад | Перейти на главную страницу

Жесткая перезагрузка приводит к сбою репликации MySQL

Я столкнулся с проблемой при настройке репликации. В нормальных условиях он работает так, как задумано, но ломается, если происходит жесткая перезагрузка (я тяну за шнур питания).

Настроить

Установка состоит из двух серверов, сервер-1 и сервер-2. Настройка репликации - это круговая репликация. Оба сервера являются подчиненными, реплицирующимися с другого хоста, как если бы он был главным.

Программное обеспечение

Конфигурация резервирования

Конфигурация репликации следующая для сервер-1, и отображается для сервер-2:

GRANT REPLICATION SLAVE ON *.* TO 'replicant';
FLUSH TABLES WITH READ LOCK;"

#Use "SHOW MASTER STATUS \G;" to determine log position and log file

UNLOCK TABLES;

# set status on slave server using the values retieved earlier
CHANGE MASTER TO MASTER_HOST='server-2', MASTER_USER='replicant', MASTER_LOG_FILE='[log file]', MASTER_LOG_POS=[log pos];"

START SLAVE;

Информация об ошибке

Эта информация извлекается, когда сервер-2 обнаружил жесткую перезагрузку, и репликация прервана.

статус подчиненного сервера 1

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: server-2
                  Master_User: replicant
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: bin.000004
          Read_Master_Log_Pos: 37550
               Relay_Log_File: relay.000427
                Relay_Log_Pos: 245
        Relay_Master_Log_File: bin.000004
             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: 37550
              Relay_Log_Space: 529
              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: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 

статус подчиненного сервера 2

*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: server-1
                  Master_User: replicant
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: bin.000002
          Read_Master_Log_Pos: 7208
               Relay_Log_File: relay.000010
                Relay_Log_Pos: 245
        Relay_Master_Log_File: bin.000002
             Slave_IO_Running: No
            Slave_SQL_Running: No
              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: 7208
              Relay_Log_Space: 529
              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: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 

Соответствующая информация из mysql-log-error.log server-2

Эти журналы взяты из загрузки, которая привела к сбою репликации.

150821 12:52:35 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
150821 12:52:35  InnoDB: Initializing buffer pool, size = 8.0M
150821 12:52:35  InnoDB: Completed initialization of buffer pool
InnoDB: The log sequence number in ibdata files does not match
InnoDB: the log sequence number in the ib_logfiles!
150821 12:52:35  InnoDB: Database was not shut down normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages from the doublewrite
InnoDB: buffer...
InnoDB: Last MySQL binlog file position 0 106, file name /var/lib/mysql/bin.000002
150821 12:52:35  InnoDB: Started; log sequence number 0 259987
150821 12:52:35 [Note] Recovering after a crash using /var/lib/mysql/bin
150821 12:52:35 [Note] Starting crash recovery...
150821 12:52:35 [Note] Crash recovery finished.
150821 12:52:35 [ERROR] log  listed in the index, but failed to stat
150821 12:52:35 [ERROR] Error counting relay log space
150821 12:52:35 [ERROR] Failed to initialize the master info structure
150821 12:52:35 [Note] Event Scheduler: Loaded 0 events
150821 12:52:35 [Note] /usr/libexec/mysqld: ready for connections.
Version: '5.1.73-log'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  Source distribution  

Доступ к репликанту

Среди вещей, которые я предпринял для сбора информации и решения проблемы, была попытка получить доступ сервер-1 из сервер-2 от имени репликант пользователь. Эта попытка не увенчалась успехом, и я получил "В доступе отказано"сообщение.

Поэтому я изучил гранты на сервер-2, и получил следующую информацию.

SHOW GRANTS FOR "replicant"@"server-1";
ERROR 1141 (42000) at line 1: There is no such grant defined for user 'replicant' on host 'server-1;'

Мои попытки найти решение

Мои попытки решить эту проблему пока что безрезультатны. Что бы я ни пытался, я всегда получаю один и тот же ответ от MySQL.

ERROR 1201 (HY000) at line 1: Could not initialize master info structure; more error messages can be found in the MySQL error log

Любая конфигурация, FLUSH, RESET или манипуляции с журналом, которые я пробовал, привели к этому сообщению об ошибке, когда я затем пытаюсь либо "НАЧАТЬ РАБ;" или "ИЗМЕНИТЬ МАСТЕРА НА ...", чтобы снова запустить репликацию.

Дублирующий сервер-1

Изготовление сервер-2 копия сервер-1 многообещающе. я получил сервер-2 работает, но сервер-1 не может копировать из сервер-2. Я копирую сервер, используя следующие шаги.

  1. остановить службу mysqld на сервер-2
  2. Очистить / вар / библиотека / mysql / на сервер-2
  3. rsync / вар / библиотека / mysql / из сервер-1 к сервер-2
  4. изменить главный хост на сервер-2 быть сервер-1
  5. запустить службу mysqld на сервер-2

Похоже, это помогает сервер-2, но сервер-1 не может копировать из сервер-2. Я вижу следующее в статусе раба сервер-1:

  Slave_IO_state: Waiting to reconnect after a failed master even read
Slave_IO_Running: No

Я нахожу это в журналах ошибок на сервер-1

[Note] Slave I/O thread: Failed reading log event, reconnecting to retry, log 'FIRST' at position 4
[ERROR] Error reading packet from server: Access denied; you need the REPLICATION SLAVE privilege for this operation ( server_errno=1227)

Я проверил гранты на репликант пользователя на обоих серверах, и они не изменились.

mysql> SHOW GRANTS FOR 'replicant';
+---------------------------------------------------+
| Grants for replicant@%                            |
+---------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'replicant'@'%' |
+---------------------------------------------------+
1 row in set (0.00 sec)

Похоже сервер-1 имеет проблемы с доступом к журналам на сервер-2. Я попытался решить эту проблему следующим образом.

Я продолжал работать над проблемой и нашел решение, которое помогло мне.

Решение

Это решение предполагает, что сервер-2 есть сервер с неработающей репликацией. Это решение необходимо отразить, если сервер-1 это сервер, который не работает.

  1. Отключить входящие соединения на обоих серверах
    • ПОКАЗАТЬ ПОЛНЫЙ СПИСОК ПРОЦЕССОВ; должен только показать localhost соединение с состоянием "ПОКАЗАТЬ ПОЛНЫЙ СПИСОК ПРОЦЕССОВ" и, возможно, некоторые системный пользователь записи
    • Один из способов добиться этого - назначить службе mysql новый порт, отличный от 3306 по умолчанию, или, если вы указываете порт, изменить его на что-то другое.
      • Например. Добавить "порт = 33060[mysqld] раздел в /etc/my.cnf
  2. Запретить запуск подчиненного процесса репликации при запуске сервера на обоих серверах
    1. Добавить "пропустить-раб-старт[mysqld] раздел в /etc/my.cnf
    2. Перезагрузите сервер mysql
      • перезапуск службы mysqld
  3. Сбросить настройки ведомого и главного устройства на сервер-1
    • СБРОСИТЬ SLAVE;
    • СБРОС МАСТЕРА;
  4. Создайте копию базы данных на сервер-1, и скопируйте его в сервер-2.
    1. ПРОМЫВКА СТОЛОВ С БЛОКИРОВКОЙ СЧИТЫВАНИЯ;
    2. mysqldump --databases [реплицированная база данных] ...> ./dump.sql
    3. РАЗБЛОКИРОВАТЬ ТАБЛИЦЫ;
    4. scp ./dump.sql [пользователь] @ сервер-2: / home / [пользователь] /
  5. Импортируйте данные в базу данных на сервер-2
    • Как root, mysql </home/[user provided/dump.sql)
  6. Сбросить настройки ведомого и главного устройства на сервер-2
    • СБРОСИТЬ SLAVE;
    • СБРОС МАСТЕРА;
  7. Настройте подчиненное устройство репликации на обоих серверах
    • На сервер-1: ИЗМЕНИТЬ МАСТЕРА НА MASTER_HOST = 'server-2', MASTER_USER = 'replicant', MASTER_LOG_FILE = "bin.000001", MASTER_LOG_POS = 1;
    • На сервер-2: ИЗМЕНИТЬ МАСТЕРА НА MASTER_HOST = 'server-1', MASTER_USER = 'replicant', MASTER_LOG_FILE = "bin.000001", MASTER_LOG_POS = 1;
  8. Если вы получите следующую ошибку сервер-2: ОШИБКА 1201 (HY000): не удалось инициализировать основную информационную структуру; больше сообщений об ошибках можно найти в журнале ошибок MySQL
    • Удалите файлы реле mysql и попробуйте шаги 6 и 7 очередной раз.
    • rm -rf / var / lib / реле *
  9. Включить входящие соединения на обоих серверах
    • Вернуть шаг 1
    • Перезагрузите сервер mysql
      • перезапуск службы mysqld
  10. Запустите подчиненные устройства репликации на обоих серверах
    • НАЧАТЬ РАБ;
  11. Репликация теперь должна работать. Проверьте его работоспособность на обоих серверах
    • ПОКАЗАТЬ СТАТУС ПОДЧИНЕННОГО \ G;
      • Slave_IO_State не должен указывать на ошибку
      • Slave_IO_Running и Slave_SQL_Running оба должны быть в да штат
  12. Очистить
    • удалять пропустить-раб-старт вход из /etc/my.cnf на обоих серверах
      • Нет необходимости перезапускать сервер mysql
    • Удалить dump.sql файл на обоих серверах