Il faut faire attention au bidirectionnel, exemple :
Contexte : un serveur mysql A, un serveur mysql B, une table "personne" (id [AUTO_INCREMENT, PRIMARY], nom, prenom) sur chaque serveur (structure identique). Pour l'exemple, on va partir de la table vide.
Dans le cas d'une réplication bi directionnelle voila ce qui se passerai :
Contexte : sur A, AUTO_INCREMENT = 0 sur B, AUTO_INCREMENT = 0
T1 : Sur A, j'insere un enregistrement :
INSERT INTO personne SET nom = "machin1", prenom = "k"
l'id est fixé à 1
Contexte : sur A, AUTO_INCREMENT = 1 sur B, AUTO_INCREMENT = 0
T1bis : B récupère le binlog de A qui lui dis
INSERT INTO personne SET nom = "machin1", prenom = "k"
attention, le binlog ne dira jamais a B :
INSERT INTO personne SET id = 1, nom = "machin1", prenom = "k"
Contexte : sur A, AUTO_INCREMENT = 1 sur B, AUTO_INCREMENT = 1
T2 : Sur B, j'insere un enregistrement :
INSERT INTO personne SET nom = "machin2", prenom = "k"
l'id est fixé à 1
Contexte : sur A, AUTO_INCREMENT = 1 sur B, AUTO_INCREMENT = 2
T2bis : A récupère le binlog de B qui lui dis
INSERT INTO personne SET nom = "machin2", prenom = "k"
Contexte : sur A, AUTO_INCREMENT = 2 sur B, AUTO_INCREMENT = 2
Jusque là, tout va bien ! mais entrons dans un contexte un peu plus réaliste : A recois des requetes d'INSERT, d'UPDATE de DELETE (SELECT n'est pas log dans binlog car il ne modifie pas la table), idem pour B.
Le binlog dans la réalité est un fichier log que le serveur esclave (selon la direction, A ou B) viens chercher à intervalles régulier sur le serveur maitre puis dans un second temps l'execute sur lui meme. Les binlog sont traités au meme niveau que les autres reqûetes, pas de priorités.
Imaginons donc maintenant que sur T3 on est la chose suivante :
Contexte : sur A, AUTO_INCREMENT = 2 sur B, AUTO_INCREMENT = 2
T3 : Sur B, j'insere un enregistrement :
INSERT INTO personne SET nom = "machin3", prenom = "k"
l'id est fixé à 3
Contexte : sur A, AUTO_INCREMENT = 2 sur B, AUTO_INCREMENT = 3
T3 (même instant) : Sur A, j'insere un enregistrement :
INSERT INTO personne SET nom = "machin4", prenom = "k"
l'id est fixé à 3
Contexte : sur A, AUTO_INCREMENT = 3 sur B, AUTO_INCREMENT = 3
T3bis : A récupère le binlog de B qui lui dis
INSERT INTO personne SET nom = "machin3", prenom = "k"
Contexte : sur A, AUTO_INCREMENT = 4 sur B, AUTO_INCREMENT = 3
T3bis (même instant) : B récupère le binlog de A qui lui dis
INSERT INTO personne SET nom = "machin4", prenom = "k"
Contexte : sur A, AUTO_INCREMENT = 4 sur B, AUTO_INCREMENT = 4
Qu'avons nous en T4 dans les deux tables ?
A.personne :
1 machin1
2 machin2
3 machin3
4 machin4
5
B.personne :
1 machin1
2 machin2
3 machin4
4 machin3
5
On a donc une erreur dans le contenu des tables et la relation id, nom, prénom entre les deux serveurs. Mais pour A comme pour B tout est normal !
Voila un probleme de la synchronisation bidirectionnelle.
Ce probleme d'id en AUTO_INCREMENT peux etre résolu soit pas le programme en lui meme, soit en faisant appel à une table externe unique qui attribue l'id, soit par vérification sur les deux serveurs... bref plein de solutions, mais un casse tête a l'arrivée
Note :
Pour faire du bidirectionnel, il faut spécifier à mySQL qu'il peut se synchroniser avec un serveur ayant un ID supérieur ou égal a lui :
--replicate-same-server-id
Partager