Répliquer une base de données MySLQ en local

Afin de pouvoir avoir une site de test, j’ai eu besoin de répliquer en continu la base de données DHC1 vers une autre base de données, DHC2, sur le même serveur MySQL 5.5 sous Debian 7

Après quelques heures de galère à configurer MySQL, voici ma configuration qui permet de réaliser cette réplication continue d’une base de données vers l’autre sur un seul serveur MySQL

Configurer my.cnf

Rien de bien sorcier, il suffit de recopier les lignes suivantes et de les adapter si besoin dans le fichier /etc/mysql/my.cnf

Quelques vérifications de mise: la variable “skip-name-resolve” doit être présente et la variable “bind-address” contient mon adresse IP publique (important pour la suite)

[mysqld]
bind-address = PUBLIC_IP

skip-name-resolve
server-id = 1
replicate-same-server-id= 1
log-bin = /var/log/mysql/mysql-bin
log-error = /var/log/mysql/mysql-err
relay-log = /var/log/mysql/mysql-rel
report-host = master-is-slave-host
binlog_do_db = dhc1
replicate-do-db = dhc2
replicate-rewrite-db = dhc1->dhc2
replicate-wild-do-table = dhc2.%

Redémarrage du service

Le redémarrage du service démarre automatiquement le master

$>/etc/init.d/mysql restart
[ ok ] Stopping MySQL database server: mysqld.
[ ok ] Starting MySQL database server: mysqld . ..

Configurer le compte salve

Il est possible de créer un compte dédié pour la replication ou de simplement utiliser le compte “owner” de la base de données cible (dhc2). On se connecte avec un compte (au hasard: root) ayant les priviléges nécessaire pour réaliser les commandes ci-dessous:

$>mysql -uroot -p

mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000009 |    97091 | dhc1         |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'dhc2'@'PUBLIC_IP' IDENTIFIED BY 'password';

mysql> CHANGE MASTER TO MASTER_HOST='PUBLIC_IP', MASTER_USER='dhc2', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=97091;

mysql> START SLAVE;

mysql> SHOW SLAVE STATUS;

mysql> FLUSH PRIVILEGES;

En cas de problème

  • le site de référence: https://dev.mysql.com/doc/refman/5.5/en/replication.html
  • Vérifier le fichier /var/log/mysql/mysql-err.err
  • Vérifier dans SHOW SLAVE STATUS que les threads Slave_IO_Running et Slave_SQL_Running sont bien à “Yes”
  • Utiliser phpmyadmin (version testée 3.4.11.1) pour contrôler la partie “Replication” des bases de données

rep01

rep02

rep03