quelques améliorations
This commit is contained in:
parent
31965364cb
commit
df05aeca03
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue