Eis por que o MySQL não pode ver esses arquivos: O espaço de tabelas do sistema (ibdata1) possui um dicionário de dados específico do Storage Engine que permite ao InnoDB mapear o possível uso da tabela:
MovertabelasInnoDBdeumlugarparaoutrorequercomandoscomo
ALTERTABLEtblnameDISCARDTABLESPACE;ALTERTABLEtblnameIMPORTTABLESPACE;
Aquiestáumaparteda
Portability Considerations for .ibd Files
You cannot freely move .ibd files between database directories as you can with MyISAM table files. The table definition stored in the InnoDB shared tablespace includes the database name. The transaction IDs and log sequence numbers stored in the tablespace files also differ between databases.
To move an .ibd file and the associated table from one database to another, use a RENAME TABLE statement:
RENAME TABLE db1.tbl_name TO db2.tbl_name; If you have a “clean” backup of an .ibd file, you can restore it to the MySQL installation from which it originated as follows:
The table must not have been dropped or truncated since you copied the .ibd file, because doing so changes the table ID stored inside the tablespace.
Issue this ALTER TABLE statement to delete the current .ibd file:
ALTER TABLE tbl_name DISCARD TABLESPACE; Copy the backup .ibd file to the proper database directory.
Issue this ALTER TABLE statement to tell InnoDB to use the new .ibd file for the table:
ALTER TABLE tbl_name IMPORT TABLESPACE; In this context, a “clean” .ibd file backup is one for which the following requirements are satisfied:
There are no uncommitted modifications by transactions in the .ibd file.
There are no unmerged insert buffer entries in the .ibd file.
Purge has removed all delete-marked index records from the .ibd file.
mysqld has flushed all modified pages of the .ibd file from the buffer pool to the file.
Dadas estas ressalvas e protocolos, aqui está uma sugestão de ação
Para este exemplo, vamos tentar restaurar a tabela tags
para o banco de dados mydb
PASSO # 1
Verifique se você tem backups desses arquivos .frm
e .ibd
em /tmp/innodb_data
PASSO # 2
Obtenha a instrução CREATE TABLE tags
e execute-a como CREATE TABLE mydb.tags ...
. Certifique-se de que é exatamente a mesma estrutura que o original tags.frm
PASSO # 3
Exclua o tags.ibd
vazio usando o MySQL
ALTER TABLE mydb.tags DISCARD TABLESPACE;
PASSO # 4
Coloque a cópia de backup de tags.ibd
cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd
PASSO # 5
Adicione tags
table ao Dicionário de Dados InnoDB
ALTER TABLE mydb.tags IMPORT TABLESPACE;
PASSO 6
Teste a acessibilidade da tabela
SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;
Se você obtiver resultados normais, parabéns por importar uma tabela InnoDB.
PASSO 7
No futuro, por favor, não apague ibdata1 e seus logs
Experimente!
Eu já discuti coisas assim antes
-
Apr 23, 2012
: MySQL: como restaurar a tabela armazenada em um arquivo .frm e .ibd? -
Sep 28, 2011
: Como recuperar uma tabela InnoDB cujos arquivos foram movidos
CAVEAT
E se você não souber a estrutura da tabela do tags
?
Existem ferramentas para obter a instrução CREATE TABLE usando apenas o arquivo .frm
. Eu escrevi um post sobre isso também: Como pode extrair o esquema da tabela apenas do arquivo .frm? . Naquela postagem, copiei um arquivo .frm para uma máquina Windows de uma caixa do Linux, executei a ferramenta Windows e obtive a instrução CREATE TABLE
.