Accueil > SPIP > Récupérer, dans une sauvegarde de plusieurs Gigabytes, le contenu d’une (…)
Récupérer, dans une sauvegarde de plusieurs Gigabytes, le contenu d’une table malencontreusement effacée
jeudi 10 novembre 2011, par
Hors donc une table a été malencontreusement effacée de la base de données. La taille de la sauvegarde dont je dispose est telle que travailler dans mon éditeur de texte habituel est strictement impossible, la simple ouverture du fichier nécessitant plus de 20 minutes. Récit d’une quête et de sa mise en oeuvre :-)
Je suis sous LinuxMint, comme l’utilisation d’un programme graphique semble beaucoup trop lourde, j’ouvre une console pour essayer de m’en sortir avec la ligne de commande, moins gourmande pour le système.
Repérer la table dans la sauvegarde
Je me positionne dans le dossier où se trouve la sauvegarde puis je tente d’abord de l’ouvrir avec nano, un éditeur en ligne de commande.
cd mondossier
nano sauvegarde.sql
Beaucoup plus rapide qu’avec l’éditeur graphique : 3 minutes suffisent, je peux voir les premières lignes. Je connais le nom de la table que je cherche à récupérer. Dans nano, je lance une recherche (Ctrl W) sur ’spip_evenements’ et cela m’amène à découvrir que les données sont écrites en quelques centaines de lignes aux alentours de la ligne 26000. Peu importe l’exactitude, la voie était sans issue : chaque intervention sur le contenu du fichier rend nano incontrôlable pendant 3 minutes... Je note néanmoins que la partie du fichier qui m’intéresse commence par "LOCK TABLES spip_evenements
WRITE ;".
Trouver un moyen de récupérer mes données sans affichage graphique
Je sais que me passer complètement d’affichage du contenu du fichier me permettrait d’exécuter plus aisément la tâche que j’ai à mener : cela prendra certainement des minutes mais au moins elle ne sera pas systématiquement ralentie par les besoins de l’affichage.
Me voilà parti sur le web pour une recherche des divers outils existants. Dans un premier temps, je tente une "réduction" de mon fichier avec la commande "sed " (appliquée sur une copie vu que sed modifie le contenu du fichier cible).
cp sauvegarde.sql sauvegarde_bis.sql
sed '1,25000d' sauvegarde_bis.sql
Cette commande devrait supprimer les lignes 1 à 25000 du fichier sauvegarde_bis.sql . Le terminal se met à tourner. Cela durera des heures et se terminera par une erreur... Après quelques dizaines de minutes, je cherche une autre solution :-).
La solution : la commande grep
En fait il y a beaucoup plus simple et rapide. La commande grep.
grep -C300 'LOCK TABLES <span class="base64" title="PGNvZGUgY2xhc3M9J3NwaXBfY29kZSBzcGlwX2NvZGVfaW5saW5lJyBkaXI9J2x0cic+c3BpcF9ldmVuZW1lbnRzPC9jb2RlPg=="></span> WRITE;' sauvegarde.sql > restore.sql
Cette commande devrait extraire 300 lignes à partir de celle qui débute par "LOCK TABLES spip_evenements
WRITE ;" dans le fichier sauvegarde.sql puis copier ces lignes dans un fichier restore.sql, le tout sans modifier sauvegarde.sql .
Et ça marche : en quelques secondes le boulot est terminé et restore.sql contient les lignes nécessaires à la restauration. Une quizaine de lignes à la fin des 300 contiennent des instructions relatives à une autre table, je les supprime et sauve mon fichier.
Après, j’uploade ce fichier restore.sql via phpmyadmin (option "importer") et la table est restaurée.
GNU/Linux, c bôôôôô. Il me reste à suggérer à l’admin du site d’être plus prudent avec les manoeuvres sur les plugins. Désactiver temporairement, ça va, mais désinstaller, quand le plugin a été bien codé, cela entraîne la suppression des données de ce plugin...
Un message, un commentaire ?
Pour participer à ce forum, vous devez vous enregistrer au préalable. Merci d’indiquer ci-dessous l’identifiant personnel qui vous a été fourni. Si vous n’êtes pas enregistré, vous devez vous inscrire.