Então, eu tenho um servidor de banco de dados de teste que foi configurado em um fluxo de replicação. Por cima do nome, veio uma otimização que rapidamente preencheu o espaço no datadir dos escravos. O Mysql obedientemente estava apenas esperando por mais espaço.
Este datadir é um sistema de arquivos usado SOMENTE como o datadir do mysql, portanto não havia mais nada para liberar.
Eu tinha uma tabela de teste de innodb de 4 GB que não fazia parte do fluxo de replicação, então imaginei que tentaria algo para ver se funcionaria e, sendo um ambiente de teste, não estava muito preocupado se as coisas saíssem horrivelmente erradas.
Aqui estão os passos que tomei
- Lavou a mesa que eu estava prestes a me mudar
- Colocou um bloqueio de leitura nele (mesmo que nada estivesse gravando nele e não estivesse no fluxo de replicação)
- Copiou o .frm e o .ibd para um sistema de arquivos com algum espaço livre
- Destrancou a mesa
- Truncou a tabela - isso liberou espaço suficiente para a otimização terminar, e a replicação começou a funcionar novamente.
- Parar slaving / shutdown mysql
- Copie o arquivo de tmp de volta para o diretório de dados
- Reinicie o mysql
Nada aparece no log .err, as coisas parecem boas. Eu conecto e uso mydb; e veja a tabela com a qual eu estava mexendo nas tabelas do show. Mas se eu tentar
select * from testtable limit 10;
Eu recebo o erro
ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist
Pelo que sei até agora, posso ler todas as outras tabelas e a replicação foi iniciada sem queixas.
Existe algo que eu possa fazer para me recuperar desse ponto? Posso reconstruí-lo do zero, se necessário, mas fiquei curioso com o que os outros pensavam sobre esse empreendimento em geral. Houve algo sobre a série de etapas que eu tomei que acabaria com mais resultados impecáveis?
E se este não fosse um servidor de teste, eu não poderia simplesmente 'fazer isso ao vivo' e ver o que acontece? Qual seria a melhor maneira de liberar espaço temporariamente em um escravo de produção se eu tivesse que gostar disso?
Table 'X' doesn't exist in engine
. Preciso fazer o método acima para todas as tabelas ou existem maneiras melhores de corrigir isso?