Réplication de bases mysql

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche


Avant de commencer

Vous avez donc, sur deux serveurs différents, le service mysql de paramétré et fonctionnel. La réplication est asynchrone c'est à dire que l'un des serveur sera maitre et l'autre esclave. Il ne faudra pas modifier la base de l'esclave une fois la réplication fonctionnelle.

Nous prendrons le cas du wiki comme exemple. Partons du principe qu'il est installé sur le serveur maitre (IP 0.0.0.1) et qu'on veut une copie de sa base sur le serveur esclave (IP 0.0.0.2).



Sur le Serveur Maitre

Connectez vous sur la base du serveur maitre:

mysql -p

Créez un utilisateur qui pourra se connecter depuis l'esclave pour faire la réplication (avec utilisateur:dbsave, mot de passe:mdp)

mysql> REPLICATION SLAVE ON *.* TO 'dbsave'@'0.0.0.2' IDENTIFIED BY 'mdp';



Modifiez la configuration de mysql par l'édition du fichier /etc/mysql/my.cnf

Notez au passage que votre serveur esclave se connectera par defaut sur le port 3306. Vous pouvez donc en profiter si vous souhaitez changer de port. Dans tous les cas veillez à ce que ce port soit ouvert pour les connections entrante, au moins pour votre serveur esclave.

Sous [mysqld]
Si ce n'est pas le cas, commentez la ligne commençant pas bind-adress.
Au contraire dé-commentez ou ajoutez les lignes:

server-id               = 1
log_bin                 = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
binlog_do_db            = wikidb


Avec donc la base du wiki, wikidb, que nous souhaitons sauvegarder.

Nous allons d'ailleurs l'envoyer sur le serveur esclave après avoir redémarré le service.

service mysql restart


Reconnectez vous à mysql pour arrêter l'écriture dans les base et vérifiez où en sont les logs du binaire:

mysql> FLUSH TABLES WITH READ LOCK;
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000217 |   112188 | wikidb       |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)


Sortez de mysql pour extraire la base qui nous intéresse:

 mysqldump -u root -p wikidb > wikidb_1.sql


Envoyez là sur votre serveur esclave:

 scp ./wikidb_1.sql root@0.0.0.2:/root



Sur le Serveur esclave

On commence par modifier la config puis on redémarre mysql.
L'important est d'avoir un id différent.

server-id               = 2
#log_bin                        = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
master-host = 0.0.0.1
master-user = dbsave
master-password = mdp
master-port = 3306
slave-skip-errors = 1062
replicate-do-db = wikidb
#binlog_do_db           = include_database_name
#binlog_ignore_db       = include_database_name


Sous mysql on stoppe l'écriture:

mysql> FLUSH TABLES WITH READ LOCK;


On injecte la base à jour provenant du maitre:
mysql -p wikidb < wikidb_1.sql
Sous mysql on indique l'état des enregistrements du maitre récupérés plus tôt, on libère les bases (sur le maitre aussi) et enfin on lance la réplication:

mysql> CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000217', MASTER_LOG_POS=112188;
mysql> UNLOCK TABLES; (a faire aussi sur le maitre)
mysql> START SLAVE;

Erreurs rencontrées

Pour observer l'état de la réplication ,dans mysql, sur le serveur esclave, entrez la commande:

mysql> SHOW SLAVE STATUS;

S'il n'y a pas d'erreur, tout est ok.

impossible de se connecter depuis l'esclave

  • vérifier que vous pouvez vous connecter sur le port mysql (avec un telnet par exemple)
  • que vous pouvez vous connecter au mysql du serveur maitre depuis l'esclave (option -h 0.0.0.1)
  • que dans la configuration du maitre la ligne commençant par bind-adress est bien commentée