2012-05-22 5 views
7

Ho esaminato il manuale e si è detto che ogni transazione aggiungerà un'istruzione BEGIN prima che inizi a prendere il dump. Qualcuno può elaborarlo in un modo più comprensibile?Perché un mysqldump con una singola transazione è più coerente di uno senza?

Ecco quello che ho letto:

Questa opzione emette un'istruzione BEGIN SQL prima di scaricare i dati dal server. E 'utile solo con le tabelle transazionali, come InnoDB e BDB, perché poi discariche lo stato di coerenza del database al momento in cui BEGIN è stato rilasciato senza bloccare tutte le applicazioni."

Can qualche elaborato su questo?

+1

Forse aggiungi alcuni link o citazioni di parti specifiche del manuale con cui hai bisogno di aiuto, altrimenti indovineremo un po 'su cosa vuoi sapere. – Cylindric

+0

Ho aggiornato il post. per favore dai un'occhiata. – Uday

risposta

23

Poiché il dump è in una transazione, si ottiene una vista coerente di tutte le tabelle nel database. Questo è probabilmente spiegato meglio da un controesempio. Diciamo che il dump di un database con due tabelle, Orders e OrderLines

  1. si avvia la discarica senza una singola transazione.
  2. Un altro processo inserisce una riga nella tabella Orders.
  3. Un altro processo inserisce una riga nella tabella OrderLines.
  4. Il dump elabora la tabella OrderLines.
  5. Un altro processo cancella i record Orders e OrderLines.
  6. Il dump elabora la tabella Orders.

In questo esempio, la vostra discarica avrebbe le righe per OrderLines, ma non Orders. I dati si troverebbero in uno stato incoerente e non riuscirebbero al ripristino se fosse presente una chiave esterna tra Orders e OrderLines.

Se l'operazione è stata eseguita in una singola transazione, il dump non avrebbe né l'ordine né le righe (ma sarebbe coerente) poiché entrambi sono stati inseriti e quindi eliminati dopo l'avvio della transazione.

+0

Hai trovato un esempio migliore/più chiaro di quello che ho fatto, penso. :) – Cylindric

+1

È davvero una spiegazione migliore .. grazie Eric .. Ho un dubbio. Se la mia discarica richiede un paio di ore, che ne dici della transazione durante quell'ora 1 poi ...? Vengono archiviati in buffer e scaricati su disco quando il dump è completato ....? o come succede ...? – Uday

5

Mi sono imbattuto in problemi in cui mysqldump senza il parametro --single-transaction sarebbe costantemente fallito a causa di dati modificati durante il dump. Per quanto posso capire, quando lo si esegue in una singola transazione, si impedisce eventuali modifiche che si verificano durante il dump causano un problema. Essenzialmente, quando si esegue il --single-transaction, si sta facendo un'istantanea del database in quel momento e si esegue il dumping anziché il dumpin g dati che potrebbero cambiare mentre l'utilità è in esecuzione.

+0

Vuoi dire, Durante la discarica tutte le transazioni avverranno solo in buufers e non verranno riflesse o scaricate sul disco fino al completamento del dump ....? – Uday

+0

Penso che copi un'istantanea in memoria o in tabelle temporanee e poi la scarichi. –

+1

@Uday Non preoccuparti troppo di * come * lo fa, perché dipende da tutti i tipi di fattori. Il concetto rimane lo stesso per tutti i tipi di motori diversi, che si tratti di MySQL, MSSQL, Oracle, qualsiasi cosa. – Cylindric

5

Questo può essere importante per i backup perché significa che si ottengono tutti i dati, esattamente come è in un punto nel tempo.

Così, per esempio, immaginare un semplice database blog, e un po 'tipico di attività potrebbe essere

  1. creare un nuovo utente
  2. creare un nuovo post dall'utente
  3. Eliminare un utente che cancella post

Ora, quando si esegue il backup del database, il backup può backup di tabelle in questo ordine

  1. Messaggi
  2. Utenti

Cosa succede se qualcuno elimina un utente, che è richiesto dai messaggi, subito dopo il backup raggiunge # 1?

Quando si ripristinano i dati, si scopre di avere un post, ma l'utente non esiste nel backup.

L'inserimento di una transazione nel suo insieme significa che tutti gli aggiornamenti, gli inserimenti e le eliminazioni che si verificano sul database durante il backup non vengono visualizzati dal backup.