Hier is waarom MySQL die bestanden niet kan zien: De systeem tablespace (ibdata1) heeft een Storage-Engine specifieke data dictionary die InnoDB potentieel tabelgebruik in kaart laat brengen:
ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;
Het verplaatsen van InnoDB tabellen van de ene plaats naar de andere vereist commando’s zoals
ALTER TABLE mydb.tags DISCARD TABLESPACE;
Hier is een deel van de MySQL 5.5 Documentatie dat uitlegt waar je rekening mee moet houden
Portabiliteit Overwegingen voor .ibd Bestanden
Je kunt .ibd bestanden niet vrijelijk verplaatsen tussen database directories zoals je dat kunt met MyISAM tabel bestanden. De tabeldefinitie die is opgeslagen in de gedeelde InnoDB-ruimte bevat de databasenaam. De transactie-ID’s en logboekvolgordenummers die in de tablespace-bestanden zijn opgeslagen, verschillen ook tussen databases.
Om een .ibd bestand en de bijbehorende tabel van de ene database naar de andere te verplaatsen, gebruik je een RENAME TABLE statement:
RENAME TABLE db1.tblname TO db2.tblname; Als je een “schone” backup hebt van een .ibd-bestand, kun je die als volgt terugzetten naar de MySQL-installatie waar hij vandaan komt:
De tabel mag niet gedrop of getruncated zijn sinds je het .ibd bestand gekopieerd hebt, omdat dit het tabel ID in de tablespace verandert.
Geef deze ALTER TABLE opdracht om het huidige .ibd bestand te verwijderen:
ALTER TABLE tbl_name DISCARD TABLESPACE; Kopieer het backup .ibd bestand naar de juiste database directory.
Geef deze ALTER TABLE opdracht om InnoDB te vertellen het nieuwe .ibd bestand voor de tabel te gebruiken:
ALTER TABLE tbl_name IMPORT TABLESPACE; In deze context is een “schone” .ibd-bestandsback-up er een waarvoor aan de volgende eisen is voldaan:
Er zijn geen ongecommitteerde wijzigingen door transacties in het .ibd-bestand.
Er zijn geen unmerged insert buffer entries in het .ibd bestand.
Purge heeft alle met delete gemarkeerde index records uit het .ibd bestand verwijderd.
mysqld heeft alle gewijzigde pagina’s van het .ibd bestand uit de buffer pool naar het bestand gespoeld.
Gegeven deze voorbehouden en protocollen, is hier een voorgestelde handelwijze
Laten we voor dit voorbeeld proberen om de tags
tabel te herstellen naar de mydb
database
STAP #1
Zorg ervoor dat je back-ups hebt van die .frm
en .ibd
bestanden in /tmp/innodb_data
STAP #2
Haal het CREATE TABLE tags
statement en voer het uit als CREATE TABLE mydb.tags ...
. Zorg ervoor dat het exact dezelfde structuur heeft als de originele tags.frm
STAP #3
Verwijder de lege tags.ibd
met MySQL
cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd
STAP #4
Breng de reservekopie van tags.ibd
ALTER TABLE mydb.tags IMPORT TABLESPACE;
STAP #5
Voeg tabel tags
toe aan de InnoDB Data Dictionary
SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
STAP 6
Test de toegankelijkheid van de tabel
Als je normale resultaten krijgt, gefeliciteerd dat je een InnoDB tabel importeert.
STAP 7
Verwijder in de toekomst alsjeblieft geen ibdata1 en zijn logs
Probeer het eens !!!
Ik heb dit soort dingen al eerder besproken
CAVEAT
Wat als je de tabelstructuur van de tags
niet kent?
Er zijn tools om het CREATE TABLE statement gewoon met het .frm
bestand te krijgen. Ik heb hier ook een post over geschreven : Hoe kan ik het tabel schema uit alleen het .frm bestand halen? . In die post kopieerde ik een .frm bestand naar een Windows machine vanaf een Linux box, startte de Windows tool en kreeg het CREATE TABLE
statement.