MySQL InnoDB ha perso le tabelle ma esistono dei file


33

Ho un MySQL InnoDB che ha tutti i file della tabella del database, ma MySQL non li vede e non li sta caricando.

Il problema è accaduto perché ho eliminato questi tre file: ibdata1, ib_logfile0eib_logfile1

perché avevo problemi con l'avvio di mysql e quello che ho letto è stato rimuoverli perché MySQL li avrebbe semplicemente rigenerati (so che avrei dovuto eseguirne il backup ma non l'ho fatto).

Cosa posso fare per far vedere di nuovo a MySQL le tabelle?

about_member.frm                              site_stories.frm
about_member.ibd                              site_stories.ibd
db.opt                                        stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd  stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd        story_comments.frm
FTS_00000000000000bb_CONFIG.ibd               story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd        story_likes.frm
FTS_00000000000000bb_DELETED.ibd              story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd  story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd        story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd               story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd        story_views.ibd
FTS_00000000000000f5_DELETED.ibd              story_view_totals.frm
member_favorites.frm                          story_view_totals.ibd
member_favorites.ibd                          tags.frm
members.frm                                   tags.ibd
members.ibd

Hai provato a ripristinare quei file? I file di registro possono rimanere eliminati. Non avresti dovuto eliminare ibdata1
Ramhound il

Ho copiato il file da una vecchia versione di mysql in cui si trovava il file ma le tabelle non vengono visualizzate.
Scendi dal mio prato il

Risposte:


36

Ecco perché MySQL non può vedere quei file: Il tablespace di sistema (ibdata1) ha un dizionario dati specifico per Storage-Engine che consente a InnoDB di mappare il potenziale utilizzo della tabella:

Architettura di InnoDB

Lo spostamento di tabelle InnoDB da una posizione all'altra richiede comandi simili

ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;

Ecco una parte della documentazione di MySQL 5.5 che spiega ciò che deve essere considerato

Considerazioni sulla portabilità per i file .ibd

Non è possibile spostare liberamente i file .ibd tra le directory del database come con i file della tabella MyISAM. La definizione della tabella memorizzata nel tablespace condiviso di InnoDB include il nome del database. Anche gli ID transazione e i numeri di sequenza del registro memorizzati nei file del tablespace differiscono tra i database.

Per spostare un file .ibd e la tabella associata da un database a un altro, utilizzare un'istruzione RENAME TABLE:

RENAME TABLE db1.tbl_name TO db2.tbl_name; Se si dispone di un backup "pulito" di un file .ibd, è possibile ripristinarlo sull'installazione MySQL da cui è stato originato come segue:

La tabella non deve essere stata eliminata o troncata da quando è stato copiato il file .ibd, poiché in questo modo si modifica l'ID tabella memorizzato nello spazio tabella.

Emettere questa istruzione ALTER TABLE per eliminare il file .ibd corrente:

ALTER TABLE tbl_name DISCARD TABLESPACE; Copia il file .ibd di backup nella directory del database corretta.

Emettere questa istruzione ALTER TABLE per indicare a InnoDB di utilizzare il nuovo file .ibd per la tabella:

ALTER TABLE tbl_name IMPORT TABLESPACE; In questo contesto, un backup di file .ibd "pulito" è quello per il quale sono soddisfatti i seguenti requisiti:

Non ci sono modifiche senza commit da parte delle transazioni nel file .ibd.

Non ci sono voci di buffer di inserimento non unite nel file .ibd.

L'eliminazione ha rimosso tutti i record dell'indice contrassegnati per l'eliminazione dal file .ibd.

mysqld ha scaricato tutte le pagine modificate del file .ibd dal pool di buffer nel file.

Dati questi avvertimenti e protocolli, ecco una linea di condotta suggerita

Per questo esempio, proviamo a ripristinare la tagstabella nel mydbdatabase

PASSO 1

Assicurati di avere backup di questi .frme .ibdfile in/tmp/innodb_data

PASSO 2

Ottieni la CREATE TABLE tagsdichiarazione ed eseguila come CREATE TABLE mydb.tags .... Assicurati che abbia la stessa struttura dell'originaletags.frm

PASSAGGIO # 3

Elimina il vuoto tags.ibdusando MySQL

ALTER TABLE mydb.tags DISCARD TABLESPACE;

PASSO # 4

Porta la copia di backup di tags.ibd

cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd

