MySQL подчиненный поток ввода-вывода не работает - PullRequest
3 голосов
/ 12 ноября 2009

Я настроил репликацию для сервера MySQL. Я могу подключиться с подчиненного компьютера к главному серверу, используя имя пользователя / пароль для репликации. У меня запущен подчиненный поток SQL, но подчиненный поток I / O не запущен, и состояние подчиненного ввода-вывода становится пустым, если проверено с помощью 'show slave status' В чем может быть проблема?

Как мне это решить? Перезагрузка раба не помогает.

Это было мое плохое: вместо того, чтобы дать привилегию «ведомый по репликации» *.*, я давал ее только за my_db.*.

Ответы [ 3 ]

4 голосов
/ 14 ноября 2009

Вместо репликации рабская привилегия. Я был только отдавая это для my_db. *.

Ведомый репликации является только глобальной привилегией (т.е. только для пользователя), это означает, что такая команда, как

GRANT REPLICATION SLAVE on mydb.* TO 'someuser'@'%';

не имеет никакого эффекта, поскольку вы не можете предоставить его для каждой базы данных / столбца / таблицы.

Команда, которую вам нужно выполнить:

GRANT REPLICATION SLAVE on *.* TO 'someuser'@'%';

Тогда сделайте START SLAVE. Вы также можете найти полезным просмотреть журнал ошибок mysql.

Я бы посоветовал вам прочитать документацию по настройке репликации , так как все это подробно объясняется.

2 голосов
/ 19 июня 2014

Я столкнулся с той же проблемой и исправил с помощью следующих шагов. Полная ссылка на тему: http://www.percona.com/forums/questions-discussions/percona-xtrabackup/11842-backup-stopped-working-slave-sql-running-no

Шаги такие же, как упомянуто @ Luxknight007, за исключением его шага 2. Однако эта нить содержит больше деталей, что очень полезно. Следующее - решение, которое я использовал, и это работало.

"Первая проблема заключается в том, что вы изменили положение репликации вместо того, чтобы исправить ошибку, и использовали неверный формат имени файла binlog (вы, вероятно, просто использовали тот из того поста, который вы связали, я думаю). Чтобы вернуться к там, где вы начали, вам нужно найти файл binlog и положение, в котором остановился подчиненный sql_thread. На основании вашего вывода статуса ведомого, похоже, что ведомое устройство читает из нового файла binlog (вы можете видеть, что значение Read_Master_Log_Pos меньше, чем значение Exec_Master_Log_Pos, что означает, что он должен читать более новый файл binlog, чем тот, на котором остановился slav sql_thread), поэтому вам нужно найти файл binlog, на котором фактически произошел сбой slave sql_thread. Так что ищите в журнале ошибок что-то вроде ниже:

Код:

2013-10-08 12:48:51 37545 [ERROR] Slave SQL: Error 'Table 'testdb.test2' doesn't exist' on query. Default database: 'testdb'. Query: 'insert into test1 select * from test2', Error_code: 1146
2013-10-08 12:48:51 37545 [Warning] Slave: Table 'testdb.test2' doesn't exist Error_code: 1146
2013-10-08 12:48:51 37545 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000001' position 3427

Это образец, который я воссоздал, так что ваш будет немного другим. Обратите внимание, что ОШИБКА похожа на то, что вы видите в своем статусе подчиненного. Поэтому найдите свое конкретное сообщение об ошибке в файле журнала ошибок, а затем найдите конечную часть, где находится имя файла и его позиция (в нашем примере «Мы остановились на позиции« mysql-bin.000001 », позиция 3427»). Позиция должна быть 315098143 в зависимости от вашего статуса подчиненного шоу, так как в этом случае подчиненный sql_thread прекратил выполнение событий (Exec_Master_Log_Pos), но io_thread продолжал читать в новых (Read_Master_Log_Pos).

Как только вы найдете правильное имя и положение файла binlog, повторно запустите ваш главный оператор изменений на ведомом устройстве, используя информацию, которую вы нашли в журнале ошибок. Обратите внимание, что имя вашего файла должно быть что-то вроде «newcrmdb1-bin.XXXXXX», а не mysql-bin.XXXXXX (вы можете увидеть это соглашение об именах выше для своего статуса show slave).

Код:

mysql> change master to MASTER_LOG_FILE='newcrmdb1-bin.XXXXXX', Master_Log_Pos=315098143;

change master to MASTER_LOG_FILE='mysql-bin.000082' , Master_Log_Pos=47914844;

Как только вы вернетесь к исходному местоположению репликации, где произошел сбой ведомого sql_thread, вам нужно будет исправить ошибку, с которой он жаловался, чтобы начать.

Кажется, что первоначальная ошибка репликации говорит о том, что таблица asteriskcdr. bpleadcf не существует на ведомом устройстве, поэтому оператор вставки завершается неудачно, когда он пытается выбрать данные из этой таблицы. Таким образом, проблема в том, что ваш раб, похоже, уже не синхронизирован с вашим хозяином. Если рассматриваемая таблица на ведущем устройстве является статической или в основном статической, вы, вероятно, можете решить эту проблему, экспортировав данные только из этой таблицы на ведущем устройстве с помощью mysqldump и загрузив их в ведомое устройство. Если это невозможно или вам не нужны эти данные, вы всегда можете просто пропустить оператор репликации с помощью sql_slave_skip_counter, но тогда ведомое устройство будет еще не синхронизировано с ведущим.

А если ничего не помогает, вы всегда можете перестроить раба из мастера в качестве крайней меры. =) "

1 голос
/ 30 июля 2013

Я столкнулся с той же проблемой, и я пытаюсь выполнить следующие действия

Сначала добавьте этот код где-нибудь ниже [mysqld] в my.cnf или my.ini slave-skip-errors=1046 это пропустит все повторяющиеся записи, так как мы выполним весь двоичный файл журнала, где остановка репликации, вы можете прокомментировать этот код после успешной репликации.

1.STOP SLAVE;

2. СБРОСИТЬ РАБА;

3.CHANGE MASTER TO MASTER_LOG_FILE = 'mysql-bin.000049';

Note: MASTER_LOG_FILE must be the last file where it stop from replicating

4. ИЗМЕНИТЬ MASTER TO MASTER_LOG_POS = 98;

5. НАЧАТЬ РАБА;

проверьте, успешны ли вы

...