J'ai essayé l'expérience suivante et obtenu des résultats similaires. Dans les deux cas, fn_dblog () montre que la restauration se produit et semble se produire plus rapidement dans le scénario 2 que dans le scénario 1.
Au fait, j'ai placé le MDF et le LDF sur le même disque externe (USB 2.0).
Ma conclusion initiale est qu'il n'y a pas de différence dans le fonctionnement de la restauration dans ce cas, et probablement toute différence de vitesse apparente est liée au sous-système d'E / S. Ce n'est que mon hypothèse de travail pour le moment.
Scénario 1:
- Créez une base de données avec un fichier journal qui commence à 1 Mo, se développe en morceaux de 4 Mo et a une taille maximale de 100 Mo.
- Ouvrez une transaction explicite, exécutez-la pendant 10 secondes, puis annulez-la manuellement dans SSMS
- Regardez le nombre fn_dblog () et la taille de la réserve de journal et consultez DBCC SQLPERF (LOGSPACE)
Scénario 2:
- Créez une base de données avec un fichier journal qui commence à 1 Mo, se développe en morceaux de 4 Mo et a une taille maximale de 100 Mo.
- Ouvrez une transaction explicite, exécutez-la jusqu'à ce que le journal soit plein, une erreur apparaît
- Regardez le nombre fn_dblog () et la taille de la réserve de journal et consultez DBCC SQLPERF (LOGSPACE)
Résultats du moniteur de performances:
Scénario 1:
Scénario 2:
Code:
UTILISER [maître];
ALLER
SI DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
COMMENCER
ALTER DATABASE [SampleDB] SET SINGLE_USER
AVEC ROLLBACK IMMÉDIATE;
DROP DATABASE [SampleDB];
FIN;
ALLER
CRÉER UNE BASE DE DONNÉES [SampleDB] SUR PRIMARY
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, TAILLE = 3MB
, FILEGROWTH = 1MB
)
SE CONNECTER
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, SIZE = 1MB
, MAXSIZE = 100 Mo
, FILEGROWTH = 4MB
);
ALLER
USE [SampleDB];
ALLER
- Ajouter une table
CRÉER LA TABLE dbo.test
(
c1 CHAR (8000) NON NULL REPLICATE DEFAULT ('a', 8000)
) LE [PRIMAIRE];
ALLER
- Assurez-vous que nous ne sommes pas un modèle de récupération pseudo-simple
BASE DE DONNÉES DE SAUVEGARDE SampleDB
TO DISK = 'NUL';
ALLER
- Sauvegarder le fichier journal
JOURNAL DE SAUVEGARDE SampleDB
TO DISK = 'NUL';
ALLER
- Cochez l'espace de journal utilisé
DBCC SQLPERF (LOGSPACE);
ALLER
- Combien d'enregistrements sont visibles avec fn_dblog ()?
SELECT * FROM fn_dblog (NULL, NULL); - Environ 9 dans mon cas
/ **********************************
SCÉNARIO 1
********************************** /
- Ouvrez une nouvelle transaction puis annulez-la
COMMENCER LA TRANSACTION
INSÉRER DANS dbo.test VALEURS PAR DÉFAUT;
GO 10000 - Let est exécuté pendant 10 secondes, puis appuyez sur Annuler dans la fenêtre de requête SSMS
- Annuler la transaction
- Cela devrait prendre quelques secondes pour terminer
- Pas besoin d'annuler la transaction, car l'annulation l'a déjà fait pour vous.
- Essayez-le. Vous obtiendrez cette erreur
- Msg 3903, niveau 16, état 1, ligne 1
- La demande ROLLBACK TRANSACTION n'a pas de BEGIN TRANSACTION correspondante.
TRANSACTION ROLLBACK;
- Quel est l'espace journal utilisé? Au-dessus de 100%.
DBCC SQLPERF (LOGSPACE);
ALLER
- Combien d'enregistrements sont visibles avec fn_dblog ()?
SELECT *
FROM fn_dblog (NULL, NULL); - Environ 91 926 dans mon cas
- Réserve totale de journaux affichée par fn_dblog ()?
SELECT SUM ([Log Reserve]) AS [Total Log Reserve]
FROM fn_dblog (NULL, NULL); - Environ 88,72 Mo
/ **********************************
SCÉNARIO 2
********************************** /
- Soufflez la DB et recommencez
UTILISER [maître];
ALLER
SI DATABASEPROPERTYEX (N'SampleDB ', N'Version')> 0
COMMENCER
ALTER DATABASE [SampleDB] SET SINGLE_USER
AVEC ROLLBACK IMMÉDIATE;
DROP DATABASE [SampleDB];
FIN;
ALLER
CRÉER UNE BASE DE DONNÉES [SampleDB] SUR PRIMARY
(
NAME = N'SampleDB '
, FILENAME = N'E: \ data \ SampleDB.mdf '
, TAILLE = 3MB
, FILEGROWTH = 1MB
)
SE CONNECTER
(
NAME = N'SampleDB_log '
, FILENAME = N'E: \ data \ SampleDB_log.ldf '
, SIZE = 1MB
, MAXSIZE = 100 Mo
, FILEGROWTH = 4MB
);
ALLER
USE [SampleDB];
ALLER
- Ajouter une table
CRÉER LA TABLE dbo.test
(
c1 CHAR (8000) NON NULL REPLICATE DEFAULT ('a', 8000)
) LE [PRIMAIRE];
ALLER
- Assurez-vous que nous ne sommes pas un modèle de récupération pseudo-simple
BASE DE DONNÉES DE SAUVEGARDE SampleDB
TO DISK = 'NUL';
ALLER
- Sauvegarder le fichier journal
JOURNAL DE SAUVEGARDE SampleDB
TO DISK = 'NUL';
ALLER
- Maintenant, explosons le fichier journal dans notre transaction
COMMENCER LA TRANSACTION
INSÉRER DANS dbo.test VALEURS PAR DÉFAUT;
GO 10000
- Le rollback ne se déclenche jamais. Essayez-le. Vous obtiendrez une erreur.
- Msg 3903, niveau 16, état 1, ligne 1
- La demande ROLLBACK TRANSACTION n'a pas de BEGIN TRANSACTION correspondante.
TRANSACTION ROLLBACK;
- Le fichier journal est-il plein à 100%?
DBCC SQLPERF (LOGSPACE);
- Combien d'enregistrements sont visibles avec fn_dblog ()?
SELECT *
FROM fn_dblog (NULL, NULL); - Environ 91 926 dans mon cas
ALLER
- Réserve totale de journaux affichée par fn_dblog ()?
SELECT SUM ([Log Reserve]) AS [Total Log Reserve]
FROM fn_dblog (NULL, NULL); - 88,72 Mo
ALLER