sql >> Databasteknik >  >> RDS >> Database

T-SQL tisdag #67:Nya utökade händelser för säkerhetskopiering och återställning

För förra månadens T-SQL-tisdag skrev jag om några odokumenterade spårningsflaggor som hjälper dig att vara barnvakt under långvariga backup- och återställningsoperationer. Den här månaden är Jes Borlands ämne Extended Events, och jag tänkte visa nya funktioner i SQL Server 2016 som till stor del gör dessa spårningsflaggor föråldrade.

Om du spelar med CTP2 (du kan ladda ner det här), kanske du märker en ny kategori backup_restore och ny händelse backup_restore_progress_trace :

Upptäcker en ny händelse i CTP2:s dialogruta för ny session

Här är en snabb och smutsig XE-session för att fånga data för den här händelsen (jag har lagt till kommentarer för att filtrera endast till säkerhetskopiering eller endast återställning; som standard ingår båda):

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

Låt oss nu säga att jag kör följande operationer – skapa en databas, säkerhetskopiera lite data, släpp den och återställ 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 fråga efter data från händelsemå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;

För en säkerhetskopia undertrycker inte spårningsflaggan 3226 någon av utdata som fångas av utökade händelser. Jag har utelämnat utdatakolumner, på grund av filtren, för korthetens skull:

Meddelande Längd
(Millisekunder)
BACKUP DATABAS startade 0
Öppna databasen med S lock 0
Hämtar bulk-op-lås på databasen 0
Synkronisering med andra operationer i databasen är klar 19
Öppna säkerhetskopieringsmediet 7
Säkerhetskopieringsmediet är öppet 0
Förbereder mediauppsättningen för skrivning 0
Medieuppsättningen är klar för säkerhetskopiering 0
Effektiva alternativ:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB 0
Rensa differentiella bitmappar 4
Differentiella bitmappar rensas 0
Skriva en kontrollpunkt 6
Kontrollpunkten är klar (förfluten =6 ms) 0
Starta LSN:101:111920:43, SERepl LSN:0:0:0 0
Skanna tilldelningsbitmappar 4
Skanning av allokeringsbitmappar är klar 0
Beräknar förväntad storlek på total data 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 byte 0
Uppskattad total storlek =658460672 byte (datastorlek =658440192 byte, loggstorlek =20480 byte) 0
Arbetsuppskattningen är klar 0
Senaste LSN:101:111960:1 0
Skriva ledande metadata 0
BackupStream(0):Skriver ledande metadata till enheten c:\temp\floob.bak 1
Beräknar förväntad storlek på total data 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 byte 1
Kopiera datafiler 2
Antal datafilläsare =1 0
Läser datafilen D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf 0
BackupStream(0):Skriver MSDA i storlek 10048 391
30 procent (198180864/658460672 byte) bearbetade 554
60 procent (395313152/658460672 byte) behandlade 576
90 procent (593494016/658460672 byte) behandlade 184
Slutförd läsning av datafilen D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf 2
BackupStream(0):Utfyllnad MSDA med 65536 byte 0
BackupStream(0):Total MSDA-storlek =10048 omfattningar 0
InitialExpectedSize=658440192 byte, FinalSize=658440192 byte, ExcessMode=0 0
Senaste LSN:101:111960:1 0
Kopieringen av datafiler är klar 0
Kopierar transaktionslogg 0
MediaFamily(0):FID=2, VLFID=101, DataStreamSize=65536 byte 4
Kopieringen av transaktionsloggen är klar 0
Skriva efterföljande metadata 0
BackupStream(0):Skriver efterföljande metadata till enheten c:\temp\floob.bak 0
Skriver slutet av säkerhetskopieringsuppsättningen 30
Skriva historikposter 12
Skrivningen av historikposter är klar (förfluten =11 ms) 0
BACKUP DATABAS avslutad 0

Händelsedata för en säkerhetskopiering

För en återställning kommer du att se dessa rader:

Meddelande Längd
(Millisekunder)
ÅTERSTÄLLNING DATABAS startade 0
Öppna säkerhetskopian 3
Bearbetar ledande metadata 0
Planeringen börjar 23
Effektiva alternativ:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB 0
Planeringen är klar 0
Börjar OFFLINE-återställning 0
Bifogad databas som DB_ID=5 1
Förbereder behållare 534
Behållarna är klara 1097
Återställer säkerhetskopian 0
Uppskattad total storlek att överföra =658460672 byte 0
Överföra data 1
BackupStream(0):Bearbetar MSDA av storlek 10048 3282
BackupStream(0):Slutförd MSDA 0
Väntar på att loggnollningen ska slutföras 3
Loggnollställning är klar 0
BackupStream(0):Bearbetar MSTL (FID=2, VLFID=101, storlek=65536 byte) 1024
Dataöverföringen är klar 14
Säkerhetskopiering har återställts 45
Offline rollforward börjar 1
Bearbetar 68 VLF-rubriker 69
Bearbetningen av VLF-rubriker är klar 11
Första LSN:101:111920:43, Senaste LSN:101:111960:1 0
Stopp LSN:101:111960:1 4
Offline roll-forward är klar 17
Databaskorrigeringen är klar 2
Övergång av databas till ONLINE 2
Startar om databasen för ONLINE 87
PostRestoreContainerFixups börjar 5
PostRestoreContainerFixups är klar 2
PostRestoreReplicationFixup börjar 107
PostRestoreReplicationFixup är klar 2
Databasen startas om 9
Återuppta alla stoppade fulltextgenomsökningar 6
Skriva historikposter 13
Skrivningen av historikposter är klar (förfluten =13 ms) 2
MSDB-underhållet är klart 2
ÅTERSTÄLLNING AV DATABAS slutförd 0

Händelsedata för en återställning

Om du felsöker en långsam säkerhetskopiering eller återställning kan du enkelt filtrera på varaktigheten, så att du till exempel bara ser händelser som tog längre tid än n millisekunder. Det enda jag inte ser i denna utdata är något sätt att avgöra om omedelbar filinitiering var i kraft under återställningen – du kan fortfarande behöva spårningsflagga 3004, som beskrivs i mitt inlägg för förra månadens T-SQL-tisdag.

Glöm inte att stoppa sessionen (men behåll gärna sessionsdefinitionen på servern så att du kan använda den igen):

ALTER EVENT SESSION [Backup progress] ON SERVER STATE = STOP;

Jag utförde inga prestandatester eller konsekvensanalyser, men generellt sett skulle jag säga att – som spårningsflaggor – detta inte är något du vill köra hela tiden, utan bara när du felsöker en specifik operation. Det är lite lättare att ställa in den här sessionen och fråga efter data, IMHO, än att aktivera spårningsflaggor och analysera all utdata från SQL Servers fellogg.


  1. Ändra lösenordet för en SQL Server-inloggning

  2. Hur man ställer in asynkron replikering mellan MariaDB Galera-kluster

  3. Millisekundens upplösning av DateTime i Ruby

  4. Hur ändrar man ägandet av alla objekt i ett visst schema i PostgreSQL?