2012-10-10 6 views
2

J'ai un serveur MySQL primaire et j'essaye de mettre en place une réplication pour la base de données InnoDB.
J'effectue une configuration maître et esclave, crée une sauvegarde de la base de données principale de la station, la restaure sur la station esclave et exécute la réplication. Tout a l'air bien mais aucune mise à jour n'est reflétée sur Slave. L'esclave est en cours d'exécution, Read_Master_Log_Pos sur Master et Slave sont identiques. Je regarde même le fichier mysql-relay-bin.00000X et il y a des mises à jour du Master. Mais pas de changement quand je lance "SELECT * FROM db.table;".
Si je change le moteur BD en MyISAM, tout fonctionne correctement.
J'ai également essayé de créer une base de données vide (moteur InnoDB), de la vider et de la restaurer sur l'esclave, démarrer la réplication, puis créer des tables sur Master et les remplir. Dans ce cas, la réplication se porte bien. Mais j'ai aussi besoin d'un moyen de répliquer la base de données déjà créée et remplie.
Que dois-je faire?
InnoDB Esclave ne pas mettre à jour

J'ai:
my.cnf sur Master:

[mysqld] 
bind-address=0.0.0.0 
port=3306 
replicate-do-db=gcm_data 
log-bin=/var/lib/mysql/mysql-bin 
server-id=8217 
datadir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 
user=mysql 

my.cnf sur Slave:

[mysqld] 
bind-address=0.0.0.0 
port=3306 
replicate-do-db=gcm_data 
relay-log-index=/var/lib/mysql/mysql-relay-bin.index 
relay-log=/var/lib/mysql/mysql-relay-bin 
server-id=50890 
datadir=/var/lib/mysql 
socket=/var/lib/mysql/mysql.sock 
user=mysql 

MONTRER MASTER STATUT \ G

File: mysql-bin.000001 
Position: 657 
Binlog_Do_DB: 
Binlog_Ignore_DB: 

SHOW SLAVE STATUT \ G

Slave_IO_State: Waiting for master to send event 
Master_Host: 10.0.13.52 
Master_User: slave1 
Master_Port: 3306 
Connect_Retry: 60 
Master_Log_File: mysql-bin.000001 
Read_Master_Log_Pos: 657 
Relay_Log_File: mysql-relay-bin.000004 
Relay_Log_Pos: 251 
Relay_Master_Log_File: mysql-bin.000001 
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes 
Replicate_Do_DB: gcm_data 
Replicate_Ignore_DB: 
Replicate_Do_Table: 
Replicate_Ignore_Table: 
Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
Last_Errno: 0 
Last_Error: 
Skip_Counter: 2 
Exec_Master_Log_Pos: 657 
Relay_Log_Space: 551 
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: 

SHOW PROCESSLIST sur Master:

| Id | User | Host    | db | Command  | Time | State               | Info    | 
| 16 | slave1 | 10.0.13.140:54683 | NULL | Binlog Dump | 2062 | Has sent all binlog to slave; waiting for binlog to be updated | NULL    | 

SHOW PROCESSLIST Slave:

| Id | User  | Host  | db | Command | Time | State                 | Info    | 
| 14 | system user |   | NULL | Connect | 2203 | Waiting for master to send event          | NULL    | 
| 15 | system user |   | NULL | Connect | 2203 | Has read all relay log; waiting for the slave I/O thread to update it | NULL    | 

S'il est en quelque sorte important que je suis en cours d'exécution à la fois maître et esclave de la station CentOS 6.0 virtuel, MySQL 5.1.61.

Mise à jour

I mis en œuvre un petit test du comportement: j'ai créé am base de données vide sur Master, exécuter un script de réplication (tout va bien - Master et Slave étaient en cours d'exécution). Ensuite, je créé une table InnoDB

CREATE TABLE tbl (id INT, data VARCHAR(10)) engine=InnoDB; 

Le tableau est apparu sur Slave. Puis j'ai rempli le tableau avec des données

INSERT tbl values (1, "1"); 

Les données ont été mises à jour sur Slave.

Puis je me suis arrêté Maître (service mysqld stop) et esclave IO a également arrêté

SHOW SLAVE STATUS - Slave_IO_Running: No, Slave_SQL_Running: Yes 

Puis j'ai commencé MySQL maître et esclave IO a également commencé un certain temps. Mais comme les mises à jour ne sont pas disponibles sur Slave, elles sont présentes dans mysql-relay-bin.00000X sur Slave.

+1

Si vous passez à myisam, cela donne l'impression que vous ne commettez pas de transactions avant de vérifier les modifications sur l'esclave. –

+0

Je n'utilise pas de transactions actuellement. Je teste en utilisant "INSERT db.table (C1, C2) VALEURS (V1, V2);" sur le maître et "SELECT * FROM db.table;" à la fois maître et esclave pour suivre les mises à jour. Sur les mises à jour Master sont disponibles, sur Slave - pas. La chose drôle est que maintenant MyISAM db n'est pas mis à jour sur Slave. –

+0

Pourquoi Skip_Counter est-il réglé sur 2? – ethrbunny

Répondre

0

Eh bien .. J'ai en quelque sorte résolu le problème. Il semble que le problème est exactement en exécutant à la fois Maître et Esclave à partir de machines virtuelles. Je cours le même script de réplication sur de vraies machines et tout fonctionne très bien.
Alors maintenant, la question est de savoir pourquoi cela ne fonctionne pas correctement sur VM.

MISE À JOUR
Il y a quelque temps même problème soulevé sur les machines réelles.
Et finalement, je trouve la source de ce problème:
je testais ma réplication à l'aide des commandes INSERT/SELECT comme ceci:
INSERT db.table (ID, VALUE) valeurs (ID, 2);
sur le maître et la vérification:
SELECT * FROM db.table;
sur l'esclave. Et id ne m'a pas montré les mises à jour.
Mais j'ai essayé:
USE db;
Valeur de la table INSERT (ID, VALUE) (ID, 2);
Et la mise à jour était disponible sur la station Esclave.