web-dev-qa-db-fra.com

Lors d'une sauvegarde du journal, les données sont-elles sauvegardées au début ou à la fin de l'opération?

Supposons que j'exécute une sauvegarde de journal et que cette sauvegarde de journal prenne 10 minutes. Pendant cette fenêtre de 10 minutes, d'autres transactions sont exécutées. Dans l'exemple ci-dessous, quelles transactions la sauvegarde du journal contient-elle réellement?

  1. La transaction A est validée
  2. Ouverture de la transaction B
  3. La sauvegarde du journal commence
  4. Ouverture de la transaction C
  5. La transaction B est validée
  6. La sauvegarde du journal est terminée
  7. La transaction C est validée
12
George.Palacios

Le fichier de sauvegarde du journal doit contenir toutes les transactions (y compris celles qui n'ont pas encore été validées) jusqu'au moment où la sauvegarde a fini de s'exécuter et vous pouvez le vérifier comme suit:

CREATE DATABASE MyDB;
ALTER DATABASE MyDB SET RECOVERY FULL;

USE MyDB;
CREATE TABLE LogTest (numbers int);

Une fois la base de données et la table qui seront utilisées sur le test créées, effectuez la première sauvegarde complète afin qu'il soit possible d'effectuer une sauvegarde de journal plus tard.

BACKUP DATABASE MyDB 
TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\MyDB_FULL.bak';

Maintenant qu'une sauvegarde complète a été effectuée, insérons quelques données sur la table:

USE MyDB;

INSERT INTO LogTest(numbers) VALUES (1);

BEGIN TRAN
INSERT INTO LogTest(numbers) VALUES (2);

Notez que le deuxième insert est sous un BEGIN TRAN qui n'a pas encore été engagé. Ensuite, nous utiliserons la fonction [fn_dblog pour vérifier le contenu du fichier journal avant d'effectuer une sauvegarde du journal.

SELECT [Current LSN], [Operation], [SPID], [Transaction Name], [Begin Time], [End Time] FROM fn_dblog(NULL, NULL);

Sur l'image, nous pouvons voir les LSN liés aux premier et deuxième INSERT

First Query result

BACKUP LOG MyDB 
TO DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\MyDB_LOG.trn';

Une sauvegarde du journal a été effectuée et nous pouvons lire son contenu avec la fonction fn_dump_dblog en utilisant la requête suivante:

SELECT [Current LSN], [Transaction ID], [Transaction Name], [Operation], [Begin Time] 
FROM fn_dump_dblog (NULL, NULL, N'DISK', 1, N'C:\Program Files\Microsoft SQL Server\MSSQL14.SQL2017\MSSQL\Backup\MyDB_LOG.trn',
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT,
DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT);

Second Query result

Comme nous pouvons le voir, ces LSN liés à la transaction inachevée sont en fait dans la sauvegarde du journal des transactions même s'ils n'ont pas été validés. Le hic, c'est que Microsoft dit

Le journal des transactions est un composant essentiel de la base de données. En cas de défaillance du système, vous aurez besoin de ce journal pour ramener votre base de données à un état cohérent.

Par conséquent, après avoir effectué une restauration de cette sauvegarde de journal, les données liées à ces transactions inachevées seront restaurées pour conserver la base de données dans un état cohérent . Vous pouvez considérer comme sûres (peuvent être restaurées) toutes les transactions qui ont été validées. Il peut être vérifié en supprimant la base de données MyDB et en restaurant les sauvegardes générées avec les étapes ci-dessus.

12
Ronaldo

Le journal des transactions contient toutes les transactions qui ont été entièrement validées au moment où le journal des transactions se termine.

Pour utiliser votre exemple ci-dessus, le journal des transactions contient A et B. Ceci est similaire à la sauvegarde complète, qui contient une sauvegarde du journal de fin de toutes les transactions qui ont été validées à la fin de la sauvegarde.

Ce site est une excellente lecture complémentaire. https://sqlbak.com/academy/transaction-log-backup

6
Jonathan Fite