
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.