diff --git a/HowtoMySQL/Replication.md b/HowtoMySQL/Replication.md index bdeb60de..5be75cfb 100644 --- a/HowtoMySQL/Replication.md +++ b/HowtoMySQL/Replication.md @@ -4,11 +4,12 @@ title: Howto MySQL : réplication Pour le guide d'installation et d'usage courant, consultez [/HowtoMySQL](). -## Préparation +## Préparation d'une réplication MASTER/SLAVE -**Prérequis** : disposer de deux serveurs MySQL avec un `datadir` identique +Il faut : -Dans le cas où le futur master est en production et ne peut être arrêté : +- soit disposer de deux serveurs MySQL inactifs avec un _datadir_ identique, +- soit réaliser un `mysqldump --master-data` sur le serveur où se trouve les données à conserver : ~~~ # mysqldump --master-data --all-databases > mysql.dump @@ -19,15 +20,18 @@ Dans le cas où le futur master est en production et ne peut être arrêté : Il faut également : * autoriser les connexions MySQL distantes ; -* activer les logs binaires sur chaque serveur : `log_bin mixed` ; -* positionner un `server-id` différent sur chaque serveur (a priori, ne pas utiliser 0…) ; -* créer un utilisateur dédié pour la réplication sur chaque serveur avec le droit `REPLICATION SLAVE` : `grant replication slave on *.* to repl@'%' identified by 'XXX';`. +* activer les logs binaires sur chaque serveur : _log_bin mixed_ ; +* positionner un _server-id_ différent sur chaque serveur (a priori, **ne pas utiliser 0**) ; +* créer un utilisateur dédié pour la réplication sur chaque serveur avec le droit _REPLICATION SLAVE_ : `GRANT REPLICATION SLAVE ON *.* TO repl@'%' IDENTIFIED BY 'PASSWORD';`. -## Activation -Récupérer les informations sur `MASTER_LOG_FILE` et `MASTER_LOG_POS` dans le dump avec master-data. (Avec head par exemple). +## Activation d'une réplication MASTER/SLAVE -Sur le serveur B (le _slave_ en mode master-slave), exécuter : +Il faut récupérer les informations _MASTER_LOG_FILE_ et _MASTER_LOG_POS_ : +- soit sur l'un des deux serveurs inactifs avec `SHOW MASTER STATUS` (dans le cas de deux serveurs avec _datadir_ identique), +- soit récupérer l'information dans le `mysqldump --master-data` (avec la commande `head` par exemple). + +Sur le serveur SLAVE, exécuter : ~~~ mysql> CHANGE MASTER TO @@ -38,7 +42,7 @@ mysql> CHANGE MASTER TO MASTER_LOG_POS=NNN; ~~~ -/!\\ **Bien que non obligatoire, il est recommandé de toujours indiquer les directives `MASTER_LOG_FILE` et `MASTER_LOG_POS`** +/!\\ **Bien que non obligatoire, il est recommandé de toujours indiquer les directives `MASTER_LOG_FILE` et `MASTER_LOG_POS` pour éviter des problèmes** Pour exclure une base de la réplication : @@ -101,11 +105,12 @@ Effectuer l'étape _Activation_ dans le sens A->B et B->A On vérifie les erreurs avec les commandes `SHOW SLAVE STATUS` et `SHOW MASTER STATUS`. -En cas d'erreur, il faut « simplement » résoudre l'erreur, puis relancer la réplication -avec la commande `START SLAVE`. Voici quelques erreurs possibles +En cas d'erreur, il faut « simplement » résoudre l'erreur, puis relancer la réplication avec la commande `START SLAVE`. Voici quelques erreurs possibles : **Zapper l'erreur en cours** +On peut faire manuellement : + ~~~ mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE; ~~~ @@ -134,10 +139,14 @@ On peut également avoir d'autres erreurs, par exemple `Could not execute Delete Si plusieurs types d'erreur à ignorer : `slave-skip-errors = 1032,1062` -**Ignorer des erreurs plus finement** +L'inconvénient est qu'il faut redémarrer MySQL. Pour éviter cela on peut automatiser le zap de l'erreur en cours : -On peut vouloir ignorer des erreurs plus finement que toutes les `DUPLICATE ENTRY`, ou plusieurs erreurs à la fois, ou encore simplement le faire sans redémarrer MySQL. -Cela peut se faire avec un petit script shell. Copiez le code suivant dans `mysql-skip-errors.sh` : +~~~ +# while true; do while mysql -e "show slave status" | grep '1062.Error.*REPORT'; \ + do mysql -e "SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;"; done ; sleep 1; done +~~~ + +On peut également utilisé un script Shell plus évolué qui prendre les motifs à ignorer dans un fichier *error.txt* (expressions rationnelles étendues, compatibles _grep -E_) et qui proposera de zapper manuellement (ou pas) si l'erreur ne correspondant aux motifs : ~~~{.sh} #!/bin/sh @@ -193,15 +202,7 @@ while true; do done ~~~ -Les erreurs à ignorer sont alors à placer dans le fichier `errors.txt`, une par ligne, expressions rationnelles étendues (compatibles `grep -E`). - -Puis pour le lancer : -~~~ -# chmod +x -# ./mysql-skip-errors.sh -~~~ - -**Récupération deposition impossible** +**Récupération de position impossible** ~~~ [ERROR] Error reading packet from server: Client requested master to start replication from impossible position (server_errno=1236)