Cet article montre comment déplacer les données d'un serveur MySQL sous Debian Lenny sur une autre machine Debian ! Attention je ne garantie pas que cela fonctionne sur d'autres versions de Debian.
Petit cours théorique Debian et MySQL
J'ai un petit business avec quelques bases de données, ayant un petit serveur (Celeron 1.2GHz, 512Mo de ram) : la machine s'épuise très vite avec une charge faible. J'ai investi dans un serveur bien plus puissant (Xeon Quad Core et 4Go de ram), là on passe à quelque chose de sérieux !
Alors petit topo sur Debian :
- Les utilisateurs MySQL sont géré dans la base de donnée "mysql".
- Le lancement et l'arrêt de MySQL (avec /etc/init.d/) est géré par l'utilisateur : debian-sys-maint et son mot de passe est généré par le système.
Alors ce qui peut être assez facile de se dire : "tiens je fais un bon gros dump des toutes mes bdd, j'insère dans le nouveau serveur, un ptit coup de flush privileges et c'est fini !". Oui mais attention, comme je l'ai indiqué avant, l'utilisateur debian-sys-maint est primordial ! Alors les questions qui doit t'arriver en tête : comment Debian utilise cet utilisateur ? quel est son mot de passe ?
En fait, lorsque t'utilises la commande "mysql" en console souvent : mysql -u monutilisateur -p, il te demande le mot de passe. Mais parfois, dans un script il faut pouvoir se connecter sans utiliser de mot de passe et l'utilisation du programme expect n'est pas très judicieux. Donc MySQL, a crée les fichiers *.cnf, ces fichiers permettent (avec un chmod 600 pour la sécurité) d'utiliser un mot de passe en clair stocké dans un fichier.
Donc ton raisonnement doit aller vite : lorsque MySQL est lancé par le système init par root, il a aussi besoin de debian-sys-maint donc d'un fichier *.cnf ! Et voilà tu as tout compris, qu'à l'installation via aptitude (apt-get pour les vieux) il génère ce fichier et qu'il faut le copier sur la nouvelle machine.
En pratique
- Dump de toute la base de donnée du serveur à migrer :
- Copie du fichier /etc/mysql/debian.cnf
- Recharger les privileges de MySQL
- Redemarrer MySQL pour tout vérifier !
Script à mettre sur le nouveau serveur :
#!/bin/bash
date=$(date "+%d%b%Y" | sed 's/\.//g')
sqlfile="/$USER/backupsql$date.sql"
passroot='mdpmysqlroot'
mysql -u root --password='$passroot' < $sqlfile
mysql -u root --password='$passroot' -e 'flush privileges'
/etc/init.d/mysql restart
Voici un petit script qui envoie toutes les données au nouveau serveur (j'ai un utilisateur qui a accès en lecture à toutes les base de données, et authentification ssh par clé publique) :
#!/bin/bash
user_sql='user_reader'
pass_sql='user_reader'
cnf='/etc/mysql/debian.cnf'
date=$(date "+%d%b%Y" | sed 's/\.//g')
sqlfile="/home/$USER/backups/backupsql$date.sql"
server='mon-nouveau-server.com'
mysqldump -A -u $user_sql --password=$pass_sql > $sqlfile
scp $sqlfile root@$server:/root/
scp $cnf root@$server:$cnf
ssh root@$server "/root/script.sh" # changer la valeur de la variable
Et voilà ! Tu as une instance de MySQL qui est exactement la même que l'ancienne !