Elle est où ma base

Posted on mer. 08 juillet 2009 in Linux

Dans la série je suis con, mais alors putain j'aime ça, je vous présente : Moi. Comme tous le monde dit que c'est bien, j'ai fait des sauvegardes des donnés de mon serveur pour prévoir la fin du monde/de mon serveur. Seulement dans mon extrême connerie, j'ai oublié de sauvegarder mes bases MySQL.

D'où le sujet d'aujourdhui : Comment récupérer ses bases MySQL à partir d'un live-cd lorsque celles-ci sont enfouient dans une partition logique LVM elle même collée dans un système RAID-1.

On démarre le serveur sur un live-cd. J'ai choisi le rescue de Debian Lenny pour être raccord avec le system installé et surtout pour éviter les problème de version de LVM incompatibles.

Partie RAID-1 On assemble les 2 partitions RAID

mdadm -assemble /dev/md1 /dev/sda2 /dev/sdb2

Vérif pour être certain de l'état du volume RAID-1 :

>cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sda2[0] sdb2[1]
      732330944 blocks [2/2] [UU]

Tout est ok, on peut continuer.

Partie LVM On va détecter les groupes LVM

vgscan
  Reading all physical volumes.  This may take a while...
  Found volume group "vg0" using metadata type lvm2

vg0 est maintenant disponible dans /etc Mes base MYSQL se trouvent sur le volume logique root. Avant de pouvoir le monter, il faut le marquer comme actif :

lvchange -ay vg0/root

Montage de la partition

mkdir /media/root
mount /dev/vg0/root /media/root/

Ouf, tout est là. On passe à la suite. Comme la suite va le montrer, je suis un quiche en MYSQL. Et s'il y a bien un truc qui m'intéresse pas c'est bien ça ! Donc il y a surement plus beau et plus rapide ...

On commence par virer les bases présentes sur le livecd :

cd /var/lib/mysql/
 rm -r ./*

On va dire à MYSQL de créer un nouveau schéma DBMS :

mysql_install_db
Installing all prepared tables
Fill help tables
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h kimp4.biyn.local password 'new-password'
See the manual for more instructions.
NOTE: If you are upgrading from a MySQL <= 3.22.10 you should run
the /usr/bin/mysql_fix_privilege_tables. Otherwise you will not be
able to use the new GRANT command!
You can test the MySQL daemon with the benchmarks in the 'sql-bench' directory:
cd sql-bench ; perl run-all-tests
Please report any problems with the /usr/bin/mysqlbug script!
The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at https://order.mysql.com

Je sais pas vraiment si c'est nécessaire. A vrai dire la démarche est piquée ici.

On re-démarre le serveur MYSQL pour qu'il s'aperçoive du changement:

/etc/init.d/mysql start

On l'arrête :

/etc/init.d/mysql stopt

On peut maintenant copier les fichier de l'ancienne base de donnée :

cd /var/lib/mysql
cp -R /mnt/root/var/lib/mysql/* .

On change le propriétaire de ces fichiers :

cd /var/lib/mysql
chown -R mysql:mysql *

A ce stade, il vous faudra surement changer le password de l'utilisateur root de mysql. Pour ce faire la lecture de ceci est fortement recommandée. En résumé ça donne ça :

On arrête le serveur MYSQL:

/etc/init.d/mysql stop

On démarre mysqld avec les options --skip-grant-tables et --skip-networking :

mysqld --skip-grant-tables --skip-networking &
Dans ce mode, on peur changer le password sans ce faire insulter (rappel
un grand pouvoir engeandre de grandes responsabilitées, blah blah blah) :
mysql mysql

puis :

UPDATE user SET password=PASSWORD('nouveaumotdepasse') WHERE User="root" AND Host="localhost";

On redemarre le serveur MYSQL :

/etc/init.d/mysql restart

On peut maintenant dumper une base :

mysqldump nom_de_la_base > base_sauvee.txt

OUFF !!! On peut maintenant ré-installer tranquillement le serveur.

Restauration

Il faut commencer par créer un base vide du même nom que l'ancienne. Je vous laisse le choix de la méthode. Perso je me contente d'un :

mysql> CREATE DATABASE nom_de_la_base

Puis, tout connement :

mysql -u utilisateur -p nom_de_la_base_qui_recoit < base_sauvee.txt

Tadada. Un rapide petit tour sur mon Wordpress m'indique tout fonctionne bien. Ouf. 3 jours de serveur down tout de même.