Primeiro você precisa entender que a replicação do MySQL apenas sincroniza os CHANGES. Esvaziar as tabelas (ou excluí-las) não fará com que os dados sejam replicados novamente. Você tem que iniciar o escravo com um conjunto consistente de arquivos de dados.
O processo difícil de repagar seu escravo é o seguinte: (não siga estas instruções)
- Obtenha um instantâneo consistente dos seus dados.
- Copie o instantâneo para o escravo.
- Reconfigure e inicie o escravo.
Se você não consegue tolerar o tempo de inatividade, existem duas maneiras de fazer isso.
-
Se os dados forem pequenos o suficiente para que você possa mysqldump tudo, incluindo os dados, estas instruções são boas . Se você tiver vários bancos de dados, leia o artigo, pois não vou replicar essas considerações aqui. Mas se você tiver apenas 1 banco de dados, os passos básicos são:
- No mestre, faça backup do banco de dados da seguinte forma:
mysqldump -u root -e -q --single-transaction --master-data database_name
- Importe este backup para o seu escravo.
- Observe o início do arquivo de backup para obter o nome e a posição do registro principal.
- No escravo no shell mysql, execute algo parecido com isto, mas atualize com as informações da etapa 3:
START SLAVE UNTIL MASTER_LOG_FILE='bin.000029', MASTER_LOG_POS=651322976;
- No mestre, faça backup do banco de dados da seguinte forma:
-
Se os seus bancos de dados são muito grandes para o mysql dump, você precisará fazer um snapshot de suas tabelas usando os recursos de instantâneos de volume do seu sistema operacional. Isso irá pausar seu servidor MySQL por alguns segundos, então é melhor fazê-lo depois de horas, quando isso provavelmente não irá incomodar ninguém.
- No mestre no shell mysql, use um bloqueio de gravação em todas as tabelas para torná-las consistentes usando
flush tables with write lock
. Isso efetivamente pausará o servidor. - Não saia da shell do mysql ou perderá o seu bloqueio.
- Em outro shell do SO, tire um instantâneo do volume de dados do mysql.
- De volta ao shell do mysql:
SHOW MASTER STATUS
para obter a posição atual do log, entãoUNLOCK TABLES
para liberar o bloqueio. O servidor está agora sem pausa. - Acesse o instantâneo e copie os arquivos de dados mysql para o escravo.
- No escravo no shell mysql, execute algo como isto, mas atualize com as informações da etapa # 4:
START SLAVE UNTIL MASTER_LOG_FILE='bin.000029', MASTER_LOG_POS=651322976;
- No mestre no shell mysql, use um bloqueio de gravação em todas as tabelas para torná-las consistentes usando