Database
 sql >> Datenbank >  >> RDS >> Database

T-SQL Dienstag Nr. 67:Neue erweiterte Sicherungs- und Wiederherstellungsereignisse

Für den T-SQL-Dienstag des letzten Monats habe ich über einige undokumentierte Trace-Flags geschrieben, die Ihnen helfen, lang andauernde Sicherungs- und Wiederherstellungsvorgänge zu babysitten. In diesem Monat lautet das Thema von Jes Borland Erweiterte Ereignisse, und ich dachte, ich würde neue Funktionen in SQL Server 2016 zeigen, die diese Ablaufverfolgungsflags weitgehend überflüssig machen.

Wenn Sie mit CTP2 spielen (Sie können es hier herunterladen), bemerken Sie möglicherweise eine neue Kategorie backup_restore und neues Ereignis backup_restore_progress_trace :

Erkennen eines neuen Ereignisses im Dialogfeld „Neue Sitzung“ von CTP2

Hier ist eine schnelle und schmutzige XE-Sitzung zum Erfassen der Daten für dieses Ereignis (ich habe Kommentare zum Filtern nur nach Sicherungs- oder nur Wiederherstellungsvorgängen hinzugefügt; standardmäßig sind beide enthalten):

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

Nehmen wir nun an, ich führe die folgenden Operationen aus – erstelle eine Datenbank, speichere ein paar Daten, lösche sie und stelle sie wieder her:

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;

Jetzt können wir die Daten aus der Ereigniszieldatei abfragen:

;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;

Bei einer Sicherung unterdrückt das Ablaufverfolgungsflag 3226 keine der von Extended Events erfassten Ausgaben. Ich habe die Ausgabespalten aufgrund der Filter der Kürze halber weggelassen:

Nachricht Dauer
(Millisekunden)
DATENBANK-SICHERUNG gestartet 0
Öffnen der Datenbank mit S-Lock 0
Bulk-Op-Sperre für die Datenbank wird angefordert 0
Die Synchronisierung mit anderen Vorgängen in der Datenbank ist abgeschlossen 19
Öffnen des Sicherungsmediensatzes 7
Der Sicherungsmediensatz ist geöffnet 0
Vorbereiten des Mediensatzes zum Schreiben 0
Der Mediensatz ist bereit für die Sicherung 0
Effektive Optionen:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB 0
Differential-Bitmaps löschen 4
Differenzielle Bitmaps werden gelöscht 0
Schreiben eines Checkpoints 6
Checkpoint ist abgeschlossen (verstrichen =6 ms) 0
Start-LSN:101:111920:43, SERepl-LSN:0:0:0 0
Zuweisungs-Bitmaps scannen 4
Das Scannen der Zuordnungs-Bitmaps ist abgeschlossen 0
Berechnen der erwarteten Größe der Gesamtdaten 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 Byte 0
Geschätzte Gesamtgröße =658460672 Byte (Datengröße =658440192 Byte, Protokollgröße =20480 Byte) 0
Arbeitsschätzung ist abgeschlossen 0
Letzte LSN:101:111960:1 0
Schreiben der führenden Metadaten 0
BackupStream(0):Schreiben führender Metadaten auf das Gerät c:\temp\floob.bak 1
Berechnen der erwarteten Größe der Gesamtdaten 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 Byte 1
Kopieren von Datendateien 2
Anzahl der Datendateileser =1 0
Lesen der Datendatei D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf 0
BackupStream(0):Schreiben von MSDA mit Extents der Größe 10048 391
30 Prozent (198180864/658460672 Byte) verarbeitet 554
60 Prozent (395313152/658460672 Byte) verarbeitet 576
90 Prozent (593494016/658460672 Byte) verarbeitet 184
Lesen der Datendatei D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf abgeschlossen 2
BackupStream(0):MSDA mit 65536 Byte auffüllen 0
BackupStream(0):MSDA-Gesamtgröße =10048 Extents 0
InitialExpectedSize=658440192 Bytes, FinalSize=658440192 Bytes, ExcessMode=0 0
Letzte LSN:101:111960:1 0
Das Kopieren der Datendateien ist abgeschlossen 0
Transaktionsprotokoll kopieren 0
MediaFamily(0):FID=2, VLFID=101, DataStreamSize=65536 Bytes 4
Das Kopieren des Transaktionsprotokolls ist abgeschlossen 0
Schreiben der abschließenden Metadaten 0
BackupStream(0):Schreiben von abschließenden Metadaten auf das Gerät c:\temp\floob.bak 0
Schreiben des Endes des Sicherungssatzes 30
Verlaufsaufzeichnungen schreiben 12
Das Schreiben von Verlaufsdatensätzen ist abgeschlossen (verstrichen =11 ms) 0
SICHERN DER DATENBANK fertig 0

