sql >> Database >  >> RDS >> Database

T-SQL Tuesday #67:Nieuwe back-up en herstel van uitgebreide gebeurtenissen

Voor de T-SQL-dinsdag van vorige maand schreef ik over enkele niet-gedocumenteerde traceringsvlaggen die u helpen om langlopende back-up- en herstelbewerkingen te verzorgen. Deze maand is het onderwerp van Jes Borland Extended Events, en ik dacht dat ik nieuwe mogelijkheden in SQL Server 2016 zou laten zien die deze traceringsvlaggen grotendeels overbodig maken.

Als je met CTP2 speelt (je kunt het hier downloaden), zie je misschien een nieuwe categorie backup_restore en nieuwe gebeurtenis backup_restore_progress_trace :

Een nieuwe gebeurtenis ontdekken in het dialoogvenster Nieuwe sessie van CTP2

Hier is een snelle en vuile XE-sessie voor het vastleggen van de gegevens voor deze gebeurtenis (ik heb opmerkingen voor filteren toegevoegd aan alleen back-up- of herstelbewerkingen; standaard zijn beide inbegrepen):

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

Laten we nu zeggen dat ik de volgende bewerkingen uitvoer:maak een database, maak een back-up van een beetje gegevens, laat het vallen en herstel het:

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 kunnen we de gegevens van het gebeurtenisdoelbestand opvragen:

;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;

Voor een back-up onderdrukt traceringsvlag 3226 geen van de uitvoer die is vastgelegd door Extended Events. Ik heb uitvoerkolommen weggelaten vanwege de filters, voor de beknoptheid:

Bericht Duur
(Milliseconden)
BACK-UP DATABASE gestart 0
De database openen met S lock 0
Verkrijgen van bulk-op lock op de database 0
Synchroniseren met andere bewerkingen in de database is voltooid 19
De back-upmediaset openen 7
De back-upmediaset is open 0
De mediaset voorbereiden om te schrijven 0
De mediaset is gereed voor back-up 0
Effectieve opties:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB 0
Verschillende bitmaps wissen 4
Differentiële bitmaps worden gewist 0
Een controlepunt schrijven 6
Checkpoint is voltooid (verstreken =6 ms) 0
Start LSN:101:111920:43, SERepl LSN:0:0:0 0
Allocatiebitmaps scannen 4
Het scannen van toewijzingsbitmaps is voltooid 0
De verwachte omvang van de totale gegevens berekenen 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 bytes 0
Geschatte totale grootte =658460672 bytes (gegevensgrootte =658440192 bytes, loggrootte =20480 bytes) 0
Werkschatting is voltooid 0
Laatste LSN:101:111960:1 0
De belangrijkste metadata schrijven 0
BackupStream(0):leidende metadata schrijven naar het apparaat c:\temp\floob.bak 1
De verwachte omvang van de totale gegevens berekenen 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 bytes 1
Gegevensbestanden kopiëren 2
Aantal lezers van gegevensbestanden =1 0
Het gegevensbestand D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf lezen 0
BackupStream(0):MSDA schrijven met een grootte van 10048 391
30 procent (198180864/658460672 bytes) verwerkt 554
60 procent (395313152/658460672 bytes) verwerkt 576
90 procent (593494016/658460672 bytes) verwerkt 184
Lezen van het gegevensbestand D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf voltooid 2
BackupStream(0):MSDA opvullen met 65536 bytes 0
BackupStream(0):Totale MSDA-grootte =10048 extensies 0
InitialExpectedSize=658440192 bytes, FinalSize=658440192 bytes, ExcessMode=0 0
Laatste LSN:101:111960:1 0
Het kopiëren van gegevensbestanden is voltooid 0
Transactielogboek kopiëren 0
MediaFamily(0):FID=2, VLFID=101, DataStreamSize=65536 bytes 4
Het kopiëren van het transactielogboek is voltooid 0
De achterliggende metadata schrijven 0
BackupStream(0):schrijven van volgmetadata naar het apparaat c:\temp\floob.bak 0
Het einde van de back-upset schrijven 30
Geschiedenisgegevens schrijven 12
Het schrijven van geschiedenisrecords is voltooid (verstreken =11 ms) 0
BACK-UP DATABASE voltooid 0

Gebeurtenisgegevens voor een back-upbewerking

Voor een herstel ziet u deze rijen:

Bericht Duur
(Milliseconden)
HERSTEL DATABASE gestart 0
De back-upset openen 3
De belangrijkste metadata verwerken 0
Planning begint 23
Effectieve opties:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB 0
Planning is voltooid 0
Beginnen met OFFLINE herstellen 0
Bijgevoegde database als DB_ID=5 1
Containers voorbereiden 534
Containers zijn klaar 1097
De back-upset herstellen 0
Geschatte totale grootte voor overdracht =658460672 bytes 0
Gegevens overzetten 1
BackupStream(0):MSDA met grootte 10048-extensies verwerken 3282
BackupStream(0):MSDA voltooid 0
Wachten tot het op nul zetten van het logboek is voltooid 3
Log-nulstelling is voltooid 0
BackupStream(0):MSTL verwerken (FID=2, VLFID=101, grootte=65536 bytes) 1024
Gegevensoverdracht is voltooid 14
Back-upset is hersteld 45
Offline roll-forward begint 1
68 VLF-headers verwerken 69
Verwerking van VLF-headers is voltooid 11
Eerste LSN:101:111920:43, Laatste LSN:101:111960:1 0
LSN stoppen:101:111960:1 4
Offline roll-forward is voltooid 17
Database repareren is voltooid 2
Database overzetten naar ONLINE 2
Herstart database voor ONLINE 87
PostRestoreContainerFixups begint 5
PostRestoreContainerFixups is voltooid 2
PostRestoreReplicationFixup begint 107
PostRestoreReplicationFixup is voltooid 2
Database is opnieuw gestart 9
Hervatten van gestopte Fulltext-crawls 6
Geschiedenisgegevens schrijven 13
Het schrijven van geschiedenisrecords is voltooid (verstreken =13 ms) 2
MSDB-onderhoud is voltooid 2
HERSTEL DATABASE voltooid 0

Gebeurtenisgegevens voor een herstelbewerking

Als u een trage back-up- of herstelbewerking wilt oplossen, kunt u eenvoudig filteren op de duur, zodat u alleen gebeurtenissen ziet die langer duren dan bijvoorbeeld n milliseconden. Het enige dat ik in deze uitvoer niet zie, is een manier om te zien of directe bestandsinitialisatie van kracht was tijdens het terugzetten - je hebt misschien nog steeds traceringsvlag 3004 nodig, zoals beschreven in mijn bericht voor de T-SQL-dinsdag van vorige maand.

Vergeet niet de sessie te stoppen (maar bewaar de sessiedefinitie gerust op de server, zodat u deze opnieuw kunt gebruiken):

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

Ik heb geen prestatietests of impactanalyse uitgevoerd, maar in het algemeen zou ik zeggen dat - net als de traceringsvlaggen - dit niet iets is dat je altijd wilt laten lopen, maar alleen bij het oplossen van problemen met een specifieke bewerking. Het is een beetje eenvoudiger om deze sessie op te zetten en de gegevens op te vragen, IMHO, dan om de traceervlaggen in te schakelen en alle uitvoer uit het foutenlogboek van SQL Server te ontleden.


  1. SSL-sleutelbeheer en versleuteling van MySQL-gegevens in transit

  2. hoe een tekenreeks voor een reeks te prefixen die is gegenereerd door postgresql?

  3. PostgreSQL Regex-woordgrenzen?

  4. Uw SQL Server-workload leren kennen