PASSO # 5

Aggiungi tagstabella al dizionario dati InnoDB

ALTER TABLE mydb.tags IMPORT TABLESPACE;

PASSAGGIO 6

Verifica l'accessibilità della tabella

SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;

Se ottieni risultati normali, congratulazioni per aver importato una tabella InnoDB.

PASSAGGIO 7

In futuro, non eliminare ibdata1 e i suoi registri

Provaci !!!

Ho discusso di cose come questa prima

AVVERTIMENTO

Cosa succede se non si conosce la struttura della tabella di tags?

Esistono strumenti per ottenere l'istruzione CREATE TABLE semplicemente usando il .frmfile. Ho scritto anche un post su questo: come è possibile estrarre lo schema della tabella solo dal file .frm? . In quel post, ho copiato un file .frm su una macchina Windows da una scatola Linux, ho eseguito lo strumento Windows e ho ottenuto la CREATE TABLEdichiarazione.


Grazie per la fantastica risposta! Sono ancora in procinto di importare una tabella, perché continuo a creare problemi, ma alla fine ci arriverò e ti farò sapere come funziona! Grazie!
Scendi dal mio prato il

1
Quando eseguo la creazione ottengo: ERRORE 1813 (HY000): tablespace per table ' weblyize. tags'esiste. SCOLLARE il tablespace prima di IMPORT. Quindi quindi provo a eseguire prima il tablespace alter e ottengo questo errore: ERRORE 1146 (42S02): la tabella 'weblyize.tags' non esiste . Cosa posso fare?
Scendi dal mio prato il

Grazie! Per correggere il mio errore ho creato un nuovo database, eseguito CREATE TABLE ...quindi seguito i tuoi passi! Mi hai salvato dal doverli riscrivere da zero al 100%! Non ha importato chiavi esterne ma va bene lo posso fare da solo! Grazie ancora!
Scendi dal mio prato il

E se avessi 100 tabelle che dovrebbero essere riparate in questo modo. Non eseguirò le operazioni manualmente per ogni tavolo. Come potrebbe essere automatizzato?
Oleg Abrazhaev,

10

Ho la stessa situazione, non riesco a rilasciare o creare tblname specifico. La mia procedura di correzione è:

  1. Ferma MySQL.

    service mysql stop
    
  2. Rimuovere ib_logfile0 e ib_logfile1.

    cd /var/lib/mysql;
    rm ib_logfile0 ib_logfile1
    
  3. Rimuovi i file tblname. ATTENZIONE: QUESTO ELIMINERÀ PERMANENTE I TUOI DATI

    cd /var/lib/mysql/dbname;
    rm tblname*
    
  4. Avvia MySQL.

    service mysql start
    

1
Grazie a questo risolto il mio problema, non ho fatto il passaggio 3, ho semplicemente rimosso i file di registro e ho avviato il backup di mysql.
Jeff Wilbert,

Sei assolutamente fantastico! Risolto il mio problema
Alex GP

2

Ho avuto anche questo problema. Ho cancellato per ibdata1errore e tutti i miei dati sono andati persi.

Dopo 1-2 giorni di ricerche su Google e SO, finalmente ho trovato una soluzione che mi ha salvato la vita (avevo così tanti database e tabelle con record enormi).

  1. fare un backup da /var/lib/mysql

  2. recuperare lo schema delle tabelle dal .frmfile con dbsake (c'era un'altra opzione! mysqlfrm . ma non ha funzionato per me)

dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
  1. crea una nuova tabella (con un nuovo nome) con lo schema esportato.

  2. scartare i nuovi dati della tabella con questo comando:

ALTER TABLE `tbl-new` DISCARD TABLESPACE;
  1. copia i dati della vecchia tabella e incollali invece di uno nuovo e imposta l'autorizzazione giusta per esso.
cp tbl.ibd tbl@002dnew.ibd && chown mysql:mysql tbl@002dnew.ibd
  1. importa i dati in una nuova tabella.
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
  1. tutto apposto! abbiamo i dati in una nuova tabella e possiamo eliminare quello vecchio.
DROP TABLE `tbl`;
  1. controlla /var/lib/mysql/database-namee se ci sono dati ( .ibdfile) per la vecchia tabella, eliminali.
rm tbl.ibd
  1. e infine rinominare la nuova tabella con il nome originale
ALTER TABLE `tbl-new` RENAME `tbl`;
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.