Ripristino di tabelle MySQL da file .ibd, .frm e mysqllogbin


10

Per qualche motivo, quando provo ad aprire le mie tabelle che sono archiviate in .frme .ibdfile (sia su MySQL o phpmyadmin) mi dà un errore di sintassi, o dice che non esiste.

Ho letto l'altro post che ha avuto problemi simili a questo, ma non so come verificare se innodb_file_per_tableè abilitato, e nel complesso sono davvero confuso. Ho anche convertito una copia del mio mysql-bin.000002file in un file txt, quindi vedo che i dati dal mio database non sono completamente persi.

Il database è stato creato l'anno scorso. Ho 6 di quei mysql-bin.00000file, ma per qualche motivo .000002è il più grande. In questo momento, ho i file .ibde .frmper tutti i miei database, ma sono in perdita su come posso ripristinarlo in MySQL, o almeno in qualcosa che posso leggere.

Sto usando WampServer 2.4 e MySQL 5.6.12 su Windows 2003 Server. Inoltre, dovrei scaricare un plugin in InnoDB?


No, è stato creato l'anno scorso. Ho 6 di quei file mysql-bin.00000, ma per qualche ragione il .000002 è il più grande. In questo momento, ho i file .ibd e .frm per tutti i miei database, ma sono perplesso su come ripristinarlo in MySQL, o almeno in qualcosa che posso leggere.
Carment

Risposte:


19

Alla fine ho capito e risolto il mio problema attraverso molte prove ed errori. Per coloro che non hanno il loro file ibdata1 originale e hanno solo i loro file .frm e .ibd, ecco come ho ripristinato i miei dati.

  1. Scarica e installa i programmi di utilità MySQL su -> http://dev.mysql.com/downloads/utilities .
  2. Accedi al tuo comando / terminale per aprire l'utilità MySQL, mysqlfrm, e usala per trovare la struttura della tabella che devi ripristinare. Come ho fatto, sono stato inserito nella posizione del file di mysqlfrm, quindi inserito "mysqlfrm --server = user: pwd @ localhost --port = 3307" path_to_.frm_file "> table_name.txt". Il file .txt deve essere salvato nella stessa cartella in cui sono salvate le utility se non si specifica dove si desidera andare.
  3. Nel file di testo, vedrai le istruzioni CREATE TABLE, che includono tutte le colonne e le informazioni (in sostanza, la struttura originale) della tabella. Copia quell'istruzione CREATE con tutte quelle informazioni.
  4. Nel tuo comando MySQL, crea un nuovo database (CREATE DATABASE database_name). Rendi lo stesso nome del nome del database originale.
  5. Crea una nuova tabella all'interno del nuovo database: non deve avere lo stesso nome della cartella. Puoi creare la nuova tabella all'interno del prompt dei comandi, ma ho creato la mia tabella in PhpMyAdmin, uno strumento software gratuito che gestisce l'amministrazione di MySQL sul Web. Ho semplicemente fatto clic sul database su PhpMyAdmin, quindi sulla tabella SQL e incollato la struttura della tabella da # 3. (Come nota a margine, ho sempre ricevuto errori se ho chiamato le mie tabelle "table" nel mio prompt dei comandi, quindi cerca di evitare quel nome).
  6. Sul tuo comando MySQL, vai nel tuo database e inserisci "ALTER TABLE table_name DISCARD TABLESPACE", che rimuoverà essenzialmente il file .ibd di questa tabella.
  7. Copia il file .ibd della tabella originale (la tabella che desideri ripristinare) nella tabella appena creata per sostituire il file .ibd che hai appena rimosso. Cambia il tuo file .ibd iniziale con il nome della tabella appena creata. Questo imiterà il vecchio file .ibd che hai appena eliminato. Puoi trovare questa cartella nella cartella dei dati MySQL, sotto la cartella del database appena creata sul tuo computer.
  8. Torna al tuo comando MySQL, vai nel tuo database e inserisci "ALTER TABLE table_Name IMPORT TABLESPACE." Riceverai un'istruzione di tipo "error" (1), ma ignorala.
  9. E fatto! se provi ad accedere alla tua nuova tabella, dovrebbe contenere tutti i dati della tua vecchia tabella.

Spero che questo abbia aiutato e fammi sapere se hai domande o commenti! Inoltre, controlla http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file per altri dettagli.


Ottime istruzioni, ma funziona solo con MySQL 5.6 ! Su 5.5 riceverai l'errore Got error -1 from storage enginequando esegui IMPORT TABLESPACE. Ma per me MySQL 5.6 ha funzionato per le tabelle create utilizzando MySQL 5.5, quindi va tutto bene;). Se sei bloccato con 5.5, devi seguire le istruzioni nel link chriscalender che hai proposto.
ostrokach,

@carment Ho seguito le tue istruzioni ma devo affrontare ERRPR: provare ad accedere al numero di pagina 1767006713 nello spazio 13635, nome spazio <dbname> / <tblname>, che è fuori dal limite del tablespace. Puoi guidarmi cosa posso aver fatto?
Mohit Mehta,

Questo mi ha fatto risparmiare un sacco di tempo ricreando un tavolo. Il metodo funziona ancora nel 2016, su MySQL 5.7.17
Andy Mercer,

@ostrokach sembra che non sia stato innodb_file_per_tableabilitato.
Yvan,

Mi hai appena salvato dopo un lungo viaggio, grazie!
Amr SubZero,

4

Il file di dati InnoDB principale, di solito denominato ibdata, è essenziale per consentire a MySQL di comprendere i file .ibd.

Se è necessario spostare i dati tra i server utilizzando i file binari, è necessario arrestare MySQL in modo pulito e quindi spostare tutti i file di dati, inclusi i file ibdata , tra le directory.

Un meccanismo più affidabile per spostare i dati tra i server su Windows sarebbe l'uso ( mysqldump) o l'esportazione di un database da PHPMyAdmin (o uno strumento simile).

Se la registrazione binaria è stata abilitata per tutto il tempo in cui il server è stato in esecuzione (in base ai commenti, questo potrebbe non essere il caso), è possibile utilizzare anche mysqlbinlogper ripristinare ogni istruzione SQL eseguita sul server dai file mysql-bin e ricreare il database in questo modo. Dovrebbero esserci dei timestamp unix nei file mysql-bin che ti aiutano a determinare quanto sono lontani.

Se hai perso i tuoi file di database originali e tutto ciò che ti rimane sono i singoli file .ibd, potresti dover ricorrere al recupero dei dati secondo i suggerimenti di Akuzminsky nei commenti.

MySQL 5.6 ha alcune nuove funzionalità per spostare i file di dati .ibd di InnoDB ( tablespace trasportabili ), ma questi richiedono un certo sforzo e, per un database sufficientemente piccolo, sarà molto più facile trasferire i dati usando mysqldump.


0

Risposta Wiki generata dai commenti alle domande di akuzminsky


Se vedi i *.ibdfile, allora lo innodb_file_per_tableè ON, altrimenti tutte le tabelle sarebbero presenti ibdata1.

Se indica che una tabella non esiste, la tabella non è presente nel dizionario InnoDB. Prova a scaricare tutte le tabelle in dump sql separati (una tabella - un file). Quelle tabelle che non è possibile scaricare è possibile ripristinare con TwinDB Recovery Toolkit .

Non ci sono ancora pacchetti binari. Devi ottenere il codice sorgente da GitHub e compilarlo. Consulta le istruzioni nel dizionario di ripristino di InnoDB . È abbastanza semplice:

git clone git@github.com:twindb/undrop-for-innodb.git

e poi

make all
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.