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:
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 tags
tabella nel mydb
database
PASSO 1
Assicurati di avere backup di questi .frm
e .ibd
file in/tmp/innodb_data
PASSO 2
Ottieni la CREATE TABLE tags
dichiarazione ed eseguila come CREATE TABLE mydb.tags ...
. Assicurati che abbia la stessa struttura dell'originaletags.frm
PASSAGGIO # 3
Elimina il vuoto tags.ibd
usando 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 tags
tabella 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 .frm
file. 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 TABLE
dichiarazione.