quelques améliorations

This commit is contained in:
gcolpart 2017-01-07 16:18:16 +01:00
parent 31965364cb
commit df05aeca03

View file

@ -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)