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.