CHECKPOINT o COMMIT scrive sul disco?


12

Diciamo, per SQLServer2008R2 e versioni successive, con database in modalità di recupero completo.

Ho sempre pensato :

  1. Quando viene eseguita una transazione (COMMIT), la transazione viene scritta nel registro delle transazioni nella RAM.

  2. Quando si verifica un CHECKPOINT (dopo un po 'di tempo e / o alcune transazioni e altri criteri), le transazioni tra l'ultimo CHECKPOINT e la corrente vengono scritte sul disco.

  3. Quando si verifica un BACKUP LOG, i dati vengono scritti nel file MDF.

Ho ragione? Alcuni dei miei colleghi dicono che mi sbaglio, ed è difficile trovare la risposta corretta, anche con il BOL.

Grazie!


Risposte:


20

Sfortunatamente ci sono un certo numero di errori nelle risposte finora per quanto riguarda il funzionamento di COMMIT, quindi ne aggiungerò un altro. Vedi come funziona: presentazione I / O di SQL Server di Bob Dorr per dettagli e Nozioni di base sugli I / O di SQL Server 2000 . Ecco come funziona:

  • Tutte le scritture (modifiche) di dati completamente registrati avvengono esattamente nella sequenza seguente (vedere Informazioni su come SQL Server esegue una query: Scrittura di dati ):

    • La pagina dei dati è bloccata esclusivamente
    • Un registro che descrive la modifica viene aggiunto al registro, in memoria. Il nuovo record di registro genera un nuovo LSN, vedere Cos'è un LSN: numero di sequenza del registro .
    • La pagina di dati viene modificata (sia il set di dati sia last_update_lsn nella pagina). Questa è ora una pagina modificata ('sporca').
    • Il latch della pagina di dati è stato rilasciato
    • nulla viene scritto direttamente sul disco come risultato dell'aggiornamento
  • Un COMMIT procede come segue

    • aggiunge un nuovo record di registro che descrive COMMIT nel registro, in memoria
    • tutti i record di registro non scaricati su disco, fino a quello generato sopra incluso, vengono scaricati (scritti su disco)
    • i thread thread attendono fino a quando il sistema operativo non segnala la scrittura sopra come durevole (IO completa)
    • L'istruzione COMMIT (o istruzione DML con commit implicito) viene completata
  • Un CHECKPOINT fa quanto segue (semplificato), vedi Come funzionano i checkpoint e cosa viene registrato :

    • Tutte le pagine sporche in memoria vengono scritte sul disco
      • Per ogni pagina sporca, prima di iniziare a scrivere su disco, il registro su e incluso l'LSN che è last_update_lsn su quella pagina viene scaricato (scritto su disco). Si noti che il flushin di qualsiasi LSN implica che anche tutti i LSN precedenti vengano scaricati, quindi per le pagine più sporche questo è un no-op poiché il suo ultimo last_update è probabilmente già scaricato.
    • il registro che descrive il checkpoint viene scritto nel registro e svuotato
    • la pagina di avvio del database viene aggiornata con l'LSN del record generato sopra

Le scritture funzionano in modo diverso per le operazioni minimamente registrate, vedere Operazioni che possono essere minimamente registrate . All'incirca le operazioni minimamente registrate agiscono come segue (semplificate):

  • Prima di inserire righe in una pagina come parte di un'operazione minimamente registrata, viene generato e aggiunto al registro un registro che descrive il fatto che la pagina partecipa a operazioni minimamente registrate (in memoria)
  • La pagina minimamente registrata viene aggiornata, poiché molti inserti vengono scritti su di essa, se è adatta. Non viene registrato nulla, nothign viene scritto sul disco.
  • Quando viene eseguita un'operazione di registrazione minima, prima di eseguire il commit è necessario che tutte le pagine che hanno partecipato alle operazioni di registrazione minima in quella transazione vengano scritte sul disco. Una volta completata questa scrittura, il record di registro COMMIT può essere aggiunto al registro (in memoria) e il registro, incluso e incluso questo nuovo record di registro di commit aggiunto, viene scaricato (scritto) sul disco.

8

Quando viene eseguita una transazione (COMMIT), la transazione viene scritta nel registro delle transazioni nella RAM.

Una transazione viene scritta nel registro delle transazioni prima ancora di modificare la pagina o i dati come richiesto dalla query. Questo si chiama write ahead logging (WAL). Se SQL Server si arresta in modo anomalo durante l'aggiornamento di una pagina in memoria, WAL garantisce che il motore DB possa leggere il registro delle transazioni e ripristinare la transazione. Questa è una proprietà ACID di un RDBMS.

Quando si verifica un CHECKPOINT (dopo un po 'di tempo e / o alcune transazioni e altri criteri), le transazioni tra l'ultimo CHECKPOINT e la corrente vengono scritte sul disco.

Un checkpoint scarica le pagine sporche dal buffer al disco. Si comporta in modo leggermente diverso per tempdb . Una pagina sporca è una pagina che è cambiata da quando è stata letta dal disco. Questo processo di checkpoint crea un segno nel registro delle transazioni fino al punto in cui le transazioni sono state impegnate. Dopo un errore, il recupero è a conoscenza del fatto che tutte le transazioni fino a quel marchio erano state impegnate. È possibile emettere checkpoint manualmente con un comando TSQL.

Quando si verifica un BACKUP LOG, i dati vengono scritti nel file MDF.

No, quando si verifica il registro di backup SQL Server copia le informazioni del registro delle transazioni dal file di registro del database sul disco in cui si sta scrivendo il backup. Un'operazione di backup legge i dati dal disco e scrive i dati sul disco.

Vorrei che tu leggessi i link qui sotto

Comprensione Registrazione e ripristino in SQL Server Già indicato da Mark

Libro interno di SQL Server 2008 e risoluzione dei problemi

Architettura e gestione del registro delle transazioni


Ok, sembra chiaro. Solo per essere certi: quando si verifica un COMMIT, dici che è scritto nel registro delle transazioni; vuoi dire buffer o disco (LDF)?
Patator

Verrà sempre scritto prima nella cache del registro e successivamente scaricato nel registro delle transazioni sul disco. Ho aggiunto il link per la gestione del registro delle transazioni, fare riferimento ad esso per come funziona WAL
Shanky,

"Se SQL Server si arresta in modo anomalo durante l'aggiornamento di una pagina in memoria, WAL garantisce che il motore DB possa leggere il registro delle transazioni e ripristinare la transazione." Questo è vero solo se la transazione non è impegnata. Se è già stato eseguito il commit, non è possibile eseguire il rollback di nulla. Le informazioni nel registro delle transazioni vengono utilizzate per aggiornare i file di dati. Anche se il buffer non è stato scritto nel file di dati prima dell'incidente.
miracle173,

@Miracle: immagino che se la pagina è in fase di aggiornamento che è correlata a una particolare transazione, ovviamente la transazione non sarebbe stata impegnata.
Shanky,

4

Di seguito chiariremo le cose per te:

Quando viene eseguita una transazione (COMMIT), la transazione viene scritta nel registro delle transazioni nella RAM.

  • COMMIT (o BEGIN) non ha nulla a che fare con il modello di recupero. È a livello di transazione. Una transazione deve essere completamente completata o fallita ( ricordare le proprietà ACID ). Quindi, in sostanza, un COMMIT segnerà la fine di una transazione riuscita (implicita o esplicita). Una dichiarazione COMMIT garantirà che tutte le modifiche della transazione siano rese parte permanente del database.
  • Per apportare eventuali modifiche, SQL Server utilizzerà WAL (Write-ahead Logging) in cui descriverà innanzitutto nel registro qualsiasi modifica che sta per apportare, prima di modificare i dati.

Quando si verifica un CHECKPOINT (dopo un po 'di tempo e / o alcune transazioni e altri criteri), le transazioni tra l'ultimo CHECKPOINT e la corrente vengono scritte sul disco.

Quando si verifica un BACKUP LOG, i dati vengono scritti nel file MDF.

Fare riferimento a:

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.