Substituir arquivos MyISAM sem parar o Mysql

3

Eu tenho um monte de arquivos MyISAM (MYD, MYI, FRM) no diretório mysql e novas versões deles em outro diretório. Como posso substituir os "antigos" por "mais recentes" sem parar o servidor mysql?

    
por georg 14.12.2011 / 12:33

3 respostas

5

Para minha resposta, vamos supor

  • você está substituindo uma tabela chamada proddata no banco de dados proddb
  • você tem proddata.frm, proddata.MYD, proddata.MYI in / root

Aqui está uma abordagem de isca e troca

Etapa 01) mysql> CREATE DATABASE baitandswitch;

Isso deve criar a pasta /var/lib/mysql/baitandswitch

Etapa 02) Coloque a nova versão da tabela proddata no banco de dados baitandswitch da seguinte forma:

$ cp /root/proddata.frm /var/lib/mysql/baitandswitch/.
$ cp /root/proddata.MYD /var/lib/mysql/baitandswitch/.
$ cp /root/proddata.MYI /var/lib/mysql/baitandswitch/.

CAVEAT: Não se preocupe com o mysql. Ele detectará a presença da nova tabela no banco de dados baitandswitch e atualizará o information_schema on-the-fly.

Etapa 03) Execute uma troca da tabela proddata entre proddb database e baitandswitch database

mysql> ALTER TABLE proddb.proddata RENAME baitandswitch.proddata_old;
mysql> ALTER TABLE baitandswitch.proddata RENAME proddb.proddata;

Eu recomendo que você execute esses dois comandos na mesma linha:

mysql> ALTER TABLE proddb.proddata RENAME baitandswitch.proddata_old; ALTER TABLE baitandswitch.proddata RENAME proddb.proddata;

É isso

  • Sem bloqueio
  • Sem descarga
  • Sem corrupção de dados
  • Sem parar o servidor do banco de dados

Divirta-se com isso.

Experimente!

CAVEAT

A etapa 03 usa o SQL para realizar o swap porque ele negociará quando for seguro mover a tabela. Portanto, se houver alguma consulta em execução, a execução do SQL aguardará a conclusão de todas as consultas antes de executar a movimentação da tabela.

Um benefício adicional dessa abordagem é que a tabela antiga ainda está disponível no banco de dados baitandswitch . Você pode fazer cópias das tabelas no sistema operacional, executar o SQL com ele ou simplesmente descartar o banco de dados baitandswitch para excluir todas as tabelas que precisavam ser alternadas.

    
por 14.12.2011 / 19:21
4
LOCK TABLES bla;
FLUSH TABLES bla;

Troque arquivos no nível do sistema operacional.

FLUSH TABLES bla;
UNLOCK TABLES bla;

(crédito para Jeff pela tabela de bloqueios)

    
por 14.12.2011 / 16:12
0

Não. Em vez disso, carregue-os em outra cópia do mysql e obtenha um dump usando o mysqldump. Então carregue isso no mysql em execução.

    
por 14.12.2011 / 14:08

Tags