A energia acabou - a consulta terminou?

9

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?


fonte
6
Os logs ... se você registrar coisas. Caso contrário, recomendo começar.
Ben
11
@ Ben - tarde demais para recomendar um no-break e processamento transacional também, eu acho.
11
Se você estiver usando o InnoDB, poderá fazer seu código nas transações. dev.mysql.com/doc/refman/5.0/en/commit.html
11
Se você tivesse ativado o log de consultas lentas, as consultas lentas provavelmente teriam terminado no log de consultas lentas.
3
E, caso não tenha sido concluído corretamente, você tem um backup?

Respostas:

9

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:

SHOW BINARY LOGS;

Se eles estiverem ativados, você deverá obter uma saída como esta:

+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000244 |  15462544 |
| mysql-bin.000245 | 102622775 |
+------------------+-----------+

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 mysqlbinlogutilitário, execute, na linha de comando, algo como isto:

mysqlbinlog mysql-bin.000245

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 greppara encontrar sua consulta:

mysqlbinlog mysql-bin.000245 | grep "something which identifies the query"

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_binlogparam. É 1 ? Em seguida, a consulta não está no log binário ==> consulta não confirmada. Mas, se sync_binlognã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ós commite 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!

Shlomi Noach
fonte
2
Espero que fique por perto.
jcolebrand
2
@jcolebrand Rolando poderia fazer com alguma competição aqui :)
Philᵀᴹ