mercredi 13 août 2014

Réparer une base mysql avec des tables innodb/ibdata corrompues

Pour que cette méthode fonctionne, il faut au moins posséder un dump de la structure de la base, et il faut l'option innodb_file_per_table activée (c'est toujours une bonne habitude de l'activer)
  1. Copier les fichier IBD dans un endroit sûr, par exemple /home/bob
  2. Redémarrer la base, en ayant supprimé éventuellement les tablespaces systèmes ibdata1 et ib_logfile avant. attention aux tables InnoDB dans la base Mysql, les recréer au besoin
  3. Réimporter la structure de la base
  4. Réimporter les données, et la c'est la partie la plus dure ! il faut exporter les tablespaces que l'on vient de créer et réimporter à la place ceux qu'on a sauvegardé, le tout en redémarrant mysql à chaque action pour être sûr de flusher sur le disque. C'est ce que le script suivant fait:
#! /bin/bash
# superformance.blogspot.com
BKPDIR=/home/bob
USER=root
PASS=pass
DB=db
 
for table in $(mysql -u ${ROOT} -p${PASS} \
    -NBe "select TABLE_NAME from information_schema.TABLES \
    where ENGINE='InnoDB' and TABLE_SCHEMA='${DB}';" )
    #supprimer le tablespace vide que l'on vient de creer
    mysql -u ${ROOT} -p${PASS} \
    -NBe "alter table ${table} discard tablespace;"
    # arreter mysql
    /etc/init.d/mysqld stop
    #Copier l'ancien TBS
    cp $BKPDIR/$table.ibd /var/lib/mysql/$DB
    #demarrer mysql
    /etc/init.d/mysqld start
    #importer l'ancien tbs
    mysql -u ${ROOT} -p${PASS} -NBe \
    "alter table ${table} import tablespace;"
    /etc/init.d/mysqld restart
done



Ensuite sauvegarder la base avec mysqldump !

Aucun commentaire:

Enregistrer un commentaire