Come annullare la tabella DROP?


11

Ho accidentalmente lasciato cadere tutti i tavoli. Posso ripristinare? Non ho la copia di backup.

Risposte:


12

Se non hai letteralmente alcun backup, sono sicuro al 99% che sei sfortunato.

Se hai qualche forma di backup, per quanto vecchia, allora hai attivato la registrazione binaria tramite l'opzione log-bin nel file di configurazione di MySQL (my.ini)? In tal caso potrebbero essere in grado di recuperare dall'ultimo backup.

Brutto modo di iniziare una settimana amico, scusa.


2
Presumibilmente perché sei inesperto, abbiamo fatto tutti questo genere di cose, a volte lo faccio ancora (mi sono bloccato fuori dal mio VCenter non una settimana fa in effetti) - tutto ciò che conta è che impari da esso, quindi sei meno probabilmente ripetere.
Chopper 3

Cosa posso fare ora?? Non posso semplicemente sedermi e aspettare !!!!

8
Dillo al tuo manager
Chopper3 il

4
Non risolve il problema, ma forse uno dei tuoi sviluppatori ha una copia non troppo distante dall'ultima buona copia?
Tom O'Connor,

3
Tom solleva un ottimo punto: se i tuoi sviluppatori hanno l'abitudine di scattare regolarmente istantanee dei dati live a scopo di test / sviluppo, potresti essere fortunato e uno di loro ha una copia abbastanza incontaminata recente per declassare la tua situazione da " disastro completo "solo per" grave inconveniente ".
David Spillett, il

7

La domanda è piuttosto vecchia, ma non esiste una sola risposta positiva, quindi ne aggiungerò una.

Dopo che MySQL ha eliminato una tabella, i dati sono ancora sul supporto per un po '. Quindi puoi recuperare i record e ricostruire una tabella. Più avanti ne parlerò sul blog, ma per ora uno schizzo veloce.

Dovresti avere una struttura della tabella (istruzione CREATE TABLE).

