Database
 sql >> Base de données >  >> RDS >> Database

T-SQL Tuesday #67 :Nouveaux événements étendus de sauvegarde et de restauration

Pour le mardi T-SQL du mois dernier, j'ai écrit sur certains indicateurs de trace non documentés qui vous aident à surveiller les opérations de sauvegarde et de restauration de longue durée. Ce mois-ci, le sujet de Jes Borland est les événements étendus, et j'ai pensé montrer de nouvelles fonctionnalités dans SQL Server 2016 qui rendent en grande partie ces indicateurs de trace obsolètes.

Si vous jouez avec CTP2 (vous pouvez le télécharger ici), vous remarquerez peut-être une nouvelle catégorie backup_restore et nouvel événement backup_restore_progress_trace :

Découverte d'un nouvel événement dans la boîte de dialogue Nouvelle session de CTP2

Voici une session XE rapide et sale pour capturer les données de cet événement (j'ai ajouté des commentaires pour filtrer uniquement les opérations de sauvegarde ou de restauration ; par défaut, les deux sont inclus) :

CREATE EVENT SESSION [Backup progress] ON SERVER 
ADD EVENT sqlserver.backup_restore_progress_trace
(
    ACTION(package0.event_sequence)
 
    -- to only capture backup operations:
    --WHERE [operation_type] = 0
 
    -- to only capture restore operations:
    --WHERE [operation_type] = 1 
)
ADD TARGET package0.event_file 
(
  SET filename = N'C:\temp\BackupProgress.xel'
); -- default options are probably ok
GO
 
ALTER EVENT SESSION [Backup progress] ON SERVER STATE = START;
GO

Maintenant, disons que j'exécute les opérations suivantes :créer une base de données, sauvegarder un peu de données, la supprimer et la restaurer :

USE [master];
GO
CREATE DATABASE floob;
GO
SELECT s1.* INTO floob.dbo.what 
  FROM sys.all_objects AS s1 
  CROSS JOIN sys.all_objects;
GO
BACKUP DATABASE floob TO DISK = 'c:\temp\floob.bak' 
  WITH INIT, COMPRESSION, STATS = 30;
GO
DROP DATABASE floob;
GO
RESTORE DATABASE floob FROM DISK = 'c:\temp\floob.bak' 
  WITH REPLACE, RECOVERY;

Maintenant, nous pouvons interroger les données du fichier cible de l'événement :

;WITH x AS 
(
  SELECT ts,op,db,msg,es
  FROM 
  (
   SELECT 
    ts  = x.value(N'(event/@timestamp)[1]', N'datetime2'),
    op  = x.value(N'(event/data[@name="operation_type"]/text)[1]', N'nvarchar(32)'),
    db  = x.value(N'(event/data[@name="database_name"])[1]', N'nvarchar(128)'),
    msg = x.value(N'(event/data[@name="trace_message"])[1]', N'nvarchar(max)'),
    es  = x.value(N'(event/action[@name="event_sequence"])[1]', N'int')
   FROM 
   (
    SELECT x = CONVERT(XML, event_data) 
     FROM sys.fn_xe_file_target_read_file
          (N'c:\temp\Backup--Progress*.xel', NULL, NULL, NULL)
   ) AS y
  ) AS x 
  WHERE op = N'Backup' -- N'Restore'
  AND db = N'floob'
  AND ts > CONVERT(DATE, SYSUTCDATETIME())
)
SELECT /* x.db, x.op, x.ts, */ 
  [Message] = x.msg, 
  Duration = COALESCE(DATEDIFF(MILLISECOND, x.ts, 
             LEAD(x.ts, 1) OVER(ORDER BY es)),0)
FROM x
ORDER BY es;

Pour une sauvegarde, l'indicateur de trace 3226 ne supprime aucune des sorties capturées par les événements étendus. J'ai omis les colonnes de sortie, en raison des filtres, par souci de brièveté :

Message Durée
(Millisecondes)
SAUVEGARDE DE LA BASE DE DONNÉES démarrée 0
Ouvrir la base de données avec le verrou S 0
Acquérir un verrou d'opération en bloc sur la base de données 0
La synchronisation avec d'autres opérations sur la base de données est terminée 19
Ouverture du jeu de supports de sauvegarde 7
Le jeu de supports de sauvegarde est ouvert 0
Préparer le jeu de médias pour l'écriture 0
Le jeu de médias est prêt pour la sauvegarde 0
Options effectives :Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 Ko 0
Effacer les bitmaps différentiels 4
Les bitmaps différentiels sont effacés 0
Écrire un point de contrôle 6
Le point de contrôle est terminé (écoulé =6 ms) 0
LSN de début :101:111920:43, LSN de remplacement SE :0:0:0 0
Analyse des bitmaps d'allocation 4
La numérisation des bitmaps d'allocation est terminée 0
Calcul de la taille attendue des données totales 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 octets 0
Taille totale estimée =658460672 octets (taille des données =658440192 octets, taille du journal =20480 octets) 0
L'estimation du travail est terminée 0
Dernier LSN :101:111960:1 0
Rédaction des métadonnées principales 0
BackupStream(0) :écriture des métadonnées principales sur l'appareil c:\temp\floob.bak 1
Calcul de la taille attendue des données totales 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 octets 1
Copier des fichiers de données 2
Nombre de lecteurs de fichiers de données =1 0
Lecture du fichier de données D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf 0
BackupStream(0) :écriture de MSDA de taille 10048 extensions 391
30 % (198180864/658460672 octets) traités 554
60 % (395313152/658460672 octets) traités 576
90 % (593494016/658460672 octets) traités 184
Lecture du fichier de données D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf terminée 2
BackupStream(0) :Remplissage MSDA avec 65 536 octets 0
BackupStream(0) :taille MSDA totale =10 048 extensions 0
InitialExpectedSize=658440192 octets, FinalSize=658440192 octets, ExcessMode=0 0
Dernier LSN :101:111960:1 0
La copie des fichiers de données est terminée 0
Copie du journal des transactions 0
MediaFamily(0) :FID=2, VLFID=101, DataStreamSize=65536 octets 4
La copie du journal des transactions est terminée 0
Écriture des métadonnées de fin 0
BackupStream(0) :écriture des métadonnées de fin sur l'appareil c:\temp\floob.bak 0
Écriture de la fin du jeu de sauvegarde 30
Écrire des enregistrements d'historique 12
L'écriture des enregistrements de l'historique est terminée (écoulé =11 ms) 0
SAUVEGARDE DE LA BASE DE DONNÉES terminée 0

Données d'événement pour une opération de sauvegarde

Pour une restauration, vous verrez ces lignes :

Message Durée
(Millisecondes)
RESTAURATION DE LA BASE DE DONNÉES démarrée 0
Ouverture du jeu de sauvegarde 3
Traitement des métadonnées principales 0
La planification commence 23
Options effectives :Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 Ko 0
La planification est terminée 0
Démarrage de la restauration HORS LIGNE 0
Base de données jointe en tant que DB_ID=5 1
Préparation des conteneurs 534
Les conteneurs sont prêts 1097
Restauration du jeu de sauvegarde 0
Taille totale estimée à transférer =658460672 octets 0
Transférer des données 1
BackupStream(0) :traitement de la MSDA de taille 10 048 extensions 3282
BackupStream(0) :MSDA terminée 0
Attente de la fin de la mise à zéro du journal 3
La mise à zéro du journal est terminée 0
BackupStream(0) :traitement de MSTL (FID=2, VLFID=101, taille=65536 octets) 1024
Le transfert de données est terminé 14
Le jeu de sauvegarde est restauré 45
Le roll-forward hors ligne commence 1
Traitement de 68 en-têtes VLF 69
Le traitement des en-têtes VLF est terminé 11
Premier LSN :101:111920:43, Dernier LSN :101:111960:1 0
Arrêter LSN :101:111960:1 4
Le roll-forward hors ligne est terminé 17
La correction de la base de données est terminée 2
Transition de la base de données vers ONLINE 2
Redémarrage de la base de données pour ONLINE 87
PostRestoreContainerFixups commence 5
PostRestoreContainerFixups est terminé 2
PostRestoreReplicationFixup commence 107
PostRestoreReplicationFixup est terminé 2
La base de données est redémarrée 9
Reprise des explorations de texte intégral interrompues 6
Écrire des enregistrements d'historique 13
L'écriture des enregistrements d'historique est terminée (écoulé =13 ms) 2
La maintenance de la MSDB est terminée 2
RESTAURATION DE LA BASE DE DONNÉES terminée 0

Données d'événement pour une opération de restauration

Si vous dépannez une opération de sauvegarde ou de restauration lente, vous pouvez facilement filtrer sur la durée, de sorte que vous ne voyez que les événements qui ont pris plus de n millisecondes, par exemple. La seule chose que je ne vois pas dans cette sortie est un moyen de savoir si l'initialisation instantanée du fichier était en vigueur lors de la restauration - vous aurez peut-être encore besoin de l'indicateur de trace 3004, comme décrit dans mon article du mardi T-SQL du mois dernier.

N'oubliez pas d'arrêter la session (mais n'hésitez pas à conserver la définition de la session sur le serveur, afin de pouvoir la réutiliser) :

ALTER EVENT SESSION [Backup progress] ON SERVER STATE = STOP;

Je n'ai effectué aucun test de performance ni analyse d'impact, mais en général, je dirais que - comme les indicateurs de trace - ce n'est pas quelque chose que vous voudriez exécuter tout le temps, mais uniquement lors du dépannage d'une opération spécifique. Il est un peu plus facile de configurer cette session et d'interroger les données, à mon humble avis, que d'activer les indicateurs de trace et d'analyser toute la sortie du journal des erreurs de SQL Server.