6 Réplication de MySQL
Manuel de Référence MySQL 4.1 : Version Française
. Introduction à la réplication . Présentation de l'implémentation de la réplication . Détails d'implémentation de la réplication . Comment mettre en place la réplication . Compatibilité de la réplication entre les versions de MySQL ->Fonctionnalités de la réplication et problèmes connus . Options de démarrage de la réplication . FAQ de la réplication . Correction de problèmes courants . Rapporter des bugs de réplication
|
6.6 Fonctionnalités de la réplication et problèmes connus
La liste suivante explique ce qui est supporté ou pas. Des informations spécifiques
InnoDB
sur la réplication sont disponibles dans la section
InnoDB
et la réplication MySQL .
-
La réplication s'effectue correctement sur les valeurs
AUTO_INCREMENT
,
LAST_INSERT_ID()
et
TIMESTAMP
.
-
Les fonctions
USER()
et
LOAD_FILE()
sont répliquées
dans modifications, et ne seront pas fiable une fois rendues sur le
serveur esclave. C'est aussi vrai pour
CONNECTION_ID()
pour les
esclaves de versions antérieures à la 4.1.1.
La
nouvelle
fonction
PASSWORD()
de MySQL 4.1, est
bien répliquée depuis les maîtres version 4.1.1; vos esclaves doivent être en
version 4.1.0 ou plus récent pour la répliquer. Si vous avez d'anciens
esclaves, et que vous devez répliquer la fonction
PASSWORD()
depuis un maître 4.1, vous devez lancer le maître avec l'option
--old-password
.
-
Les variables
SQL_MODE
,
UNIQUE_CHECKS
,
SQL_AUTO_IS_NULL
sont répliquées depuis la version 5.0.0.
Les variables
SQL_SELECT_LIMIT
et
TABLE_TYPE
ne sont pas
répliquées pour le moment.
FOREIGN_KEY_CHECKS
est répliquée
depuis la version 4.0.14.
-
Vous devez utiliser le même jeu de caractères (
--default-character-set
)
sur le maître et sur l'esclave. Sinon, vous risquez de rencontrer des erreurs de
clés dupliquées, sur l'esclave, ces une valeur pourrait être considérée comme
unique sur le serveur et non sur l'esclave. Les jeux de caractères seront
répliqués en version 5.0.
-
Si vous utilisez des tables transactionnelles sur le maître et non-transactionnelle
sur l'esclave, pour les mêmes tables, vous rencontrerez des problèmes
si l'esclave est interrompu au milieu d'un bloc
BEGIN/COMMIT
, car
l'esclave reprendra ultérieurement au début du bloc
BEGIN
.
Ce problème est sur notre liste de tâche, et sera corrigé prochainement.
-
Les requêtes d'
UPDATE
qui utilisent des variables utilisateurs
ne sont pas correctement répliquées sur les serveurs 3.23 et 4.0.
C'est corrigé en 4.1. Notez que les noms de variables utilisateurs sont
insensibles à la classe depuis la version 5.0, alors il est recommandé de
prendre cela en compte lors de la configuration de la réplication entre
un serveur version 5.0 et une version précédente.
-
L'esclave peut se connecter au maître avec la sécurisation SSL, si le maître et
l'esclave sont tous les deux en versions 4.1.1 ou plus récentes.
-
Si la clause
DATA DIRECTORY
ou
INDEX DIRECTORY
est utilisée dans
la commande
CREATE TABLE
sur le maître, la clause est aussi
utilisée sur l'esclave. Cela peut causer des problèmes s'il n'existe pas de
dossier correspondant sur le système de fichiers de l'esclave. Depuis
MySQL 4.0.15, il y a une option de mode SQL
sql_mode
appelée
NO_DIR_IN_CREATE
. Si le serveur esclave fonctionne avec ce mode SQL,
il va simplement ignorer ces clauses avant de répliquer les commandes
CREATE TABLE
. Le résultat est que les données
MyISAM
et les
fichiers d'index seront créées dans le dossier de la base.
-
Même si nous n'avons jamais vu d'occurrence de ce problème,
il est théoriquement possible pour les données du maître et de l'esclave
de différer si une requête non-déterministe est utilisée pour modifier les
données, c'est à dire si elle est laissé au bon vouloir de l'optimiseur,
ce qui n'est pas une bonne pratique même sans la réplication.
Pour plus d'informations, voyez Bugs ouverts / limitations de MySQL .
-
Avant MySQL 4.1.1, les commandes
FLUSH
,
ANALYZE
,
OPTIMIZE
,
REPAIR
n'étaient
pas stockées dans le log binaire, et donc, elles n'étaient pas répliquées
avec les esclaves. Ce n'est pas
normalement un problème, car
FLUSH
ne modifie pas les tables.
Cela peut signifier que vous avez modifié des droits dans les tables
MySQL directement sans la commande
GRANT
et que vous avez répliqué
les droits de
mysql
sans pouvoir faire de commande
FLUSH PRIVILEGES
sur vos esclaves pour les prendre en compte.
Depuis MySQL version 4.1.1, ces commandes sont écrites dans le log binaire,
(hormis
FLUSH LOGS
,
FLUSH MASTER
,
FLUSH SLAVE
,
FLUSH TABLES WITH READ LOCK
) à moins que vous ne spécifiez
NO_WRITE_TO_BINLOG
ou son alias
LOCAL
).
Pour un exemple d'utilisation de la syntaxe, voyez Syntaxe de
FLUSH
.
-
MySQL supporte uniquement un maître et plusieurs esclaves. Ultérieurement,
nous allons ajouter un algorithme de choix automatique du maître. Nous allons
aussi introduire une notion d'agent, qui aideront à équilibrer la charge en
envoyer les commandes
SELECT
aux différents esclaves.
-
Lorsqu'un serveur s'arrête et repart, les tables
MEMORY
(
HEAP
) sont
vidées. Depuis MySQL 4.0.18, le maître réplique cet effet comme ceci :
la première fois que le maître utilise une table
MEMORY
après le démarrage,
il indique aux esclaves que la table doit être vidée en ajoutant une commande
DELETE FROM
pour la table en question, dans son log binaire.
Voyez Tables
HEAP
pour plus de détails.
-
Les tables temporaires sont répliquées depuis la version 3.23.29,
à l'exception des cas où vous éteignez le serveur esclave
(et pas juste le thread esclave), que vous avez des tables temporaires ouvertes
et qu'elles sont utilisées dans des modifications ultérieures.
(Si vous éteignez l'esclave, les tables temporaires utilisées par ces commandes
ne sont plus disponibles au redémarrage de l'esclave).
Pour éviter ce problème, n'éteignez jamais un esclave qui a des tables temporaires
actives. Utilisez cette procédure :
- Utilisez la commande
SLAVE STOP
.
- Vérifiez la variable de statut
Slave_open_temp_tables
pour
vérifier si elle vaut bien 0.
- Si elle vaut bien 0, exécutez
mysqladmin shutdown
.
- Si le nombre n'est pas 0, redémarrez l'esclave avec la commande
SLAVE START
.
- Répetez la procédure et voyez si vous avez plus de chance la prochaine fois.
Nous envisageons de corriger ce problème prochainement.
-
Il est possible de connecter les serveurs
MySQL en chaîne bouclée (chaque serveur est le maître du précédent
et l'esclave du suivant, en boucle), avec l'activation de l'option
log-slave-updates
.
Notez que de nombreuses requêtes ne vont pas fonctionner dans ce type
de configuration à moins que votre code client ne soit écrit avec beaucoup
de soin, pour qu'il se charge des problèmes qui pourraient arriver dans différentes
séquences de modifications sur différents serveurs.Cela signifie que vous pouvez réaliser une configuration comme ceci :
Les identifiants de serveurs sont inscrits dans les événements. A saura
qu'un événement qu'il a déjà exécuté lui est revenu, et il ne l'exécutera
pas deux fois : il n'y a pas de risque de boucle infinie. Mais dans
une configuration circulaire, vous devez vous assurer que le code client
n'effectue pas de modifications conflictuelles. En d'autres termes, si
vous insérez des données dans A et C, vous devez vous assurez qu'il
n'y a pas de conflit de clé unique. Ne modifiez pas non plus deux lignes
simultanément sur deux serveurs, si l'ordre des modifications a une
importance pour vous.
-
Si la requête sur l'esclave génère une erreur, le thread esclave s'arrête,
et un message sera ajouté dans le fichier d'erreur. Vous
devriez vous connecter pour corriger manuellement les données de l'esclave,
puis relancer l'esclave avec la commande
SLAVE START
(disponible
depuis la version 3.23.16. En version 3.23.15, vous devrez redémarrer le serveur.
-
Si la connexion au maître est perdue, l'esclave tente de se reconnecter immédiatement,
et en cas d'échec, il va retenter toutes les
master-connect-retry
(par défaut,
60) secondes. A cause de cela, il est sage d'éteindre le serveur maître et de le redémarrer
régulièrement. L'esclave sera capable de gérer les problèmes réseau.
Variables sytème du serveur .
-
Eteindre l'esclave proprement est sûr, car il garde la trace du point où il
en est rendu. Les extinctions sauvages vont produire des problèmes,
surtout si le cache disque n'a pas été écrit sur le disque avant que le
système ne s'arrête. Votre niveau de tolérance aux pannes sera grandement
amélioré si vous avez de bons onduleurs.
-
Etant donné la nature non transactionnelle des tables MySQL, il est possible
qui va ne faire qu'une partie de la modification, et retourner une erreur. Cela
peut arriver, par exemple, dans une insertion multiple dont une des lignes
viole une contrainte d'unicité, ou si un très long
UPDATE
est interrompu
au milieu du stock de ligne. Si cela arrive sur le maître, l'esclave va s'arrêter
et attendre que l'administrateur décide quoi faire, à moins que l'erreur soit
légitime, et que la requête arrive à la même conclusion. Si le code d'erreur
n'est pas désirable, certaines erreurs (voire même toutes), peuvent être masquées
avec l'option
slave-skip-errors
, depuis la version 3.23.47.
-
Si vous modifiez une table transactionnelle depuis une table transactionnelle,
dans un bloc de transaction
BEGIN/COMMIT
, les modifications
du log binaire peut être déphasées si un thread a fait une modification
dans la table non-transactionnelle, avant la validation de la transaction.
Les transactions sont écrites dans le log binaire au moment de
leur validation.
-
Avant la version 4.0.15, les modifications sur des tables non-transactionnelles
sont écrites dans le log binaire immédiatement, alors que les modifications
d'une transaction sont écrites au moment du
COMMIT
ou ignorées
si vous utilisez un
ROLLBACK
; vous devez prendre cela en compte lors de
la modification de tables transactionnelles et non-transactionnelles dans la
même transaction, si vous utilisez le log binaire pour les sauvegardes ou
la réplication. En version 4.0.15, nous avons modifié le comportement du log
pour les transactions, qui mèlent les modifications de tables transactionnelles
et non-transactionnelles dans la même transaction, pour résoudre ce problème.
L'ordre des requêtes est maintenant maintenu, et toutes les requêtes sont
écrites, même en cas d'annulation
ROLLBACK
. Le problème qui reste
est que lorsqu'une seconde connexion modifie une table non-transactionnelle
durant la transaction de la première connexion, une erreur d'ordre dans les
requêtes peut survenir, car la seconde transaction sera écrite immédiatement
après sa réalisation.
-
Lorsque l'esclave 4.x réplique une commande
LOAD DATA INFILE
depuis un maître 3.23,
les valeurs des colonnes
Exec_Master_Log_Pos
et
Relay_Log_Space
pour
SHOW SLAVE STATUS
sont incorrectes. L'erreur de
Exec_Master_Log_Pos
va
causer un problème lorsque vous stopperez et relancerez la réplication. Il est donc bon
de corriger cela avec la commande
FLUSH LOGS
sur le maître.
Ces bogues sont corrigés pour les esclaves en MySQL 5.0.0.
La table suivante liste les problèmes de MySQL 3.23 qui sont corrigés en
MySQL 4.0 :
-
LOAD DATA INFILE
est correctement géré, tant que les données
résident toujours sur le serveur maître au moment de la propagation.
-
LOAD LOCAL DATA INFILE
sera ignoré.
-
En version 3.23
RAND()
dans les modifications de lignes ne se propage
pas correctement. Utilisez
RAND(some_non_rand_expr)
si vous répliquez
des modifications qui incluent
RAND()
. Vous pouvez, par exemple, utiliser
UNIX_TIMESTAMP()
comme argument de
RAND()
. Ceci est corrigé en version
4.0.
|