Pro úterý T-SQL z minulého měsíce jsem psal o některých nezdokumentovaných příznacích trasování, které vám pomohou hlídat dlouhotrvající operace zálohování a obnovy. Tento měsíc je tématem Jes Borland Extended Events a napadlo mě, že ukážu nové možnosti v SQL Server 2016, díky kterým jsou tyto příznaky trasování z velké části zastaralé.
Pokud hrajete s CTP2 (můžete si jej stáhnout zde), můžete si všimnout nové kategorie backup_restore
a nová událost backup_restore_progress_trace
:
Zjištění nové události v dialogovém okně Nová relace CTP2
Zde je rychlá a nečistá relace XE pro zachycení dat pro tuto událost (přidal jsem komentáře pro filtrování pouze pro operace zálohování nebo obnovy; ve výchozím nastavení jsou zahrnuty obě):
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
Nyní řekněme, že spustím následující operace – vytvořím databázi, zálohuji část dat, zahodím je a obnovím:
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;
Nyní se můžeme dotazovat na data z cílového souboru události:
;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;
U zálohy příznak trasování 3226 nepotlačuje žádný výstup zachycený rozšířenými událostmi. Kvůli stručnosti jsem kvůli filtrům vynechal výstupní sloupce:
Zpráva | Trvání (milisekundy) |
---|---|
ZÁLOHOVÁNÍ DATABÁZE spuštěno | 0 |
Otevření databáze pomocí zámku S | 0 |
Získání uzamčení hromadné operace na databázi | 0 |
Synchronizace s ostatními operacemi v databázi je dokončena | 19 |
Otevření sady záložních médií | 7 |
Sada záložních médií je otevřená | 0 |
Příprava sady médií pro zápis | 0 |
Sada médií je připravena k zálohování | 0 |
Efektivní možnosti:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB | 0 |
Vymazání rozdílových bitmap | 4 |
Rozdílové bitmapy jsou vymazány | 0 |
Zápis kontrolního bodu | 6 |
Kontrolní bod je dokončen (uplynulo =6 ms) | 0 |
Začátek LSN:101:111920:43, SERepl LSN:0:0:0 | 0 |
Skenování alokačních bitmap | 4 |
Skenování alokačních bitmap je dokončeno | 0 |
Výpočet očekávané velikosti celkových dat | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TotalSize=658440192 bajtů | 0 |
Odhadovaná celková velikost =658460672 bajtů (velikost dat =658440192 bajtů, velikost protokolu =20480 bajtů) | 0 |
Odhad práce je dokončen | 0 |
Poslední LSN:101:111960:1 | 0 |
Psaní hlavních metadat | 0 |
BackupStream(0):Zápis úvodních metadat do zařízení c:\temp\floob.bak | 1 |
Výpočet očekávané velikosti celkových dat | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TotalSize=658440192 bajtů | 1 |
Kopírování datových souborů | 2 |
Počet čteček datových souborů =1 | 0 |
Čtení datového souboru D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf | 0 |
BackupStream(0):Zápis MSDA o velikosti 10048 rozsahů | 391 |
30 procent (198180864/658460672 bajtů) zpracováno | 554 |
60 procent (395313152/658460672 bajtů) zpracováno | 576 |
90 procent (593494016/658460672 bajtů) zpracováno | 184 |
Dokončeno čtení datového souboru D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf | 2 |
BackupStream(0):Vyplnění MSDA 65536 bajty | 0 |
BackupStream(0):Celková velikost MSDA =10048 rozsahů | 0 |
InitialExpectedSize=658440192 bajtů, FinalSize=658440192 bajtů, ExcessMode=0 | 0 |
Poslední LSN:101:111960:1 | 0 |
Kopírování datových souborů je dokončeno | 0 |
Kopírování protokolu transakcí | 0 |
MediaFamily(0):FID=2, VLFID=101, DataStreamSize=65536 bajtů | 4 |
Kopírování protokolu transakcí je dokončeno | 0 |
Zápis koncových metadat | 0 |
BackupStream(0):Zápis koncových metadat do zařízení c:\temp\floob.bak | 0 |
Zápis konce zálohovací sady | 30 |
Záznamy historie zápisu | 12 |
Záznamy historie zápisu jsou dokončeny (uplynulo =11 ms) | 0 |
ZÁLOHOVÁNÍ DATABÁZE dokončeno | 0 |
Data událostí pro operaci zálohování
Pro obnovení uvidíte tyto řádky:
Zpráva | Trvání (milisekundy) |
---|---|
OBNOVENÍ DATABÁZE zahájeno | 0 |
Otevření zálohovací sady | 3 |
Zpracování hlavních metadat | 0 |
Plánování začíná | 23 |
Efektivní možnosti:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB | 0 |
Plánování je dokončeno | 0 |
Zahájení OFFLINE obnovení | 0 |
Připojená databáze jako DB_ID=5 | 1 |
Příprava kontejnerů | 534 |
Kontejnery jsou připraveny | 1097 |
Obnovení zálohovací sady | 0 |
Odhadovaná celková velikost k přenosu =658460672 bajtů | 0 |
Přenos dat | 1 |
BackupStream(0):Zpracování MSDA o velikosti 10048 rozsahů | 3282 |
BackupStream(0):Dokončeno MSDA | 0 |
Čekání na dokončení nulování protokolu | 3 |
Nulování protokolu je dokončeno | 0 |
BackupStream(0):Zpracování MSTL (FID=2, VLFID=101, velikost=65536 bajtů) | 1024 |
Přenos dat je dokončen | 14 |
Záložní sada je obnovena | 45 |
Zahájení přehrávání offline | 1 |
Zpracování 68 hlaviček VLF | 69 |
Zpracování hlaviček VLF je dokončeno | 11 |
První LSN:101:111920:43, Poslední LSN:101:111960:1 | 0 |
Zastavit LSN:101:111960:1 | 4 |
Přehrávání offline je dokončeno | 17 |
Oprava databáze je dokončena | 2 |
Přechod databáze na ONLINE | 2 |
Restartování databáze pro ONLINE | 87 |
PostRestoreContainerFixups začíná | 5 |
PostRestoreContainerFixups je dokončeno | 2 |
PostRestoreReplicationFixup začíná | 107 |
PostRestoreReplicationFixup je dokončena | 2 |
Databáze je restartována | 9 |
Obnovení všech zastavených procházení Fulltextu | 6 |
Záznamy historie zápisu | 13 |
Záznamy historie zápisu jsou dokončeny (uplynulo =13 ms) | 2 |
Údržba MSDB je dokončena | 2 |
OBNOVENÍ DATABÁZE dokončeno | 0 |
Data události pro operaci obnovení
Pokud řešíte problémy s pomalou operací zálohování nebo obnovy, můžete snadno filtrovat dobu trvání, takže uvidíte pouze události, které trvaly například déle než n milisekund. Jediná věc, kterou v tomto výstupu nevidím, je způsob, jak zjistit, zda během obnovy proběhla okamžitá inicializace souboru – stále možná budete potřebovat příznak trasování 3004, jak je popsáno v mém příspěvku pro úterý T-SQL z minulého měsíce.
Nezapomeňte zastavit relaci (ale klidně ponechte definici relace na serveru, abyste ji mohli znovu použít):
ALTER EVENT SESSION [Backup progress] ON SERVER STATE = STOP;
Neprováděl jsem žádné testy výkonu ani analýzu dopadu, ale obecně bych řekl, že – stejně jako příznaky trasování – to není něco, co byste chtěli spouštět neustále, ale pouze při odstraňování problémů s konkrétní operací. Je o něco snazší nastavit tuto relaci a dotazovat se na data, IMHO, než zapnout příznaky trasování a analyzovat veškerý výstup z protokolu chyb serveru SQL Server.