sql >> Database teknologi >  >> RDS >> Database

T-SQL tirsdag #67:Ny sikkerhedskopiering og gendannelse af udvidede begivenheder

Til sidste måneds T-SQL-tirsdag skrev jeg om nogle udokumenterede sporingsflag, der hjælper dig med at passe på langvarige backup- og gendannelsesoperationer. Denne måned er Jes Borlands emne Extended Events, og jeg tænkte, at jeg ville vise nye muligheder i SQL Server 2016, der stort set gør disse sporingsflag forældede.

Hvis du spiller med CTP2 (du kan downloade det her), vil du muligvis bemærke en ny kategori backup_restore og ny hændelse backup_restore_progress_trace :

Opdagelse af en ny begivenhed i CTP2's dialogboks Ny session

Her er en hurtig og beskidt XE-session til at fange dataene for denne begivenhed (jeg har tilføjet kommentarer til filtrering til kun at tage backup eller kun gendannelsesoperationer; som standard er begge inkluderet):

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

Lad os nu sige, at jeg kører følgende operationer – opret en database, læg en smule data tilbage, slip den og gendan 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 forespørge dataene fra begivenhedsmå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;

For en sikkerhedskopi undertrykker sporingsflag 3226 ikke noget af det output, der fanges af udvidede hændelser. Jeg har udeladt outputkolonner på grund af filtrene for kortheds skyld:

Besked Varighed
(millisekunder)
BACKUP DATABASE startede 0
Åbning af databasen med S lock 0
Anskaffelse af bulk-op-lås på databasen 0
Synkronisering med andre operationer på databasen er fuldført 19
Åbning af sikkerhedskopieringsmediesættet 7
Sikkerhedskopieringsmediesættet er åbent 0
Forberedelse af mediesættet til skrivning 0
Mediesættet er klar til sikkerhedskopiering 0
Effektive muligheder:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB 0
Sletning af differentielle bitmaps 4
Differentielle bitmaps ryddes 0
Skriv et kontrolpunkt 6
Checkpoint er gennemført (forløbet =6 ms) 0
Start LSN:101:111920:43, SERepl LSN:0:0:0 0
Scanning af allokeringsbitmaps 4
Scanning af allokeringsbitmaps er fuldført 0
Beregning af forventet størrelse af samlede data 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 bytes 0
Estimeret samlet størrelse =658460672 bytes (datastørrelse =658440192 bytes, logstørrelse =20480 bytes) 0
Arbejdsestimering er fuldført 0
Sidste LSN:101:111960:1 0
Skrivning af de førende metadata 0
BackupStream(0):Skrivning af førende metadata til enheden c:\temp\floob.bak 1
Beregning af forventet størrelse af samlede data 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 bytes 1
Kopiering af datafiler 2
Antal datafillæsere =1 0
Læsning af datafilen D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf 0
BackupStream(0):Skrivning af MSDA i størrelse 10048 391
30 procent (198180864/658460672 bytes) behandlet 554
60 procent (395313152/658460672 bytes) behandlet 576
90 procent (593494016/658460672 bytes) behandlet 184
Fuldført læsning af datafilen D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf 2
BackupStream(0):Udfyldning af MSDA med 65536 bytes 0
BackupStream(0):Samlet MSDA-størrelse =10048 omfang 0
InitialExpectedSize=658440192 bytes, FinalSize=658440192 bytes, ExcessMode=0 0
Sidste LSN:101:111960:1 0
Kopiering af datafiler er fuldført 0
Kopierer transaktionslog 0
MediaFamily(0):FID=2, VLFID=101, DataStreamSize=65536 bytes 4
Kopiering af transaktionslog er fuldført 0
Skrivning af de efterfølgende metadata 0
BackupStream(0):Skrivning af efterfølgende metadata til enheden c:\temp\floob.bak 0
Skriver slutningen af ​​sikkerhedskopieringssættet 30
Skriv historikposter 12
Skrivning af historieregistreringer er fuldført (forløbet =11 ms) 0
BACKUP DATABASE afsluttet 0

Hændelsesdata til en sikkerhedskopiering

For en gendannelse vil du se disse rækker:

Besked Varighed
(millisekunder)
RESTORE DATABASE startede 0
Åbning af sikkerhedskopieringssættet 3
Behandling af de førende metadata 0
Planlægningen begynder 23
Effektive muligheder:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB 0
Planlægningen er fuldført 0
Begynder OFFLINE-gendannelse 0
Vedhæftet database som DB_ID=5 1
Forberedelse af beholdere 534
Beholdere er klar 1097
Gendannelse af sikkerhedskopieringssættet 0
Estimeret samlet størrelse til overførsel =658460672 bytes 0
Overførsel af data 1
BackupStream(0):Behandler MSDA i størrelse 10048 3282
BackupStream(0):Fuldført MSDA 0
Venter på, at log-nulstilling er fuldført 3
Nulstilling af log er fuldført 0
BackupStream(0):Behandler MSTL (FID=2, VLFID=101, størrelse=65536 bytes) 1024
Dataoverførsel er fuldført 14
Sikkerhedskopieringssæt er gendannet 45
Offline roll-forward begynder 1
Behandler 68 VLF-headere 69
Behandling af VLF-headere er fuldført 11
Første LSN:101:111920:43, Sidste LSN:101:111960:1 0
Stop LSN:101:111960:1 4
Offline roll-forward er fuldført 17
Databaserettelsen er fuldført 2
Overgang af database til ONLINE 2
Genstarter databasen for ONLINE 87
PostRestoreContainerFixups begynder 5
PostRestoreContainerFixups er fuldført 2
PostRestoreReplicationFixup begynder 107
PostRestoreReplicationFixup er fuldført 2
Databasen er genstartet 9
Genoptagelse af alle standsede fuldtekstgennemgange 6
Skriv historikposter 13
Skrivning af historikposter er fuldført (forløbet =13 ms) 2
MSDB-vedligeholdelse er fuldført 2
GENDAN DATABASE afsluttet 0

Hændelsesdata til en gendannelseshandling

Hvis du fejlfinder en langsom sikkerhedskopiering eller gendannelse, kan du nemt filtrere på varigheden, så du f.eks. kun ser hændelser, der tog længere tid end n millisekunder. Det eneste, jeg ikke kan se i dette output, er nogen måde at fortælle, om øjeblikkelig filinitialisering var i kraft under gendannelsen – du har muligvis stadig brug for sporingsflag 3004, som beskrevet i mit indlæg til sidste måneds T-SQL-tirsdag.

Glem ikke at stoppe sessionen (men behold gerne sessionsdefinitionen på serveren, så du kan bruge den igen):

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

Jeg udførte ikke nogen præstationstest eller konsekvensanalyse, men generelt vil jeg sige, at - ligesom sporingsflaggene - dette ikke er noget, du ønsker at køre hele tiden, men kun ved fejlfinding af en specifik operation. Det er lidt nemmere at konfigurere denne session og forespørge dataene, IMHO, end at slå sporingsflag til og analysere alt output fra SQL Servers fejllog.


  1. Sådan aktiverer du generelle logfiler og fejllogfiler i AWS RDS

  2. Følgerklynger – 3 store brugssager til synkronisering af SQL- og NoSQL-implementeringer

  3. Reparation af datatab ved hjælp af logforsendelse med forsinket gendannelse

  4. Sådan bruges OBJECT_ID() på krydsdatabaseobjekter i SQL Server