CHECKPOINT ou COMMIT écrit sur le disque?

12

Disons, pour SQLServer2008R2 et supérieur, avec des bases de données en mode de récupération complète.

J'ai toujours pensé :

  1. Lorsqu'une transaction est validée (COMMIT), la transaction est écrite dans le journal des transactions dans la RAM.

  2. Lorsqu'un CHECKPOINT se produit (après un certain temps et / ou certaines transactions et d'autres critères), les transactions entre le dernier CHECKPOINT et le courant sont écrites sur le disque.

  3. Lorsqu'un journal de sauvegarde se produit, les données sont écrites dans le fichier MDF.

Ai-je raison? Certains de mes collègues disent que je me trompe, et il est difficile de trouver la bonne réponse, même avec le BOL.

Merci!

Patator
la source

Réponses:

20

Malheureusement, il y a un certain nombre d'erreurs dans les réponses à ce jour concernant le fonctionnement de COMMIT, alors j'en ajouterai une autre. Voir Comment cela fonctionne: Présentation d'E / S SQL Server de Bob Dorr pour plus de détails et les bases d'E / S SQL Server 2000 . Voici comment cela fonctionne:

  • Toutes les écritures (modifications) de données entièrement enregistrées se produisent dans l'ordre exactement suivant (voir Comprendre comment SQL Server exécute une requête: écriture de données ):

    • La page de données est verrouillée exclusivement
    • Un enregistrement de journal décrivant la modification est ajouté au journal, en mémoire. Un nouvel enregistrement de journal génère un nouveau LSN, voir Qu'est - ce qu'un LSN: numéro de séquence de journal .
    • La page de données est modifiée (à la fois l'enregistrement de données et last_update_lsn sur la page). Cette page est maintenant modifiée ('sale').
    • Le verrou de la page de données est libéré
    • rien n'est écrit sur le disque directement à la suite de la mise à jour
  • UN COMMIT fait ce qui suit

    • ajoute un nouvel enregistrement de journal décrivant le COMMIT au journal, en mémoire
    • tous les enregistrements de journaux non vidés sur le disque, jusqu'à celui inclus ci-dessus inclus, sont vidés (écrits sur le disque)
    • les blocs de threads attendent que le système d'exploitation signale l'écriture ci-dessus comme durable (IO terminé)
    • L'instruction COMMIT (ou l'instruction DML avec validation implicite) se termine
  • Un POINT DE CONTRÔLE fait ce qui suit (simplifié), voir Comment fonctionnent les points de contrôle et ce qui est enregistré :

    • Toutes les pages sales en mémoire sont écrites sur le disque
      • Pour chaque page sale, avant de commencer à écrire sur le disque, la connexion au LSN qui est le last_update_lsn sur cette page et y compris est vidée (écrite sur le disque). Notez que le vidage de n'importe quel LSN implique que tous les LSN précédents sont également vidés, donc pour les pages les plus sales, il s'agit d'un no-op car son propre last_update est probablement déjà vidé.
    • le journal décrivant le point de contrôle est écrit dans le journal et vidé
    • la page de démarrage de la base de données est mise à jour avec le LSN de l'enregistrement généré ci-dessus

Les écritures fonctionnent différemment pour les opérations journalisées de manière minimale, voir Opérations pouvant être journalisées de manière minimale . En gros, les opérations enregistrées de façon minimale agissent comme suit (simplifiées):

  • Avant d'insérer des lignes dans une page dans le cadre d'une opération à journalisation minimale, un enregistrement de journal décrivant le fait que la page participe à des opérations à journalisation minimale est généré et ajouté au journal (en mémoire)
  • La page à journalisation minimale est en cours de mise à jour, car de nombreuses insertions y sont écrites si elle convient. Rien n'est enregistré, rien n'est écrit sur le disque.
  • Lorsqu'une opération à journalisation minimale est validée, avant de la valider, toutes les pages ayant participé aux opérations à journalisation minimale dans cette transaction doivent être écrites sur le disque. Onyl une fois cette écriture terminée, l'enregistrement de journal COMMIT peut être ajouté au journal (en mémoire) et et le journal, jusqu'à et y compris cet enregistrement de journal de validation nouvellement ajouté, est vidé (écrit) sur le disque.
