2009-11-12 3 views
3

J'ai configuré la réplication pour le serveur MySQL. Je peux me connecter de la machine esclave au serveur maître en utilisant l'utilisateur/mot de passe de réplication. J'ai le thread SQL esclave en cours d'exécution, mais le thread esclave I/O n'est pas en cours d'exécution et l'état d'E/S esclave est vide lorsqu'il est coché en utilisant 'show slave status'. Quel pourrait être le problème?Le thread d'E/S MySQL esclave ne fonctionne pas

Comment résoudre ce problème? Redémarrer l'esclave n'aide pas.

C'était mon mauvais: Au lieu de donner un privilège de 'esclave de réplication' à *.*, je le donnais seulement pour my_db.*.

Répondre

3

Au lieu de donner un privilège « esclave réplication » à., Je ne faisais que donner pour my_db. *.

esclave de réplication est seulement un privilège global (c.-à chaque utilisateur uniquement), cela signifie qu'une commande telle que

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

n'a pas d'effet que vous ne pouvez pas accorder par base de données/colonne /table.

La commande que vous devez exécuter est:

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

Puis faire un START SLAVE. Vous pouvez également trouver utile de regarder dans le journal des erreurs mysql.

Je suggère une bonne lecture du replication setup documentation, car il explique tout cela en détail.

3

J'ai rencontré le même problème et j'essayer les étapes

d'abord ajouter ce code quelque part ci-dessous [mysqld] dans my.cnf ou my.ini slave-skip-errors=1046 ce qui va sauter toutes les entrées en double puisque nous exécuterons l'ensemble fichier journal binaire où la réplication s'arrête, vous pouvez commenter ce code après la réplication réussie.

1.SUP SLAVE;

2.RESET SLAVE;

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

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

4.CHANGE MASTER TO MASTER_LOG_POS = 98;

5.START ESCLAVE;

vérifier si vous réussissez

+0

2.REET SLAVE (ne doit pas exécuter cette commande) RESET SLAVE fait oublier à l'esclave sa position de réplication dans le journal binaire du maître. Utilisé pour un démarrage propre: Il supprime les fichiers master.info et relay-log.info, tous les fichiers journaux de relais et démarre un nouveau fichier journal de relais. [Link] (http://dev.mysql.com/doc/ refman/5.0/fr/reset-slave.html) –

1

Je face même problème et résolu en suivant les étapes suivantes. Le lien complet du fil est http://www.percona.com/forums/questions-discussions/percona-xtrabackup/11842-backup-stopped-working-slave-sql-running-no

Les étapes sont les mêmes que mentionnées par @ Luxknight007 sauf son étape 2. Cependant ce fil contient plus de détails, ce qui est très utile. Voici la solution que j'ai utilisée et cela a fonctionné. "Le premier problème est que vous avez modifié la position de la réplication au lieu de corriger l'erreur et utilisé un format de nom de fichier binlog incorrect (vous avez probablement utilisé celui de ce post que vous avez lié).Pour revenir à l'endroit où vous avez démarré, vous devez trouver le fichier binlog et la position à laquelle l'esclave sql_thread s'est arrêté. Selon la sortie de votre esclave, l'esclave lit un nouveau fichier binlog (vous pouvez voir que la valeur de Read_Master_Log_Pos est plus petite que la valeur Exec_Master_Log_Pos, ce qui signifie qu'il doit lire un fichier binlog plus récent que l'esclave sql_thread arrêté à), vous devez donc trouver le fichier binlog auquel l'esclave sql_thread a échoué. Regardez donc dans le journal d'erreur pour quelque chose comme ci-dessous:

code:

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 

Ceci est un exemple que je re-créé, si le vôtre sera un peu différent. Notez que l'ERREUR est similaire à ce que vous voyez dans votre statut d'esclave. Alors trouvez votre message d'erreur spécifique dans le fichier journal des erreurs, puis recherchez la partie finale où vous donne le nom et la position du fichier ("Nous nous sommes arrêtés au journal 'mysql-bin.000001' position 3427" dans mon exemple). La position doit être 315098143 en fonction de votre statut d'esclave de show, car c'est alors que l'esclave sql_thread a arrêté d'exécuter des événements (Exec_Master_Log_Pos) mais que le io_thread a continué à lire dans les nouveaux (Read_Master_Log_Pos). Une fois que vous avez trouvé le nom et la position du fichier binlog correct, réexécutez votre instruction change master sur votre esclave en utilisant les informations que vous avez trouvées dans le journal des erreurs. Notez que votre nom de fichier doit être quelque chose comme "newcrmdb1-bin.XXXXXX", pas mysql-bin.XXXXXX (vous pouvez voir cette convention de nommage votre statut d'esclave de show ci-dessus).

code:

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; 

Une fois que vous êtes pointé à l'emplacement de réplication d'origine où le SQL_THREAD esclave a échoué, vous devez alors corriger l'erreur qu'il se plaignait sur le point de commencer. L'erreur de réplication initiale semble indiquer que le tableau asteriskcdr. bpleadcf n'existe pas sur l'esclave, donc l'instruction d'insertion échoue lorsqu'elle tente de sélectionner les données de cette table. Donc, le problème est que votre esclave semble être déjà désynchronisé avec votre maître. Si la table en question sur le maître est statique ou plutôt statique, vous pouvez probablement résoudre ce problème en exportant les données de cette table sur le maître en utilisant mysqldump et en le chargeant dans l'esclave. Si cela n'est pas possible ou si vous ne vous souciez pas de ces données, vous pouvez toujours ignorer l'instruction de réplication avec sql_slave_skip_counter, mais l'esclave ne sera plus synchronisé avec le maître.

Et si tout le reste échoue, vous pouvez toujours reconstruire l'esclave à partir du maître en dernier recours. =) "