Convertendo tabela grande de MyISAM para Innodb

9

Eu tenho uma tabela com cerca de 300 milhões de linhas no formato MyISAM que quero converter em Innodb

Meu objetivo original era reduzir o uso alterando o esquema da tabela para ter índices mais simples. Eu joguei toda a mesa, larguei, recriou com menos índices e agora estou reimportando. No entanto, esqueci de especificar que deveria ser innodb em vez de myisam.

Posso apenas fazer o padrão ALTER TABLE ... ENGINE = INNODB? Há algo especial que eu deveria estar ciente com uma mesa tão grande?

A operação de importação de dados está demorando cerca de 12 horas - eu detesto fazer isso novamente. Daí porque eu quero apenas convertê-lo.

    
por Will Glass 09.08.2009 / 17:26

2 respostas

14

O seguinte trecho saiu do livro " High Performance MySQL, Second Edition ".

Este é um excelente livro e eu recomendaria a todos.

A resposta curta é:

Com o tamanho e as condições da sua mesa, independentemente do método escolhido, acho que você está em uma longa espera.

Conversões de tabela

Existem várias maneiras de converter uma tabela de um mecanismo de armazenamento para outro, cada com vantagens e desvantagens.

ALTERAR TABELA

mysql> ALTER TABLE mytable ENGINE = Falcon;

Essa sintaxe funciona para todos os mecanismos de armazenamento, mas há um problema: pode levar muito tempo. O MySQL irá executar uma cópia linha por linha da sua tabela antiga em uma nova tabela. Durante Dessa vez, você provavelmente usará toda a capacidade de E / S de disco do servidor, e o original a tabela será bloqueada por leitura enquanto a conversão é executada.

Despejo e importação

Para obter mais controle sobre o processo de conversão, você pode optar por primeiro descartar a tabela para um arquivo de texto usando o utilitário mysqldump. Depois de você ter jogado a mesa, você pode simplesmente editar o arquivo de despejo para ajustar a instrução CREATE TABLE que ele contém. Estar Certifique-se de alterar o nome da tabela, bem como o seu tipo, porque você não pode ter duas tabelas com o mesmo nome no mesmo banco de dados, mesmo que sejam de tipos diferentes - e O mysqldump usa como padrão escrever um comando DROP TABLE antes de CREATE TABLE, então você pode perder seus dados se você não for cuidadoso!

CREATE e SELECT

A terceira técnica de conversão é um compromisso entre o primeiro mecanismo de velocidade e a segurança do segundo. Em vez de eliminar a tabela inteira ou converter tudo de uma vez, crie a nova tabela e use a sintaxe INSERT ... SELECT do MySQL para preenchê-lo da seguinte forma:

mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb_table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;

Isso funciona bem se você não tiver muitos dados, mas, se fizer isso, é mais eficiente para preencher a tabela incrementalmente, confirmando a transação entre cada parte então os desfazer logs não crescem muito. Assumindo que id é a chave primária, execute este consulta repetidamente (usando valores maiores de x e y de cada vez) até ter copiado todos os dados para a nova tabela:

mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table
-> WHERE id BETWEEN x AND y;
mysql> COMMIT;

Depois de fazer isso, você ficará com a tabela original, que pode ser descartada quando feito com ele, e a nova tabela, que agora está totalmente preenchida. Tenha cuidado para travar o tabela original, se necessário, para evitar uma cópia inconsistente dos dados!

    
por 09.08.2009 / 18:44
2

A instrução ALTER TABLE essencialmente faz a mesma coisa: o servidor cria uma tabela temporária onde copia todas as linhas e depois faz um RENAME. Os formatos no disco são extremamente diferentes entre o InnoDB e o MyISAM, então eu não espero que você encontre nenhum atalho para isso.

Outra observação (que você pode estar ciente, mas ajudaria os outros a ler isto): o formato em disco do InnoDB é altamente dependente da chave primária, porque agrupa os registros baseados nele. Então, quando estiver trabalhando com grandes tabelas InnoDB, pense duas vezes antes de escolher a chave primária, porque alterá-la reconstrói toda a tabela, muito parecido com o problema em questão.

De qualquer forma, eu recomendo fazer alguns testes primeiro em uma mesa de tamanho moderado e marcar esses momentos.

    
por 09.08.2009 / 18:20

Tags