Ereignisdaten für einen Sicherungsvorgang

Bei einer Wiederherstellung sehen Sie diese Zeilen:

Nachricht Dauer
(Millisekunden)
DATENBANK WIEDERHERSTELLEN gestartet 0
Öffnen des Sicherungssatzes 3
Verarbeitung der führenden Metadaten 0
Die Planung beginnt 23
Effektive Optionen:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB 0
Die Planung ist abgeschlossen 0
Offline-Wiederherstellung beginnen 0
Angehängte Datenbank als DB_ID=5 1
Container vorbereiten 534
Container stehen bereit 1097
Wiederherstellen des Sicherungssatzes 0
Geschätzte Gesamtgröße für die Übertragung =658460672 Bytes 0
Datenübertragung 1
BackupStream(0):Verarbeitet MSDA der Größe 10048 Extents 3282
BackupStream(0):MSDA abgeschlossen 0
Warten auf Abschluss der Nullung des Protokolls 3
Die Nullung des Protokolls ist abgeschlossen 0
BackupStream(0):Verarbeitung von MSTL (FID=2, VLFID=101, Größe=65536 Bytes) 1024
Die Datenübertragung ist abgeschlossen 14
Sicherungssatz wird wiederhergestellt 45
Rollforward offline beginnt 1
Verarbeitung von 68 VLF-Headern 69
Die Verarbeitung der VLF-Header ist abgeschlossen 11
Erste LSN:101:111920:43, Letzte LSN:101:111960:1 0
Stopp-LSN:101:111960:1 4
Offline-Rollforward ist abgeschlossen 17
Die Datenbankkorrektur ist abgeschlossen 2
Umstellung der Datenbank auf ONLINE 2
Neustart der Datenbank für ONLINE 87
PostRestoreContainerFixups beginnt 5
PostRestoreContainerFixups ist abgeschlossen 2
PostRestoreReplicationFixup beginnt 107
PostRestoreReplicationFixup ist abgeschlossen 2
Datenbank wird neu gestartet 9
Wiederaufnahme angehaltener Volltext-Crawls 6
Verlaufsaufzeichnungen schreiben 13
Das Schreiben von Verlaufsdatensätzen ist abgeschlossen (verstrichen =13 ms) 2
Die MSDB-Wartung ist abgeschlossen 2
DATENBANK WIEDERHERSTELLEN beendet 0

Ereignisdaten für einen Wiederherstellungsvorgang

Wenn Sie einen langsamen Sicherungs- oder Wiederherstellungsvorgang beheben, können Sie einfach nach der Dauer filtern, sodass Sie beispielsweise nur Ereignisse sehen, die länger als n Millisekunden gedauert haben. Das einzige, was ich in dieser Ausgabe nicht sehe, ist eine Möglichkeit festzustellen, ob die sofortige Dateiinitialisierung während der Wiederherstellung wirksam war – möglicherweise benötigen Sie dennoch das Ablaufverfolgungsflag 3004, wie in meinem Post für den T-SQL-Dienstag des letzten Monats beschrieben. P>

Vergessen Sie nicht, die Sitzung zu beenden (aber Sie können die Sitzungsdefinition gerne auf dem Server behalten, damit Sie sie erneut verwenden können):

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

Ich habe keine Leistungstests oder Auswirkungsanalysen durchgeführt, aber im Allgemeinen würde ich sagen, dass dies – wie die Trace-Flags – nicht ständig ausgeführt werden sollte, sondern nur bei der Fehlerbehebung bei einem bestimmten Vorgang. Es ist meiner Meinung nach etwas einfacher, diese Sitzung einzurichten und die Daten abzufragen, als die Trace-Flags einzuschalten und die gesamte Ausgabe des Fehlerprotokolls von SQL Server zu parsen.