Comment annuler DROP Table?

11

J'ai accidentellement laissé tomber toutes les tables. Puis-je restaurer en arrière? Je n'ai pas la copie de sauvegarde.

Mark Henderson
la source

Réponses:

12

Si vous n'avez littéralement aucune sauvegarde, je suis sûr à 99% que vous n'avez pas de chance.

Si vous avez une forme de sauvegarde, aussi ancienne soit-elle, la journalisation binaire est-elle activée via l'option log-bin dans le fichier de configuration MySQL (my.ini)? Si c'est le cas, vous pourrez peut-être les récupérer depuis la dernière sauvegarde.

Mauvaise façon de commencer un mec d'une semaine, désolé.

Chopper3
la source
2
Vraisemblablement parce que vous êtes inexpérimenté, nous avons tous fait ce genre de choses, nous le faisons toujours parfois (je me suis enfermé hors de mon propre VCenter il n'y a pas une semaine en fait) - tout ce qui compte, c'est que vous en tiriez des leçons afin d'être moins susceptibles de se répéter.
Chopper3
Que puis-je faire maintenant?? Je ne peux pas m'asseoir et attendre !!!!
8
Dites à votre manager
Chopper3
4
Cela ne résout pas le problème, mais peut-être qu'un de vos développeurs a une copie qui n'est pas trop éloignée de la dernière bonne copie?
Tom O'Connor
3
Tom soulève un très bon point: si vos développeurs ont l'habitude de prendre régulièrement des instantanés des données en direct à des fins de test / développement, alors vous aurez peut-être de la chance et l'un d'eux a une copie suffisamment récente pour rétrograder votre situation de " désastre complet "à seulement" un inconvénient majeur ".
David Spillett
7

La question est assez ancienne, mais il n'y a pas de réponse positive unique, je vais donc en ajouter une.

Après que MySQL a déposé une table, les données sont toujours sur le support pendant un certain temps. Vous pouvez donc récupérer des enregistrements et reconstruire une table. Plus tard, je bloguerai à ce sujet, mais pour l'instant un croquis rapide.

Vous auriez besoin d'avoir la structure de votre table (instruction CREATE TABLE).

Si innodb_file_per_table est activé, la table supprimée se trouve sur la partition de disque. Arrêtez MySQL et remontez-le en lecture seule ASAP. Si MySQL était sur une partition racine (ce qui n'est pas une bonne idée entre autres), alors prenez une image ou retirez le disque et branchez-le sur un autre serveur. Arrêtez toutes les écritures en d'autres termes.

Si innodb_file_per_table est désactivé, arrêtez simplement MySQL.

Ensuite, téléchargez et compilez l'outil de suppression de InnoDB à partir de https://github.com/twindb/undrop-for-innodb/ . Consultez la publication « Compilation de la boîte à outils de récupération TwinDB » pour plus de détails.

Ensuite, analysez la partition de disque ou ibdata1 (selon le paramètre innodb_file_per_table) avec stream_parser:

./stream_parser -f /path/to/diskimage_or_ibdata1

Récupérez ensuite le dictionnaire InnoDB pour savoir dans quel index_id se trouvait la table supprimée.

Prenez ensuite la structure de la table et récupérez les enregistrements

./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page

Il sortira les enregistrements vers stdout et la commande LOAD DATA vers stderr.

akuzminsky
la source
vous monsieur m'a sauvé la vie
Buddhi741
2

Voici ce que j'ai fait. Dans le répertoire mysql (pour Ubuntu c'est / var / lib / mysql, pour Mac utilisant Homebrew c'est / usr / local / var / mysql), j'ai trouvé quelques fichiers. J'ai d'abord copié le répertoire myapp_development / contenant le schéma particulier dans mon répertoire mysql local. Ensuite, j'ai sauvegardé mon ibdata1 local et copié l'ibdata1 du serveur dans le répertoire mysql. Tue mysqld. ( ps auxpour trouver le PID, alors kill PID). MySQL redémarré, il a commencé en mode de récupération après incident. Ensuite, j'ai lancé mon client mysql local et généré un vidage complet des tables dont j'avais besoin.

Et, 15 000 lignes représentant des semaines de travail entrant dans les métadonnées que nous pensions avoir disparu pour toujours, sont enregistrées !!

J'espère que cela aide quelqu'un.

Duc
la source
C'est un bel effort, mais je ne ferais pas trop d'espoirs sur le fait que cette technique soit fiable. Néanmoins, +1 pour une réflexion créative.
John Gardeniers
Oui, tu as raison. Il a fini par fonctionner uniquement parce que nous avions accidentellement supprimé toutes les autorisations de l'utilisateur mysql, de sorte que la base de données était vide pour cet utilisateur.
Duke
2

Malheureusement, vous ne pouvez pas faire grand-chose, à part tirer une leçon très précieuse sur la nécessité d'un bon plan de sauvegarde.

Selon le type de table, vous pourrez peut-être trouver un expert qui peut reconstituer les données à partir de ce qu'il a laissé sur le disque, mais une telle analyse médico-légale serait très très très coûteuse (car elle nécessiterait des compétences relativement rares) et pas du tout garantie pour être vraiment utile.

David Spillett
la source
Y a-t-il une autre option?
1
Comme FractalizeR le suggère, si les tables étaient de simples tables MyISAM, vous pourrez peut- être annuler la suppression des fichiers qui leur sont associés. Si vous essayez alors, vous devez arrêter le serveur maintenant car plus le système est actif, plus il y a de chances que l'espace utilisé par les fichiers soit réutilisé, rendant la suppression impossible à supprimer (ou les fichiers non supprimés ont un contenu corrompu). ). La procédure de restauration dépend du système de fichiers utilisé. ntfsundelete.com est le premier lien de recherche utile dans une recherche Google pour annuler la suppression sur NTFS.
David Spillett
0

S'il s'agissait d'une table MyISAM, il vous suffit de restaurer les fichiers de la table dans / var / log / mysql ou quel que soit votre répertoire de données. Vous pouvez utiliser l' utilitaire ext3grep pour cela par exemple.

Vladislav Rastrusny
la source
ext3grep est destiné aux systèmes de fichiers ext3. Si vous utilisez Windows, il est peu probable que vous utilisiez un système de fichiers ext3 (il est probable que vous utilisez NTFS, bien qu'il puisse s'agir de FAT32). Si vous essayez de récupérer des fichiers supprimés, vous devez arrêter le serveur dès que possible, quels que soient les autres services qui y sont exécutés, car plus le serveur est actif, plus il y a de chances que la suppression ne puisse pas vous aider. vous du tout.
David Spillett
Si vous avez activé le cliché instantané sur le volume qui a stocké les tables MyISAM, vous avez une chance de les récupérer de cette façon.
Catherine MacInnes
Pour restaurer le fichier de base de données supprimé, vous pouvez rechercher sur google "ntfs undelete". Je ne sais pas où se trouve le répertoire de données sur votre PC. Vous devez vérifier votre my.ini pour cela ou rechercher des fichiers avec l'extension MYD par exemple.
Vladislav Rastrusny
0

Vous ne pouvez pas "défaire" a DROP TABLE.

Vous pouvez regarder et voir si MySQL a activé la journalisation binaire , vous pouvez peut-être en extraire certaines données.

En dehors de cela, vous pouvez oublier MySQL et vous êtes dans la même classe de problèmes "J'ai accidentellement supprimé certains fichiers de mon système de fichiers". Il existe des outils qui tentent de récupérer des fichiers, et il y a aussi des entreprises qui le font à titre professionnel.

Luke404
la source
-1

Si la journalisation binaire est activée, vous pouvez simplement recréer une table en premier si vous avez un schéma. Assurez-vous que vous créez un schéma pendant que les journaux binaires sont désactivés. Ou vous pouvez simplement sauter pour la session. Ensuite, vous pouvez rejouer les binlogs jusqu'à la dernière instruction qui était la table de dépôt elle-même.

Sinon, vous pouvez restaurer à l'aide d'un vidage de sauvegarde si vous en avez. Si vous avez des fichiers csv, vous pouvez effectuer la méthode de chargement des fichiers pour récupérer les données. Si vous récupérez à partir de mysqldump, vous pouvez envisager de restaurer une seule table à partir du fichier de vidage plutôt que de restaurer la base de données complète. Si la taille des données est trop grande, vous pouvez envisager de désactiver les clés avant le chargement, ce qui augmentera considérablement le processus de restauration.

Pour l'avenir, vous aimerez peut-être avoir un esclave retardé quelque chose comme 10-24 heures de retard. Vous pouvez créer un esclave retardé à l'aide de la boîte à outils percona (pt-slave-delay)

Roger Moore
la source