La corrente si è spenta: la query è terminata?


9

C'è un modo per verificare e vedere se una query è terminata? Ho eseguito 3 query di aggiornamento molto lunghe (+/- 25 ore ciascuna) mentre sono uscito per le vacanze per la scorsa settimana. Sfortunatamente, da qualche parte durante la settimana la corrente si è spenta e la macchina che esegue MYSQL si è spenta. C'è un modo per verificare e vedere quali delle 3 (o tutte e tre) le query sono state completate?

So che potrei verificare se i dati sono stati aggiornati, ma ci si aspetta NULL con un'esecuzione corretta e completa e ci sono 48 milioni di righe di dati da esaminare. qualche idea?

mysql 

6
I registri ... se registri le cose. In caso contrario, consiglierei di iniziare.
Ben

1
@Ben - troppo tardi per raccomandare un UPS e anche l'elaborazione transazionale, immagino.

1
Se stai usando InnoDB puoi fare il tuo codice nelle transazioni. dev.mysql.com/doc/refman/5.0/en/commit.html

1
Se fosse stata attivata la registrazione delle query lenta, le query che rallentano probabilmente sarebbero finite nel registro delle query lente.

3
E, nel caso in cui non sia stato completato correttamente, hai un backup?

Risposte:


9

Se si esegue con i registri binari abilitati, questo può essere verificato con un'affidabilità relativamente elevata.

Innanzitutto, per verificare se i registri binari sono effettivamente abilitati, eseguire:

SHOW BINARY LOGS;

Se sono abilitati, dovresti ottenere un output come questo:

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

Altrimenti riceveresti un messaggio di errore.

Ora, se i registri binari sono abilitati, anche qualsiasi commit eseguito correttamente viene scritto nei registri binari. Dico "commit", ma la verità è che qualsiasi operazione riuscita, anche su tabelle non transazionali come MyISAM, è scritta lì. Ma, ad essere onesti, per avere delle certezze sull'esito delle tue domande, spero per il tuo bene che stai usando un motore transazionale come InnoDB, altrimenti non puoi essere sicuro di nulla.

OK, supponendo ora che i log binari siano attivi e che le tabelle siano transazionali (si spera InnoDB), si prevede che un completamento corretto delle query venga scritto nei log binari.

È ora necessario cercare il registro binario pertinente e cercare la query lì. Se trovi la query, va bene! In caso contrario, molto probabilmente non è lì. Spiegherò a breve.

Quale registro binario contiene la tua query? Guarda i file di registro binari stessi, in genere nella directory dei dati. Cerca i loro timestamp. All'accensione, è stato creato un nuovo registro binario. Trovalo. Molto probabilmente le tue domande si trovano nel registro binario prima di quello. Questa è un'ipotesi. Potrebbe anche essere uno prima, ecc. Ma è una buona ipotesi.

Ora, usando l' mysqlbinlogutilità, esegui, dalla riga di comando, qualcosa del genere:

mysqlbinlog mysql-bin.000245

Sostituisci il nome del file con quello che ritieni contenga la query.

Ciò genererà tutte le query in questo file di registro binario nell'output standard. Su Unix, usa grepper trovare la tua query:

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

Su Windows, buona fortuna. Apri con notepad ++ o qualcosa del genere e cerca manualmente.

La query è lì? Ottimo - sai che è stato commesso.

La query non è presente? È necessario controllare su sync_binlogparam. È 1 ? Quindi query non nel registro binario ==> query non impegnata. Ma se sync_binlognon è 1 , potrebbe esserci ancora la possibilità che la query sia stata impegnata ma non nel registro binario, poiché potrebbe essersi verificato l'arresto anomalo subito dopo commite immediatamente prima che il registro binario fosse scaricato sul disco. È quindi necessario ripristinare altri mezzi.

Quelli che sono: (e si spera, di nuovo, stai usando InnoDB): cerca una singola riga in grado di identificare il risultato della query. Con InnoDB ottieni "tutto o niente". Se puoi essere certo di una singola riga interessata dalla query, puoi essere sicuro che la query è stata completata.

modifica: ovviamente, se è abilitato il log lento, puoi aspettarti che una query così lunga venga registrata anche dopo il completamento ...

In bocca al lupo!


2
Spero che rimani in giro.
jcolebrand

2
@jcolebrand Rolando potrebbe fare un po 'di concorrenza qui :)
Philᵀᴹ
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.