Se innodb_file_per_table è ON, la tabella rilasciata si trova sulla partizione del disco. Arresta MySQL e reinstallalo il prima possibile in sola lettura. Se MySQL si trovava su una partizione di root (che non è una buona idea tra l'altro), quindi prendere un'immagine o estrarre il disco e collegarlo a un altro server. Ferma tutte le scritture in altre parole.

Se innodb_file_per_table OFF, basta semplicemente arrestare MySQL.

Quindi scaricare e compilare lo strumento di rilascio per InnoDB da https://github.com/twindb/undrop-for-innodb/ . Controlla il post " Compilazione del toolkit di recupero TwinDB " per i dettagli.

Quindi analizzare la partizione del disco o ibdata1 (a seconda dell'impostazione innodb_file_per_table) con stream_parser:

./stream_parser -f /path/to/diskimage_or_ibdata1

Quindi recuperare il dizionario InnoDB per sapere in quale indice_id era la tabella eliminata.

Quindi prendere la struttura della tabella e recuperare i record

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

Trasmetterà i record su stdout e il comando LOAD DATA su stderr.


signore, mi avete salvato la vita
Buddhi741,

2

Ecco cosa ho fatto. Nella directory mysql (per Ubuntu questo è / var / lib / mysql, per Mac usando Homebrew questo è / usr / local / var / mysql), ho trovato alcuni file. Per prima cosa ho copiato la directory myapp_development / contenente lo schema particolare nella mia directory mysql locale. Quindi ho eseguito il backup del mio ibdata1 locale e copiato ibdata1 del server nella directory mysql. Mysqld ucciso. ( ps auxper trovare il PID, quindi kill PID). Riavviato mysql, è stato avviato in modalità di ripristino di emergenza. Quindi ha avviato il mio client mysql locale e generato un dump completo delle tabelle di cui avevo bisogno.

E, 15.000 file che rappresentano settimane di lavoro che entrano nei metadati che pensavamo fossero andati per sempre, vengono salvati !!

Spero che questo aiuti qualcuno.


È un bel tentativo, ma sicuramente non riporterei troppe speranze su questa tecnica affidabile. Tuttavia, +1 per un po 'di pensiero creativo.
John Gardeniers,

Sì, hai ragione. Alla fine ha funzionato solo perché avevamo rimosso accidentalmente tutte le autorizzazioni dall'utente mysql, quindi il database veniva mostrato vuoto per quell'utente.
Duca

2

Sfortunatamente c'è molto poco che puoi fare, oltre a portare via una lezione molto preziosa sulla necessità di un buon piano di backup.

A seconda del tipo di tabella potresti essere in grado di trovare un esperto in grado di riunire i dati da ciò che ha lasciato sul disco, ma tale analisi forense sarebbe molto molto molto costosa (in quanto richiederebbe competenze relativamente non comuni) e non è affatto garantita per essere veramente utile.


C'è qualche altra opzione?

1
Come suggerisce FractalizeR, se le tabelle fossero semplici tabelle MyISAM, potresti essere in grado di ripristinare i file ad esse associati. Se hai intenzione di provare, allora devi chiudere il server ora perché più a lungo il sistema è attivo, maggiori sono le possibilità che lo spazio utilizzato dai file venga riutilizzato rendendo impossibile il recupero (o rendendo i file non eliminati con contenuto danneggiato ). Come annullare l'eliminazione dipende dal filesystem utilizzato. ntfsundelete.com è il primo link dall'aspetto utile in una ricerca di Google per ripristinare il recupero su NTFS.
David Spillett, il

0

Se questa era la tabella MyISAM, devi solo ripristinare i file della tabella in / var / log / mysql o qualunque sia la tua directory dei dati. Ad esempio, è possibile utilizzare l' utilità ext3grep .


ext3grep è per filesystem ext3. Se stai usando Windows, è improbabile che tu stia usando un filesystem ext3 (è probabile che tu stia usando NTFS, anche se potrebbe essere FAT32). Se si tenta di ripristinare i file eliminati, è necessario arrestare il server il più presto possibile, indipendentemente da quali altri servizi sono in esecuzione su di esso, poiché più il server è attivo, maggiori sono le possibilità che il ripristino non possa essere di aiuto tu affatto.
David Spillett, il

Se hai attivato la copia shadow sul volume in cui sono state archiviate le tabelle MyISAM, hai la possibilità di ripristinarle in quel modo.
Catherine MacInnes,

Per ripristinare il file di database cancellato è possibile cercare su Google "NTFS undelete". Non so dove si trova la directory dei dati sul tuo PC. È necessario controllare my.ini per quello o cercare file con estensione MYD per esempio.
Vladislav Rastrusny,

0

Non puoi "annullare" a DROP TABLE.

Puoi vedere e vedere se MySQL aveva la registrazione binaria abilitata, forse puoi estrarre alcuni dati da lì.

Oltre a questo, puoi dimenticare MySQL e avere la stessa classe di problemi di "Ho cancellato accidentalmente alcuni file dal mio filesystem". Ci sono alcuni strumenti là fuori che provano a recuperare file, e ci sono anche aziende che lo fanno su base professionale.


-1

Se la registrazione binaria è attivata, è possibile ricreare prima una tabella se si dispone di uno schema. Assicurati di creare uno schema mentre i binlog sono disattivati. Oppure puoi semplicemente saltare la sessione. Quindi è possibile riprodurre i binlog fino all'ultima istruzione che era la tabella di rilascio stessa.

In caso contrario, è possibile ripristinare utilizzando un dump di backup, se presente. Se si dispone di file CSV, è possibile eseguire il metodo di caricamento dei dati per recuperare i dati. Se si sta eseguendo il ripristino da mysqldump, è possibile prendere in considerazione il ripristino di una singola tabella dal file di dump anziché il ripristino del database completo. Se la dimensione dei dati è troppo grande, è possibile prendere in considerazione la disabilitazione delle chiavi prima di caricarla, aumentando in modo significativo il processo di ripristino.

Per il futuro potresti voler avere uno schiavo ritardato con un ritardo di circa 10-24 ore. Puoi creare uno slave ritardato usando percona toolkit (pt-slave-delay)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.