Você sabe como exportar uma ou mais tabelas InnoDB de um database para outro ou de um servidor para outro apenas movendo os arquivos de dados?

Como sabemos, com tabelas InnoDB não podemos fazer igual fazemos com tabelas MyISAM, onde basta copiarmos os 3 arquivos(MYD, MYI e FRM) da tabela MyISAM e enviar para onde quisermos. Mas tem um recurso nativo e que permite fazer algo bem semelhante e pode ajudar muito.

Assista o video e veja como isso funciona.

 

 Pré-requisitos

  1. MySQL 5.6.6 ou superior
  2. InnoDB File Per table ativado

 

Como fazer

Independente se deseja enviar para um database no mesmo servidor ou para outro servidor os procedimentos são os mesmos.

Os exemplo abaixo são os mesmos mostrados no video acima, então para um melhor entendimento das instruções abaixo assista o video .

 

Criar uma tabela com a mesma estrutura no database que irá receber os dados.

(seguindo os mesmos passos do video)

Servidor Origem:

mysql> show create table c;
+-------+---------------- +
| Table | Create Table   |
+-------+-----------------+
| c     | CREATE TABLE `c` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=25496 DEFAULT CHARSET=latin1 |
+-------+----------------+

Servidor destino:

mysql> CREATE TABLE `c` (
    ->   `id` int(11) NOT NULL AUTO_INCREMENT,
    ->   `dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=25496 DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0,01 sec)

Descartar o tablespace da tabela que acabou de ser criada no servidor de destino.

Ao descartar o tablespace o MySQL vai excluir o arquivo .ibd que contém os dados e índices da tabela e preparar para que possa ser feita uma importação de tablespace na sequência.

Muito cuidado para executar esse comando no servidor de destino e não no servidor de origem, se executar na origem vai apagar todos os dados.

mysql> ALTER TABLE c DISCARD TABLESPACE;
Query OK, 0 rows affected (0,00 sec)

Preparar o MySQL para exportar a tabela, e fazer o envio dos arquivos e liberando a tabela no servidor de origem.

Servidor de Origem:
Preparar o MySQL para permitir que uma tabela seja exportada.

mysql> FLUSH TABLES c FOR EXPORT;
Query OK, 0 rows affected (0,06 sec)

Esse comando fez com que a tabela c receba um lock e também gera um arquivo chamado c.cfg que deverá ser enviado para o servidor de destino junto com o c.ibd.
O arquivo c.cfg é um arquivo que será usado no servidor de destino para validar a estrutura da tabela que já criamos com a estrutura da tabela do servidor de origem, assim garantindo a compatibilidade de estruturas e podendo concluir a importação com sucesso.

Agora basta enviar os arquivo c.cfg e c.ibd para o servidor de destino.

cd /var/lib/mysql/performancedb/
scp c.cfg root@157.230.129.20:/var/lib/mysql/pdb/                                  
scp c.ibd root@157.230.129.20:/var/lib/mysql/pdb/

Agora precisamos liberar o lock da tabela liberando ela para ser usada novamente.

mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0,06 sec)

Ajustando as permissões dos arquivos enviados no servidor de destino                                           

Agora que  os arquivos cfg e ibd já estão no servidor de destino, é necessário verificar se eles estão com as permissões corretas. O usuário e o grupo dos arquivos no linux devem ser o mysql.

-rw-r-----. 1 root  root   405 Jan 11 18:09 c.cfg
-rw-r-----. 1 mysql mysql 8,4K Jan 11 18:05 c.frm
-rw-r-----. 1 root  root  9,0M Jan 11 18:10 c.ibd
chown mysql:mysql c.cfg
chown mysql:mysql c.ibd
-rw-r-----. 1 mysql mysql  405 Jan 11 18:09 c.cfg
-rw-r-----. 1 mysql mysql 8,4K Jan 11 18:05 c.frm
-rw-r-----. 1 mysql mysql 9,0M Jan 11 18:10 c.ibd

Importando o tablespace no servidor destino

Tudo pronto, arquivos enviados do servidor de origem para o servidor de destino, permissões ajustadas, agora só falta importar o tablespace novamente. Esse procedimento de importar o tablespace basicamente faz o link entre o arquivo de dados(c.ibd) com a tabela na engine InnoDB do servidor.

mysql> alter table c import tablespace;
Query OK, 0 rows affected (0,07 sec)
mysql> select count(*) from c;
+----------+
| count(*) |
+----------+
|    41297 |
+----------+
1 row in set (0,02 sec)

 

Pronto, a tabela foi copiada de um servidor MySQL em funcionamento e enviada para outro.
Claro que tem situações que é mais simples fazer isso com o mysqldump, mas como disse no video, se for uma tabela grande e o tempo de backup, enviar o arquivo e restore será demorado, esse se torna um procedimento bem útil.

Links de referência

Post Navigation