La liste suivante explique ce qui est supporté ou pas. Des
informations spécifiques InnoDB
sur la
réplication sont disponibles dans la section
Section 15.7.5, « 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 Section 1.5.7.4, « Bugs connus / 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 Section 13.5.4.2, « 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
Section 14.3, « Le moteur de table MEMORY
(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 :
A -> B -> C -> A
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. See
Section 5.2.3, « Variables serveur système ».
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.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.