Remus Rusanu
la source
8

Lorsqu'une transaction est validée (COMMIT), la transaction est écrite dans le journal des transactions dans la RAM.

Une transaction est écrite dans le journal des transactions avant même de changer la page ou les données comme demandé par la requête. C'est ce que l'on appelle la journalisation en écriture (WAL). Si SQL Server se bloque pendant la mise à jour d'une page en mémoire, WAL garantit que le moteur de base de données peut lire le journal des transactions et annuler la transaction. Il s'agit d'une propriété ACID d'un SGBDR.

Lorsqu'un CHECKPOINT se produit (après un certain temps et / ou certaines transactions et d'autres critères), les transactions entre le dernier CHECKPOINT et le courant sont écrites sur le disque.

Un point de contrôle vide les pages sales du tampon vers le disque. Il se comporte un peu différemment pour tempdb . Une page sale est une page qui a changé depuis sa lecture sur le disque. Ce processus de point de contrôle crée une marque dans le journal des transactions jusqu'au point où les transactions ont été validées. Après un échec, la récupération sait que toutes les transactions jusqu'à cette marque ont été validées. Vous pouvez émettre un point de contrôle manuellement avec une commande TSQL.

Lorsqu'un journal de sauvegarde se produit, les données sont écrites dans le fichier MDF.

Non, lorsque le journal de sauvegarde se produit, SQL Server copie les informations du journal des transactions du fichier journal de la base de données sur le disque sur lequel vous écrivez la sauvegarde. Une opération de sauvegarde lit les données du disque et écrit des données sur le disque.

Je voudrais que vous lisiez les liens ci-dessous

Comprendre la journalisation et la récupération dans SQL Server Déjà signalé par Mark

Livre interne et de dépannage de SQL Server 2008

Architecture et gestion du journal des transactions

Shanky
la source
Ok, ça semble clair. Juste pour être certain: quand un COMMIT se produit, vous dites qu'il est écrit dans le journal des transactions; voulez-vous dire tampon ou disque (LDF)?
Patator du
Il serait toujours écrit dans le cache du journal en premier, puis vidé dans le journal des transactions sur le disque. J'ai ajouté un lien de gestion du journal des transactions, veuillez vous y référer pour savoir comment fonctionne WAL
Shanky
"Si SQL Server se bloque lors de la mise à jour d'une page en mémoire, WAL garantit que le moteur de base de données peut lire le journal des transactions et annuler la transaction." Cela n'est vrai que si la transaction n'est pas validée. S'il est déjà engagé, rien ne peut être annulé. Les informations du journal des transactions sont utilisées pour mettre à jour les fichiers de données. Même si le tampon n'a pas été écrit dans le fichier de données avant le crash.
miracle173
@Miracle: Je suppose que si la page est mise à jour, ce qui est lié à une transaction particulière, bien sûr, la transaction n'aurait pas été validée.
Shanky
4

Ci-dessous clarifiera les choses pour vous:

Lorsqu'une transaction est validée (COMMIT), la transaction est écrite dans le journal des transactions dans la RAM.

  • COMMIT (ou BEGIN) n'a rien à voir avec le modèle de récupération. C'est au niveau de la transaction. Une transaction doit être entièrement terminée ou échouer ( n'oubliez pas les propriétés ACID ). Donc, essentiellement, un COMMIT marquera la fin d'une transaction réussie (implicite ou explicite). Une déclaration COMMIT garantira que toutes les modifications de la transaction seront intégrées de façon permanente à la base de données.
  • Afin d'apporter des modifications, SQL Server utilisera WAL (Write-ahead Logging) dans lequel il décrira d'abord dans le journal toute modification qu'il est sur le point d'apporter, avant de modifier les données.

Lorsqu'un CHECKPOINT se produit (après un certain temps et / ou certaines transactions et d'autres critères), les transactions entre le dernier CHECKPOINT et le courant sont écrites sur le disque.

Lorsqu'un journal de sauvegarde se produit, les données sont écrites dans le fichier MDF.

Faire référence à :

Kin Shah
la source