Til sidste måneds T-SQL-tirsdag skrev jeg om nogle udokumenterede sporingsflag, der hjælper dig med at passe på langvarige backup- og gendannelsesoperationer. Denne måned er Jes Borlands emne Extended Events, og jeg tænkte, at jeg ville vise nye muligheder i SQL Server 2016, der stort set gør disse sporingsflag forældede.
Hvis du spiller med CTP2 (du kan downloade det her), vil du muligvis bemærke en ny kategori backup_restore
og ny hændelse backup_restore_progress_trace
:
Opdagelse af en ny begivenhed i CTP2's dialogboks Ny session
Her er en hurtig og beskidt XE-session til at fange dataene for denne begivenhed (jeg har tilføjet kommentarer til filtrering til kun at tage backup eller kun gendannelsesoperationer; som standard er begge inkluderet):
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
Lad os nu sige, at jeg kører følgende operationer – opret en database, læg en smule data tilbage, slip den og gendan 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 forespørge dataene fra begivenhedsmå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;
For en sikkerhedskopi undertrykker sporingsflag 3226 ikke noget af det output, der fanges af udvidede hændelser. Jeg har udeladt outputkolonner på grund af filtrene for kortheds skyld:
Besked | Varighed (millisekunder) |
---|---|
BACKUP DATABASE startede | 0 |
Åbning af databasen med S lock | 0 |
Anskaffelse af bulk-op-lås på databasen | 0 |
Synkronisering med andre operationer på databasen er fuldført | 19 |
Åbning af sikkerhedskopieringsmediesættet | 7 |
Sikkerhedskopieringsmediesættet er åbent | 0 |
Forberedelse af mediesættet til skrivning | 0 |
Mediesættet er klar til sikkerhedskopiering | 0 |
Effektive muligheder:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB | 0 |
Sletning af differentielle bitmaps | 4 |
Differentielle bitmaps ryddes | 0 |
Skriv et kontrolpunkt | 6 |
Checkpoint er gennemført (forløbet =6 ms) | 0 |
Start LSN:101:111920:43, SERepl LSN:0:0:0 | 0 |
Scanning af allokeringsbitmaps | 4 |
Scanning af allokeringsbitmaps er fuldført | 0 |
Beregning af forventet størrelse af samlede data | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TotalSize=658440192 bytes | 0 |
Estimeret samlet størrelse =658460672 bytes (datastørrelse =658440192 bytes, logstørrelse =20480 bytes) | 0 |
Arbejdsestimering er fuldført | 0 |
Sidste LSN:101:111960:1 | 0 |
Skrivning af de førende metadata | 0 |
BackupStream(0):Skrivning af førende metadata til enheden c:\temp\floob.bak | 1 |
Beregning af forventet størrelse af samlede data | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TotalSize=658440192 bytes | 1 |
Kopiering af datafiler | 2 |
Antal datafillæsere =1 | 0 |
Læsning af datafilen D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf | 0 |
BackupStream(0):Skrivning af MSDA i størrelse 10048 | 391 |
30 procent (198180864/658460672 bytes) behandlet | 554 |
60 procent (395313152/658460672 bytes) behandlet | 576 |
90 procent (593494016/658460672 bytes) behandlet | 184 |
Fuldført læsning af datafilen D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf | 2 |
BackupStream(0):Udfyldning af MSDA med 65536 bytes | 0 |
BackupStream(0):Samlet MSDA-størrelse =10048 omfang | 0 |
InitialExpectedSize=658440192 bytes, FinalSize=658440192 bytes, ExcessMode=0 | 0 |
Sidste LSN:101:111960:1 | 0 |
Kopiering af datafiler er fuldført | 0 |
Kopierer transaktionslog | 0 |
MediaFamily(0):FID=2, VLFID=101, DataStreamSize=65536 bytes | 4 |
Kopiering af transaktionslog er fuldført | 0 |
Skrivning af de efterfølgende metadata | 0 |
BackupStream(0):Skrivning af efterfølgende metadata til enheden c:\temp\floob.bak | 0 |
Skriver slutningen af sikkerhedskopieringssættet | 30 |
Skriv historikposter | 12 |
Skrivning af historieregistreringer er fuldført (forløbet =11 ms) | 0 |
BACKUP DATABASE afsluttet | 0 |
Hændelsesdata til en sikkerhedskopiering
For en gendannelse vil du se disse rækker:
Besked | Varighed (millisekunder) |
---|---|
RESTORE DATABASE startede | 0 |
Åbning af sikkerhedskopieringssættet | 3 |
Behandling af de førende metadata | 0 |
Planlægningen begynder | 23 |
Effektive muligheder:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB | 0 |
Planlægningen er fuldført | 0 |
Begynder OFFLINE-gendannelse | 0 |
Vedhæftet database som DB_ID=5 | 1 |
Forberedelse af beholdere | 534 |
Beholdere er klar | 1097 |
Gendannelse af sikkerhedskopieringssættet | 0 |
Estimeret samlet størrelse til overførsel =658460672 bytes | 0 |
Overførsel af data | 1 |
BackupStream(0):Behandler MSDA i størrelse 10048 | 3282 |
BackupStream(0):Fuldført MSDA | 0 |
Venter på, at log-nulstilling er fuldført | 3 |
Nulstilling af log er fuldført | 0 |
BackupStream(0):Behandler MSTL (FID=2, VLFID=101, størrelse=65536 bytes) | 1024 |
Dataoverførsel er fuldført | 14 |
Sikkerhedskopieringssæt er gendannet | 45 |
Offline roll-forward begynder | 1 |
Behandler 68 VLF-headere | 69 |
Behandling af VLF-headere er fuldført | 11 |
Første LSN:101:111920:43, Sidste LSN:101:111960:1 | 0 |
Stop LSN:101:111960:1 | 4 |
Offline roll-forward er fuldført | 17 |
Databaserettelsen er fuldført | 2 |
Overgang af database til ONLINE | 2 |
Genstarter databasen for ONLINE | 87 |
PostRestoreContainerFixups begynder | 5 |
PostRestoreContainerFixups er fuldført | 2 |
PostRestoreReplicationFixup begynder | 107 |
PostRestoreReplicationFixup er fuldført | 2 |
Databasen er genstartet | 9 |
Genoptagelse af alle standsede fuldtekstgennemgange | 6 |
Skriv historikposter | 13 |
Skrivning af historikposter er fuldført (forløbet =13 ms) | 2 |
MSDB-vedligeholdelse er fuldført | 2 |
GENDAN DATABASE afsluttet | 0 |
Hændelsesdata til en gendannelseshandling
Hvis du fejlfinder en langsom sikkerhedskopiering eller gendannelse, kan du nemt filtrere på varigheden, så du f.eks. kun ser hændelser, der tog længere tid end n millisekunder. Det eneste, jeg ikke kan se i dette output, er nogen måde at fortælle, om øjeblikkelig filinitialisering var i kraft under gendannelsen – du har muligvis stadig brug for sporingsflag 3004, som beskrevet i mit indlæg til sidste måneds T-SQL-tirsdag.
Glem ikke at stoppe sessionen (men behold gerne sessionsdefinitionen på serveren, så du kan bruge den igen):
ALTER EVENT SESSION [Backup progress] ON SERVER STATE = STOP;
Jeg udførte ikke nogen præstationstest eller konsekvensanalyse, men generelt vil jeg sige, at - ligesom sporingsflaggene - dette ikke er noget, du ønsker at køre hele tiden, men kun ved fejlfinding af en specifik operation. Det er lidt nemmere at konfigurere denne session og forespørge dataene, IMHO, end at slå sporingsflag til og analysere alt output fra SQL Servers fejllog.