För förra månadens T-SQL-tisdag skrev jag om några odokumenterade spårningsflaggor som hjälper dig att vara barnvakt under långvariga backup- och återställningsoperationer. Den här månaden är Jes Borlands ämne Extended Events, och jag tänkte visa nya funktioner i SQL Server 2016 som till stor del gör dessa spårningsflaggor föråldrade.
Om du spelar med CTP2 (du kan ladda ner det här), kanske du märker en ny kategori backup_restore
och ny händelse backup_restore_progress_trace
:
Upptäcker en ny händelse i CTP2:s dialogruta för ny session
Här är en snabb och smutsig XE-session för att fånga data för den här händelsen (jag har lagt till kommentarer för att filtrera endast till säkerhetskopiering eller endast återställning; som standard ingår båda):
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
Låt oss nu säga att jag kör följande operationer – skapa en databas, säkerhetskopiera lite data, släpp den och återställ den:
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;
Nu kan vi fråga efter data från händelsemålfilen:
;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;
För en säkerhetskopia undertrycker inte spårningsflaggan 3226 någon av utdata som fångas av utökade händelser. Jag har utelämnat utdatakolumner, på grund av filtren, för korthetens skull:
Meddelande | Längd (Millisekunder) |
---|---|
BACKUP DATABAS startade | 0 |
Öppna databasen med S lock | 0 |
Hämtar bulk-op-lås på databasen | 0 |
Synkronisering med andra operationer i databasen är klar | 19 |
Öppna säkerhetskopieringsmediet | 7 |
Säkerhetskopieringsmediet är öppet | 0 |
Förbereder mediauppsättningen för skrivning | 0 |
Medieuppsättningen är klar för säkerhetskopiering | 0 |
Effektiva alternativ:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB | 0 |
Rensa differentiella bitmappar | 4 |
Differentiella bitmappar rensas | 0 |
Skriva en kontrollpunkt | 6 |
Kontrollpunkten är klar (förfluten =6 ms) | 0 |
Starta LSN:101:111920:43, SERepl LSN:0:0:0 | 0 |
Skanna tilldelningsbitmappar | 4 |
Skanning av allokeringsbitmappar är klar | 0 |
Beräknar förväntad storlek på total data | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TotalSize=658440192 byte | 0 |
Uppskattad total storlek =658460672 byte (datastorlek =658440192 byte, loggstorlek =20480 byte) | 0 |
Arbetsuppskattningen är klar | 0 |
Senaste LSN:101:111960:1 | 0 |
Skriva ledande metadata | 0 |
BackupStream(0):Skriver ledande metadata till enheten c:\temp\floob.bak | 1 |
Beräknar förväntad storlek på total data | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TotalSize=658440192 byte | 1 |
Kopiera datafiler | 2 |
Antal datafilläsare =1 | 0 |
Läser datafilen D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf | 0 |
BackupStream(0):Skriver MSDA i storlek 10048 | 391 |
30 procent (198180864/658460672 byte) bearbetade | 554 |
60 procent (395313152/658460672 byte) behandlade | 576 |
90 procent (593494016/658460672 byte) behandlade | 184 |
Slutförd läsning av datafilen D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf | 2 |
BackupStream(0):Utfyllnad MSDA med 65536 byte | 0 |
BackupStream(0):Total MSDA-storlek =10048 omfattningar | 0 |
InitialExpectedSize=658440192 byte, FinalSize=658440192 byte, ExcessMode=0 | 0 |
Senaste LSN:101:111960:1 | 0 |
Kopieringen av datafiler är klar | 0 |
Kopierar transaktionslogg | 0 |
MediaFamily(0):FID=2, VLFID=101, DataStreamSize=65536 byte | 4 |
Kopieringen av transaktionsloggen är klar | 0 |
Skriva efterföljande metadata | 0 |
BackupStream(0):Skriver efterföljande metadata till enheten c:\temp\floob.bak | 0 |
Skriver slutet av säkerhetskopieringsuppsättningen | 30 |
Skriva historikposter | 12 |
Skrivningen av historikposter är klar (förfluten =11 ms) | 0 |
BACKUP DATABAS avslutad | 0 |
Händelsedata för en säkerhetskopiering
För en återställning kommer du att se dessa rader:
Meddelande | Längd (Millisekunder) |
---|---|
ÅTERSTÄLLNING DATABAS startade | 0 |
Öppna säkerhetskopian | 3 |
Bearbetar ledande metadata | 0 |
Planeringen börjar | 23 |
Effektiva alternativ:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB | 0 |
Planeringen är klar | 0 |
Börjar OFFLINE-återställning | 0 |
Bifogad databas som DB_ID=5 | 1 |
Förbereder behållare | 534 |
Behållarna är klara | 1097 |
Återställer säkerhetskopian | 0 |
Uppskattad total storlek att överföra =658460672 byte | 0 |
Överföra data | 1 |
BackupStream(0):Bearbetar MSDA av storlek 10048 | 3282 |
BackupStream(0):Slutförd MSDA | 0 |
Väntar på att loggnollningen ska slutföras | 3 |
Loggnollställning är klar | 0 |
BackupStream(0):Bearbetar MSTL (FID=2, VLFID=101, storlek=65536 byte) | 1024 |
Dataöverföringen är klar | 14 |
Säkerhetskopiering har återställts | 45 |
Offline rollforward börjar | 1 |
Bearbetar 68 VLF-rubriker | 69 |
Bearbetningen av VLF-rubriker är klar | 11 |
Första LSN:101:111920:43, Senaste LSN:101:111960:1 | 0 |
Stopp LSN:101:111960:1 | 4 |
Offline roll-forward är klar | 17 |
Databaskorrigeringen är klar | 2 |
Övergång av databas till ONLINE | 2 |
Startar om databasen för ONLINE | 87 |
PostRestoreContainerFixups börjar | 5 |
PostRestoreContainerFixups är klar | 2 |
PostRestoreReplicationFixup börjar | 107 |
PostRestoreReplicationFixup är klar | 2 |
Databasen startas om | 9 |
Återuppta alla stoppade fulltextgenomsökningar | 6 |
Skriva historikposter | 13 |
Skrivningen av historikposter är klar (förfluten =13 ms) | 2 |
MSDB-underhållet är klart | 2 |
ÅTERSTÄLLNING AV DATABAS slutförd | 0 |
Händelsedata för en återställning
Om du felsöker en långsam säkerhetskopiering eller återställning kan du enkelt filtrera på varaktigheten, så att du till exempel bara ser händelser som tog längre tid än n millisekunder. Det enda jag inte ser i denna utdata är något sätt att avgöra om omedelbar filinitiering var i kraft under återställningen – du kan fortfarande behöva spårningsflagga 3004, som beskrivs i mitt inlägg för förra månadens T-SQL-tisdag.
Glöm inte att stoppa sessionen (men behåll gärna sessionsdefinitionen på servern så att du kan använda den igen):
ALTER EVENT SESSION [Backup progress] ON SERVER STATE = STOP;
Jag utförde inga prestandatester eller konsekvensanalyser, men generellt sett skulle jag säga att – som spårningsflaggor – detta inte är något du vill köra hela tiden, utan bara när du felsöker en specifik operation. Det är lite lättare att ställa in den här sessionen och fråga efter data, IMHO, än att aktivera spårningsflaggor och analysera all utdata från SQL Servers fellogg.