Я столкнулся с проблемой при настройке репликации. В нормальных условиях он работает так, как задумано, но ломается, если происходит жесткая перезагрузка (я тяну за шнур питания).
Установка состоит из двух серверов, сервер-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. 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:
*************************** 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:
Эти журналы взяты из загрузки, которая привела к сбою репликации.
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 или манипуляции с журналом, которые я пробовал, привели к этому сообщению об ошибке, когда я затем пытаюсь либо "НАЧАТЬ РАБ;" или "ИЗМЕНИТЬ МАСТЕРА НА ...", чтобы снова запустить репликацию.
Изготовление сервер-2 копия сервер-1 многообещающе. я получил сервер-2 работает, но сервер-1 не может копировать из сервер-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 это сервер, который не работает.