Réplication Mysql ou comment sauvegarder ses bases de données
Par km, jeudi 30 juillet 2009 à 17:47 :: informatique ::#74
Cet article a juste pour objectif de donner une procédure pour sauvegarder l’intégralité d’un serveur MySQL et maintenir automatiquement les mises à jours.
Je n’invente rien tout se trouve sur le net principalement sur le site MySQL
Pré requis
Avant de poursuivre la lecture de cet article, nous devons avoir :
- 2 serveurs MySQL
- Un compte root MySQL pour chacun
- Des comptes *nix avec accès ssh et les bons droits
- l’ip ou nom d’hôte du maitre MySQL
Pour les dénominations, je parlerais de Maitre pour le serveur à sauvegarder, d’Esclave pour le serveur de sauvegarde.
Préparer le Maitre
Il faut :
- créer un compte de réplication, qui sera autorisé à se connecter pour obtenir les mises à jours
- configurer le serveur
- faire une sauvegarde complète des données à un instant T connu.
- sauvegarder le fichier de configuration debian.cnf
Créer le compte de réplication
Au choix, nous avons phpmyadmin avec son interface accessible et la console MySQL.
Concernant phpmyadmin, l’interface est suffisamment claire. Depuis la page d’accueil on accéde à la gestion des comptes via le lien Privilèges.
Concernant la ligne de commande, il faut accéder à la console MySQL via :
Les points à prendre en compte sont :
- %
pour le host
- %
pour les bases de données
- REPLICATION SLAVE
pour les privilèges
Avec les paramètres précédents, on souhaite que le compte de réplication puisse accèder au mettre à l’ensemble des bases de données et ce depuis n’importe où sur le net.
Si on maîtrise bien MySQL, on peut définir les bases sauvegardables et les IP possibles du serveur esclave (dans ce cas on sort du cadre de cet article et il faut lire la vraie documentation).
Au choix de l’interface MySQL, nous saisissons :
GRANT REPLICATION SLAVE ON * . * TO 'esclave'@ '%' IDENTIFIED BY '***' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
GRANT ALL PRIVILEGES ON `esclave_%` . * TO 'esclave'@ '%';
Configurer
Si la configuration initialee ne l’a pas fait, dans le fichier
, nous devons saisir :
log-bin
server-id=master_id
est un entier compris entre 1 et 2^32 − 1.
Si ces données sont ajoutées, il faut alors relancer le serveur MySQL avec
Exporter les données
SQL
La réplication ne peut se faire qu’en partant d’un référentiel temps commun et une copie des données exactes à cet instant. Pour réaliser ceci, il existe plusieurs solutions, je vous invite à la lire la documentation officielle pour les voir.
Mon choix s’est porté sur une solution la plus agnostique vis à vis des choix de configuration (Myisam, innodb, base mysql, ...) mais qui en contre partie est la plus lente.
indique une copie complète du serveur.
L’attribut
exporte aussi le référentiel temps au moment de la copie, de plus il verrouille les bases le temps de la sauvegarde.
debian.cnf
Comme on effectue une copie exhaustive de la base, nous perdons les données présente dans la table
. Cette base contient entre autres les paramètres des comptes. Pour éviter que l’esclave se mélange les pinceaux, il faut copier le fichier
Configurer l’esclave
Nous devrons :
- importer les données du maitre
- mettre à jour debian.cnf
- indiquer l’adresse du maitre
- lancer la synchronisation
Importer
L’importation se fait en ligne de commande grâce à
Debian.cnf
Comme nous venons d’écraser l’intégralité des bases de données, nous devons aussi remplacer les paramètres de connexion mysql. Nous écrasons simplement le fichier
par celui du maitre.
Pour charger les modifications, nous relançons le serveur
/etc/init.d/mysql stop ; /etc/init.d/mysql start
Configurer
Nous avons 2 choses à faire :
- donner un identifiant serveur
différent du master dans
- indiquer la localisation du maitre.
server-id=slave_id
est un entier compris entre 1 et 2^32 − 1 et différent de
.
Depuis une commande mysql (
), nous indiquons les paramètres de connexion.
MASTER_HOST='nom d'hôte du maitre ou IP',
MASTER_USER='compte esclave',
MASTER_PASSWORD='mot de passe'
Les paramètres de synchronisation
et
ont déjà été sauvegardé lors de l’importation. (se reporter à la documentation)
Synchroniser
Maintenant nous avons un maitre qui est prêt à transmettre ses mises à jours depuis la création du fichier
et un esclave à l’identique du maitre à cet instant configuré pour chercher les dernières modifications.
La synchronisation se fait à l’aide
. Nous controlons le bon comportement via le fichier de log système.(
)
Jul 29 17:14:50 esclave mysqld[3600]: 090729 17:14:50 [Note] Slave I/O thread: connected to master 'esclave@hote.master.com:3306', replication started in log 'mysql-bin.000792' at position 401029
Si vous n’avez pas un log similaire, vous êtes bon pour lire la vraie documentation.
Commentaires
A mon avis ce n’est pas vraiment une technique de sauvegarde fiable : certes ça protège du plantage matériel d’un serveur, mais pas d’un delete malheureux..
Enfin, c’est ce qui est dit sur la doc de MySql (http://dev.mysql.com/doc/refman/5.0...)