sql >> Databáze >  >> RDS >> Database

T-SQL úterý #67:Nové zálohování a obnovení rozšířených událostí

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.


  1. Nejlepší způsob, jak otestovat, zda existuje řádek v tabulce MySQL

  2. Python volání sql-server uložené procedury s tabulkovým parametrem

  3. MySQL - Kontrolujte, který řádek je vrácen skupinou

  4. Funkce MySQL ASIN() – Vrací úhlový sinus čísla