Desenvolvimento e bases de dados

Converter uma base de dados MyISAM para InnoDB, mudando o motor de armazenamento

Revisto a 5 min de leitura MySQL conversão

Uma aplicação pode exigir a conversão de tabelas MyISAM para InnoDB. Não substitua texto globalmente dentro do dump nem esvazie a base de dados de produção: a alteração tem de ser testada numa cópia independente, mantendo o original como reversão.

1. Criar e verificar uma cópia protegida

Trabalhe a partir de uma pasta privada fora de public_html, com um nome de dump novo. Pare temporariamente as escritas e gere um dump. A opção -p pede a palavra-passe sem a incluir no comando:

umask 077
mysqldump --routines --triggers -u USUARIO_MYSQL -p BASE_DE_DATOS > base-antes-innodb.sql &&
test -s base-antes-innodb.sql &&
sha256sum base-antes-innodb.sql > base-antes-innodb.sql.sha256 &&
chmod 400 base-antes-innodb.sql base-antes-innodb.sql.sha256 &&
sha256sum -c base-antes-innodb.sql.sha256

Se o mysqldump devolver um erro, não continue nem considere válido o ficheiro parcial. A exportação de rotinas exige permissões; se falhar, reveja que objetos a aplicação precisa antes de os omitir. Os eventos, se existirem, também têm de ser inventariados e exportados com as opções e permissões adequadas. O checksum deteta alterações posteriores no ficheiro, mas não demonstra que a cópia está completa. As permissões só de leitura também não a tornam imutável.

Descarregue o dump e o seu checksum para outro armazenamento. Não altere estes ficheiros.

2. Restaurar e rever um clone

Crie uma base de dados e um utilizador novos, restaure a cópia e configure aí um clone da aplicação. Desative os seus emails, cobranças, webhooks e tarefas automáticas para não duplicar ações de produção:

mysql -u USUARIO_NUEVO -p BASE_NUEVA < base-antes-innodb.sql

Pré-visualize as tabelas MyISAM e o seu tamanho:

SELECT TABLE_NAME, ENGINE, TABLE_ROWS, DATA_LENGTH, INDEX_LENGTH
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'BASE_NUEVA'
  AND ENGINE = 'MyISAM';

Reveja as chaves primárias, os índices (incluindo FULLTEXT), os tipos de linha e a compatibilidade da aplicação com a mudança de motor. Confirme o espaço livre tanto para o clone como para reconstruir as suas tabelas. A conversão pode bloquear tabelas e precisar de espaço adicional.

3. Converter apenas as tabelas revistas

Gere uma lista de instruções exatas, verifique-a e execute cada uma apenas no clone:

SELECT CONCAT('ALTER TABLE `', REPLACE(TABLE_SCHEMA, '`', '``'),
              '`.`', REPLACE(TABLE_NAME, '`', '``'), '` ENGINE=InnoDB;') AS sentencia_a_revisar
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'BASE_NUEVA'
  AND ENGINE = 'MyISAM';

Não use uma substituição global no .sql: poderia alterar dados de utilizadores, comentários ou configurações que contenham a palavra MyISAM.

4. Validar e fazer a mudança

Use COUNT(*) para contagens exatas: TABLE_ROWS pode ser uma estimativa, sobretudo depois de converter para InnoDB. Compare o esquema, os índices e a contagem de linhas de todas as tabelas entre a base de dados original e o clone. Teste o acesso, as pesquisas, a escrita, as tarefas agendadas e as operações críticas da aplicação.

Só depois de validar o clone, pare novamente as escritas, sincronize as alterações finais, se for o caso, e altere as credenciais da aplicação para usar BASE_NUEVA. Mantenha a base de dados original intacta e sem escritas durante o período de observação.

Reversão

Se alguma verificação posterior falhar, pare as escritas. Antes de repor as credenciais anteriores, identifique e guarde as operações recebidas na base de dados nova; voltar sem as conciliar perderia essas alterações. Depois de resolver esse ponto, volte à base de dados original. Mantenha tanto essa base de dados como o dump verificado até confirmar que a conversão está estável.

Se não puder dispor de um clone ou calcular o espaço necessário, contacte o suporte antes de converter as tabelas.

Também lhe pode ser útil

Algo não bate certo ou mudou? Diga-nos e revemos.