Tive um problema com nosso servidor de replicação. Essencialmente, temos 2 bancos de dados (database1 e database2). O servidor mestre tem ambos. Escravo tem apenas banco de dados1. Existe um
Replicate_Do_DB: database1
definido na configuração CHANGE MASTER TO.
Agora, o que aconteceu é que estamos usando o code igniter e um dos programadores criou o database2 e começou a inserir informações nele. O Code Igniter define um banco de dados padrão como database1. Agora o resultado é para cada consulta que ele produziu - recebo um erro em SHOW SLAVE STATUS\G:
Error 'Table 'database2.tbl40' doesn't exist' on query. Default database: 'database1'. Query: 'INSERT INTO `database2`.`tbl40` (`date`, `day`) VALUES ('2011-04-26', '2011-04-26')'
Então, basicamente, eu corrigi o problema depois, mas a replicação não funciona, pois há cerca de 1.000 consultas que produzirão esse erro para o servidor de replicação.
Minha pergunta é - existe alguma maneira de limpar consultas como essa do binlog? Ou eu preciso escrever um script que fará um
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
para cada consulta que produz um erro?
Se você realmente não se importa com essa tabela, pode usar pt-slave-restart no escravo e fazer com que ele ignore esses problemas. Eu seria conservador ao executá-lo e garantir que você esteja ignorando apenas as consultas para a tabela/banco de dados com a qual não se importa ou, pelo menos, apenas para um erro específico.
Você não postou qual era o código de erro na saída de SHOW SLAVE STATUS, mas suspeito que seja o erro 1146.
Por exemplo, isso irá ignorar todos os erros para 1146:
Ou você pode tentar pular todos os erros que fazem referência a essa tabela
Outra maneira de fazer isso seria definir
replicate-ignore-db=database2
e reiniciar o MySQL no escravo, mas há algumas ressalvas sobre como isso funciona que você deve ler na documentaçãoAcho que o maior problema aqui é que seu contexto de banco de dados padrão era database1. É por isso que seu slave tentou executar a atualização no database2 desde que foi especificado no formato database2.table.
Basicamente, não é seguro usar a sintaxe db.table com curingas ou você se encontrará na situação em que se encontrava. Se você deseja usar o curinga do ou ignore, geralmente é mais seguro sempre especificar seu banco de dados padrão usando "use" e executar a consulta nesse contexto.