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]().
|
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
|
# 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 :
|
Il faut également :
|
||||||
|
|
||||||
* autoriser les connexions MySQL distantes ;
|
* autoriser les connexions MySQL distantes ;
|
||||||
* activer les logs binaires sur chaque serveur : `log_bin mixed` ;
|
* 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…) ;
|
* 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';`.
|
* 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
|
mysql> CHANGE MASTER TO
|
||||||
|
@ -38,7 +42,7 @@ mysql> CHANGE MASTER TO
|
||||||
MASTER_LOG_POS=NNN;
|
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 :
|
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`.
|
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
|
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 :
|
||||||
avec la commande `START SLAVE`. Voici quelques erreurs possibles
|
|
||||||
|
|
||||||
**Zapper l'erreur en cours**
|
**Zapper l'erreur en cours**
|
||||||
|
|
||||||
|
On peut faire manuellement :
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1; START SLAVE;
|
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`
|
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}
|
~~~{.sh}
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
@ -193,15 +202,7 @@ while true; do
|
||||||
done
|
done
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
Les erreurs à ignorer sont alors à placer dans le fichier `errors.txt`, une par ligne, expressions rationnelles étendues (compatibles `grep -E`).
|
**Récupération de position impossible**
|
||||||
|
|
||||||
Puis pour le lancer :
|
|
||||||
~~~
|
|
||||||
# chmod +x
|
|
||||||
# ./mysql-skip-errors.sh
|
|
||||||
~~~
|
|
||||||
|
|
||||||
**Récupération deposition impossible**
|
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
[ERROR] Error reading packet from server: Client requested master to start replication from impossible position (server_errno=1236)
|
[ERROR] Error reading packet from server: Client requested master to start replication from impossible position (server_errno=1236)
|
||||||
|
|
Loading…
Reference in a new issue