Voor de T-SQL-dinsdag van vorige maand schreef ik over enkele niet-gedocumenteerde traceringsvlaggen die u helpen om langlopende back-up- en herstelbewerkingen te verzorgen. Deze maand is het onderwerp van Jes Borland Extended Events, en ik dacht dat ik nieuwe mogelijkheden in SQL Server 2016 zou laten zien die deze traceringsvlaggen grotendeels overbodig maken.
Als je met CTP2 speelt (je kunt het hier downloaden), zie je misschien een nieuwe categorie backup_restore
en nieuwe gebeurtenis backup_restore_progress_trace
:
Een nieuwe gebeurtenis ontdekken in het dialoogvenster Nieuwe sessie van CTP2
Hier is een snelle en vuile XE-sessie voor het vastleggen van de gegevens voor deze gebeurtenis (ik heb opmerkingen voor filteren toegevoegd aan alleen back-up- of herstelbewerkingen; standaard zijn beide inbegrepen):
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
Laten we nu zeggen dat ik de volgende bewerkingen uitvoer:maak een database, maak een back-up van een beetje gegevens, laat het vallen en herstel het:
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 kunnen we de gegevens van het gebeurtenisdoelbestand opvragen:
;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;
Voor een back-up onderdrukt traceringsvlag 3226 geen van de uitvoer die is vastgelegd door Extended Events. Ik heb uitvoerkolommen weggelaten vanwege de filters, voor de beknoptheid:
Bericht | Duur (Milliseconden) |
---|---|
BACK-UP DATABASE gestart | 0 |
De database openen met S lock | 0 |
Verkrijgen van bulk-op lock op de database | 0 |
Synchroniseren met andere bewerkingen in de database is voltooid | 19 |
De back-upmediaset openen | 7 |
De back-upmediaset is open | 0 |
De mediaset voorbereiden om te schrijven | 0 |
De mediaset is gereed voor back-up | 0 |
Effectieve opties:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB | 0 |
Verschillende bitmaps wissen | 4 |
Differentiële bitmaps worden gewist | 0 |
Een controlepunt schrijven | 6 |
Checkpoint is voltooid (verstreken =6 ms) | 0 |
Start LSN:101:111920:43, SERepl LSN:0:0:0 | 0 |
Allocatiebitmaps scannen | 4 |
Het scannen van toewijzingsbitmaps is voltooid | 0 |
De verwachte omvang van de totale gegevens berekenen | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TotalSize=658440192 bytes | 0 |
Geschatte totale grootte =658460672 bytes (gegevensgrootte =658440192 bytes, loggrootte =20480 bytes) | 0 |
Werkschatting is voltooid | 0 |
Laatste LSN:101:111960:1 | 0 |
De belangrijkste metadata schrijven | 0 |
BackupStream(0):leidende metadata schrijven naar het apparaat c:\temp\floob.bak | 1 |
De verwachte omvang van de totale gegevens berekenen | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TotalSize=658440192 bytes | 1 |
Gegevensbestanden kopiëren | 2 |
Aantal lezers van gegevensbestanden =1 | 0 |
Het gegevensbestand D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf lezen | 0 |
BackupStream(0):MSDA schrijven met een grootte van 10048 | 391 |
30 procent (198180864/658460672 bytes) verwerkt | 554 |
60 procent (395313152/658460672 bytes) verwerkt | 576 |
90 procent (593494016/658460672 bytes) verwerkt | 184 |
Lezen van het gegevensbestand D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf voltooid | 2 |
BackupStream(0):MSDA opvullen met 65536 bytes | 0 |
BackupStream(0):Totale MSDA-grootte =10048 extensies | 0 |
InitialExpectedSize=658440192 bytes, FinalSize=658440192 bytes, ExcessMode=0 | 0 |
Laatste LSN:101:111960:1 | 0 |
Het kopiëren van gegevensbestanden is voltooid | 0 |
Transactielogboek kopiëren | 0 |
MediaFamily(0):FID=2, VLFID=101, DataStreamSize=65536 bytes | 4 |
Het kopiëren van het transactielogboek is voltooid | 0 |
De achterliggende metadata schrijven | 0 |
BackupStream(0):schrijven van volgmetadata naar het apparaat c:\temp\floob.bak | 0 |
Het einde van de back-upset schrijven | 30 |
Geschiedenisgegevens schrijven | 12 |
Het schrijven van geschiedenisrecords is voltooid (verstreken =11 ms) | 0 |
BACK-UP DATABASE voltooid | 0 |
Gebeurtenisgegevens voor een back-upbewerking
Voor een herstel ziet u deze rijen:
Bericht | Duur (Milliseconden) |
---|---|
HERSTEL DATABASE gestart | 0 |
De back-upset openen | 3 |
De belangrijkste metadata verwerken | 0 |
Planning begint | 23 |
Effectieve opties:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB | 0 |
Planning is voltooid | 0 |
Beginnen met OFFLINE herstellen | 0 |
Bijgevoegde database als DB_ID=5 | 1 |
Containers voorbereiden | 534 |
Containers zijn klaar | 1097 |
De back-upset herstellen | 0 |
Geschatte totale grootte voor overdracht =658460672 bytes | 0 |
Gegevens overzetten | 1 |
BackupStream(0):MSDA met grootte 10048-extensies verwerken | 3282 |
BackupStream(0):MSDA voltooid | 0 |
Wachten tot het op nul zetten van het logboek is voltooid | 3 |
Log-nulstelling is voltooid | 0 |
BackupStream(0):MSTL verwerken (FID=2, VLFID=101, grootte=65536 bytes) | 1024 |
Gegevensoverdracht is voltooid | 14 |
Back-upset is hersteld | 45 |
Offline roll-forward begint | 1 |
68 VLF-headers verwerken | 69 |
Verwerking van VLF-headers is voltooid | 11 |
Eerste LSN:101:111920:43, Laatste LSN:101:111960:1 | 0 |
LSN stoppen:101:111960:1 | 4 |
Offline roll-forward is voltooid | 17 |
Database repareren is voltooid | 2 |
Database overzetten naar ONLINE | 2 |
Herstart database voor ONLINE | 87 |
PostRestoreContainerFixups begint | 5 |
PostRestoreContainerFixups is voltooid | 2 |
PostRestoreReplicationFixup begint | 107 |
PostRestoreReplicationFixup is voltooid | 2 |
Database is opnieuw gestart | 9 |
Hervatten van gestopte Fulltext-crawls | 6 |
Geschiedenisgegevens schrijven | 13 |
Het schrijven van geschiedenisrecords is voltooid (verstreken =13 ms) | 2 |
MSDB-onderhoud is voltooid | 2 |
HERSTEL DATABASE voltooid | 0 |
Gebeurtenisgegevens voor een herstelbewerking
Als u een trage back-up- of herstelbewerking wilt oplossen, kunt u eenvoudig filteren op de duur, zodat u alleen gebeurtenissen ziet die langer duren dan bijvoorbeeld n milliseconden. Het enige dat ik in deze uitvoer niet zie, is een manier om te zien of directe bestandsinitialisatie van kracht was tijdens het terugzetten - je hebt misschien nog steeds traceringsvlag 3004 nodig, zoals beschreven in mijn bericht voor de T-SQL-dinsdag van vorige maand.
Vergeet niet de sessie te stoppen (maar bewaar de sessiedefinitie gerust op de server, zodat u deze opnieuw kunt gebruiken):
ALTER EVENT SESSION [Backup progress] ON SERVER STATE = STOP;
Ik heb geen prestatietests of impactanalyse uitgevoerd, maar in het algemeen zou ik zeggen dat - net als de traceringsvlaggen - dit niet iets is dat je altijd wilt laten lopen, maar alleen bij het oplossen van problemen met een specifieke bewerking. Het is een beetje eenvoudiger om deze sessie op te zetten en de gegevens op te vragen, IMHO, dan om de traceervlaggen in te schakelen en alle uitvoer uit het foutenlogboek van SQL Server te ontleden.