Existe uma maneira de verificar e ver se uma consulta terminou? Fiz três consultas de atualização muito longas (+/- 25 horas cada) enquanto saía para férias na semana passada. Infelizmente, em algum lugar durante a semana a energia acabou e a máquina executando o MYSQL foi desligada. Existe uma maneira de verificar e ver quais das 3 (ou todas as três) consultas foram concluídas?
Sei que poderia verificar se os dados foram atualizados, mas é de esperar que os NULLs sejam executados de maneira correta e completa, e há 48 milhões de linhas de dados para ler. Alguma ideia?
Respostas:
Se você estiver executando com logs binários ativados, isso poderá ser verificado com confiabilidade relativamente alta.
Primeiro, para verificar se os logs binários estão realmente habilitados, execute:
Se eles estiverem ativados, você deverá obter uma saída como esta:
Caso contrário, você receberá uma mensagem de erro.
Agora, se os logs binários estiverem ativados, qualquer confirmação bem-sucedida também será gravada nos logs binários. Eu digo "confirmar", mas a verdade é que qualquer operação bem-sucedida, mesmo em tabelas não transacionais como o MyISAM, está escrita lá. Mas, para ser honesto, para ter alguma certeza sobre o resultado de suas consultas, espero que você esteja usando um mecanismo transacional como o InnoDB, ou então não tenha certeza de nada.
OK, então, supondo que agora você tenha os logs binários ativados e que suas tabelas sejam transacionais (provavelmente InnoDB), espera-se que uma conclusão bem-sucedida de suas consultas seja gravada nos logs binários.
Agora você deve procurar o log binário relevante e procurar a consulta lá. Se você encontrar a consulta - bom! Se não - provavelmente não está lá. Eu vou explicar em breve.
Qual log binário contém sua consulta? Veja os próprios arquivos de log binário, normalmente no diretório de dados. Procure os carimbos de data e hora. Quando a energia chegou, um novo log binário foi criado. Encontre. Suas consultas provavelmente estão no log binário anterior àquele. Isso é um palpite. Também poderia ser um antes disso, etc. Mas é um bom palpite.
Agora, usando o
mysqlbinlog
utilitário, execute, na linha de comando, algo como isto:Substitua o nome do arquivo pelo que você suspeita conter a consulta.
Isso produzirá todas as consultas neste arquivo de log binário na saída padrão. No Unix, use
grep
para encontrar sua consulta:No Windows, boa sorte. Abra com o bloco de notas ++ ou algo assim e pesquise manualmente.
A consulta está aí? Ótimo - você sabe que foi comprometido.
A consulta não está lá? Precisa verificar o
sync_binlog
param. É 1 ? Em seguida, a consulta não está no log binário ==> consulta não confirmada. Mas, sesync_binlog
não for 1 , ainda poderá haver uma chance de a consulta ter sido confirmada, mas ainda não no log binário, pois a falha pode ter ocorrido logo apóscommit
e imediatamente antes do log binário ser liberado no disco. Você precisa reverter para outros meios.Os seguintes são: (e espero que, novamente, você esteja usando o InnoDB): procure uma única linha que possa identificar o resultado da consulta. Com o InnoDB você obtém "tudo ou nada". Se você pode ter certeza de uma única linha afetada pela consulta - pode ter certeza de que a consulta foi concluída.
edit: é claro, se o log lento estiver ativado, você poderá esperar que uma consulta tão longa seja registrada lá após a conclusão também ...
Boa sorte!
fonte