Copiar é muito simples para o MyISAM e completamente 100% arriscado (quase suicida) com o InnoDB.
Da sua pergunta, você mencionou
cp /db1/mytable.frm /db2/mytable.frm
MyISAM
Não há problema em fazer isso. No entanto, você não pode simplesmente mover o .frm. Você deve mover todos os componentes. De sua pergunta, vamos pegar uma tabela chamada db1.mytable. Em uma instalação normal, a tabela está localizada em / var / lib / mysql / db1. Haveria três arquivos compondo a tabela.
- /var/lib/mysql/db1/mytable.frm
- /var/lib/mysql/db1/mytable.MYD (banco de dados de tabelas)
- /var/lib/mysql/db1/mytable.MYI (índices da tabela)
Você deve mover todos os três arquivos para mover a única tabela. Se todas as suas tabelas usam o mecanismo de armazenamento MyISAM, você pode desligar o mysql e copiar. Se você está simplesmente fazendo uma cópia da tabela e colocando-a em outro banco de dados, você deve fazer isso usando SQL.
Por exemplo, se você deseja copiar db1.mytable para o banco de dados db2, faça o seguinte:
CREATE TABLE db2.mytable LIKE db1.mytable;
ALTER TABLE db2.mytable DISABLE KEYS;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
ALTER TABLE db2.mytable ENABLE KEYS;
Agora, se você acabou de mover a tabela do db1 para o db2, você pode fazer isso:
ALTER TABLE db1.mytable RENAME db2.mytable;
InnoDB
Copiar é muito perigoso por causa da infraestrutura em que o InnoDB trabalha. Existem duas infraestruturas básicas: 1) innodb_file_per_table disabled e 2) innodb_file_per_table enabled
O calcanhar de Aquiles do InnoDB é o arquivo de espaço de tabela do sistema conhecido como ibdata1 (normalmente localizado em / var / lib / mysql). O que está contido nesse arquivo ?
- Páginas de dados de tabela
- Índice de páginas de tabela
- MetaData de tabela (lista de gerenciamento de ID de espaço de tabela)
- Dados MVCC (para suportar o isolamento de transações e ACID Compliance )
InnoDB (innodb_file_per_table disabled)
Com o innodb_file_per_table desativado, todos esses tipos de informações do InnoDB vivem dentro do ibdata1. A única manifestação de qualquer tabela InnoDB fora de ibdata1 é o arquivo .frm da tabela InnoDB. Copiar todos os dados do InnoDB de uma só vez exige copiar todo o / var / lib / mysql.
Copiar uma tabela InnoDB individual é totalmente impossível. Você deve mysqldump para extrair um dump da tabela como uma representação lógica dos dados e suas definições de índice correspondentes. Você então carregaria esse despejo em outro banco de dados no mesmo servidor ou em outro servidor.
InnoDB (innodb_file_per_table enabled)
Com innodb_file_per_table ativado, os dados da tabela e seus índices residem na pasta do banco de dados ao lado do arquivo .frm. Por exemplo, para a tabela db1.mytable, a manifestação dessa tabela InnoDB fora de ibdata1 seria:
- /var/lib/mysql/db1/mytable.frm
- /var/lib/mysql/db1/mytable.ibd
Todos os metadados para db1.mytable ainda residem em ibdata1 e não há absolutamente nenhuma maneira de contornar isso . Redo logs e dados MVCC também ainda vivem com ibdata1.
AVISO (ou PERIGO como o robô diria em Perdido no Espaço )
Se você está pensando apenas em copiar o arquivo .frm e .ibd, você está na fila para o mundo da dor. Copiar o arquivo .frm e .ibd de uma tabela InnoDB só será bom se você puder garantir que o ID do espaço de tabela do arquivo .ibd corresponda exatamente à entrada id do espaço de tabela no metadado do arquivo ibdata1.
Eu escrevi dois posts no DBA StackExchange sobre esse conceito de ID de espaço de tabela
Aqui está um excelente link sobre como reconectar e arquivo. ibd para ibdata1 no caso de ids de espaço para tabelas incompatíveis: link . Depois de ler isto, você deve ser capaz de ver porque eu disse quase suicida.
Para o InnoDB você só precisa disto
CREATE TABLE db2.mytable LIKE db1.mytable;
INSERT INTO db2.mytable SELECT * FROM db1.mytable;
para fazer uma cópia de uma tabela InnoDB. Se você está migrando para outro servidor de banco de dados, use mysqldump.