Uma das melhores maneiras de converter o MyISAM para o InnoDB sem muito tempo de inatividade tem apenas um pré-requisito: Use um escravo de replicação.
Aqui está uma visão geral do plano
- Criar configuração de mestre de replicação / escravo
- Converta todas as tabelas MyISAM do escravo em InnoDB
- Aponte seu aplicativo para o Escravo
Parece simples? Há muitos detalhes por trás disso.
Criar configuração de mestre de replicação / escravo
Existe uma maneira elegante de criar um Escravo sem muita perturbação para o Mestre. Eu escrevi dois posts:
Em vez de detalhar como usar o rsync, leia essas duas postagens.
Converta todas as tabelas MyISAM do escravo em InnoDB
No DB Slave, você pode a seguinte instrução SQL:
Para o MySQL 5.5:
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM' AND table_schema NOT IN
('information_schema','mysql','performance_schema');
Versão para MySQL anterior ao MySQL 5.5
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')
FROM information_schema.tables
WHERE engine = 'MyISAM' AND table_schema NOT IN
('information_schema','mysql');
Usando a saída da consulta, você tem um script de conversão para o escravo.
Você deve colocar essas duas linhas na parte superior do script:
SET SQL_LOG_BIN = 0;
STOP SLAVE;
O script primeiro desabilitará o registro binário (se você configurou o escravo para ter registros binários), interromperá a replicação e converterá cada tabela MyISAM em InnoDB.
Aqui está como criar esse script e executá-lo:
SQLSTMT="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') FROM information_schema.tables WHERE engine = 'MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema')"
INNODB_CONV_SCRIPT=MassConvertMyISAMTablesToInnoDB.sql
echo "SET SQL_LOG_BIN = 0;" > ${INNODB_CONV_SCRIPT}
echo "STOP SLAVE;" >> ${INNODB_CONV_SCRIPT}
mysql -h(IP of Master) -u... -p... --skip-column-names -A -e"${SQL}" >> ${INNODB_CONV_SCRIPT}
echo "START SLAVE;" >> ${INNODB_CONV_SCRIPT}
mysql -h(IP of Slave) -u... -p... --skip-column-names -A < ${INNODB_CONV_SCRIPT}
Aponte seu aplicativo para o Escravo
Execute consultas SELECT do escravo. Se você estiver satisfeito com o conteúdo dos dados no Escravo, sinta-se à vontade para apontar seu aplicativo para o escravo da seguinte maneira:
- No Escravo, execute
SHOW SLAVE STATUS\G
e verifique se Seconds_Behind_Master é 0
- No Slave, mysqldump -h (IP do Slave) -u ... -p ... - única transação - rotinas - gatilhos - todos os bancos de dados> MySQLBackup.sql (Ei, um backup seria bom sobre Agora)
- No Master, execute
service mysql stop
(o tempo de inatividade é iniciado)
- Repita a etapa 1
- Aponte seu aplicativo para o Escravo (o tempo de inatividade termina na primeira conexão do aplicativo)
Se você chegou a esse ponto ileso, PARABÉNS !!!
BÔNUS ADICIONADOS : Se você configurar a Replicação Mestre / Mestre (também conhecida como Replicação Circular) em vez de Mestre / Escravo, poderá fazer isso:
- No Escravo, execute
SHOW SLAVE STATUS\G
e verifique se Seconds_Behind_Master é 0
- No Slave, mysqldump -h (IP do Slave) -u ... -p ... - única transação - rotinas - gatilhos - todos os bancos de dados> MySQLBackup.sql (Ei, um backup seria bom sobre Agora)
- Aponte seu aplicativo para o Escravo (o tempo de inatividade inicia e termina na primeira conexão do aplicativo)
- No novo mestre, execute
STOP SLAVE;
- No novo mestre, execute
CHANGE MASTER TO MASTER_HOST='';
O que você tem agora é Mestre / Escravo ao contrário. O novo mestre possui dados do InnoDB e o antigo mestre agora é escravo dos dados do MyISAM. Se você dividir leituras e gravações, as leituras podem ir do escravo (as leituras são mais rápidas do MyISAM do que o InnoDB) e as gravações vão para o mestre (suporte transacional para o InnoDB). Como Hannah Montana canta, você obtém o melhor dos dois mundos (sim, eu tenho duas filhas que amam o show) !!!
OUTRO BÔNUS ADICIONADO : Como o Master agora é InnoDB, você pode executar o mysqldump do Master sem tempo de inatividade e sem interferir nas transações. A única desvantagem é aumentar a E / S da CPU e do disco. Você pode, portanto, fazer um mysqldump de estruturas de tabela apenas no Master (InnoDB) e um mysqldump dos dados apenas no slave (Esse dump não terá referências ao InnoDB ou MyISAM. Serão apenas dados) mais um mysqldump do estruturas de tabela para o escravo ter o layout MyISAM.
As possibilidades podem continuar por causa desta nova configuração ...
UPDATE 2011-08-27 19:50 EDT
Me desculpe. Eu não li completamente a pergunta. Você já realizou a conversão .
Somente se você já tiver o log binário ativado e tiver um backup anterior, poderá
- restaure / var / lib / mysql para outro local, como / var / lib / mysql2
- corre
service mysql stop
- corre
service mysql start --datadir=/var/lib/mysql2
- mysqldump o banco de dados desse backup para /root/olddata.sql
- execute o mysqlbinlog em todos os logs binários em / var / lib / mysql (não em / var / lib / mysql2) a partir do momento desde o último backup em /root/changes.sql
- Carregue changes.sql no mysql (já que ele ainda está apontando para / var / lib / mysql2)
Isso deve capturar tudo o que foi gravado e a conversão deve ser ativada . Novamente, tudo isso é contigente porque você já teve o log binário ativado antes do último backup . Caso contrário, minhas condolências.