Database
 sql >> Baza danych >  >> RDS >> Database

T-SQL Wtorek #67:Nowe rozszerzone zdarzenia tworzenia kopii zapasowych i przywracania

We wtorek w T-SQL w zeszłym miesiącu pisałem o kilku nieudokumentowanych flagach śledzenia, które pomagają nadzorować długotrwałe operacje tworzenia kopii zapasowych i przywracania. W tym miesiącu tematem Jesa Borlanda są zdarzenia rozszerzone i pomyślałem, że pokażę nowe możliwości w SQL Server 2016, które w dużej mierze sprawią, że te flagi śledzenia staną się przestarzałe.

Jeśli grasz z CTP2 (możesz go pobrać tutaj), możesz zauważyć nową kategorię backup_restore i nowe wydarzenie backup_restore_progress_trace :

Odkrywanie nowego zdarzenia w oknie dialogowym Nowa sesja CTP2

Oto szybka i brudna sesja XE do przechwytywania danych dla tego zdarzenia (dodałem komentarze dotyczące filtrowania tylko do operacji tworzenia kopii zapasowych lub tylko przywracania; domyślnie obie są uwzględnione):

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

Teraz powiedzmy, że uruchamiam następujące operacje – tworzenie bazy danych, tworzenie kopii zapasowej danych, upuszczanie i przywracanie:

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;

Teraz możemy zapytać o dane z pliku docelowego zdarzenia:

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

W przypadku kopii zapasowej flaga śledzenia 3226 nie pomija żadnych danych wyjściowych przechwyconych przez zdarzenia rozszerzone. Pominąłem kolumny wyjściowe, ze względu na filtry, dla zwięzłości:

Wiadomość Czas trwania
(milisekundy)
KOPIOWANIE BAZY DANYCH rozpoczęte 0
Otwieranie bazy danych za pomocą S lock 0
Uzyskiwanie blokady operacji zbiorczych w bazie danych 0
Synchronizacja z innymi operacjami na bazie danych zakończona 19
Otwieranie zestawu nośników kopii zapasowych 7
Zestaw nośników kopii zapasowej jest otwarty 0
Przygotowanie zestawu mediów do pisania 0
Zestaw nośników jest gotowy do utworzenia kopii zapasowej 0
Skuteczne opcje:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB 0
Usuwanie różnicowych map bitowych 4
Różnicowe mapy bitowe są usuwane 0
Pisanie punktu kontrolnego 6
Punkt kontrolny zakończony (upłynął =6 ms) 0
Start LSN:101:111920:43, SERepl LSN:0:0:0 0
Skanowanie bitmap alokacji 4
Skanowanie bitmap alokacji zakończone 0
Obliczanie oczekiwanego rozmiaru całkowitych danych 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 bajty 0
Szacowany całkowity rozmiar =658460672 bajtów (rozmiar danych =658440192 bajtów, rozmiar dziennika =20480 bajtów) 0
Oszacowanie pracy zakończone 0
Ostatni numer LSN:101:111960:1 0
Zapisywanie wiodących metadanych 0
BackupStream(0):Zapisywanie wiodących metadanych do urządzenia c:\temp\floob.bak 1
Obliczanie oczekiwanego rozmiaru całkowitych danych 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 bajty 1
Kopiowanie plików danych 2
Liczba czytników plików danych =1 0
Odczyt pliku danych D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf 0
BackupStream(0):Zapisywanie MSDA o rozmiarze 10048 przydziałów 391
30 procent (198180864/658460672 bajtów) przetworzonych 554
60 procent (395313152/658460672 bajtów) przetworzonych 576
90 procent (593494016/658460672 bajtów) przetworzonych 184
Zakończono odczytywanie pliku danych D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf 2
BackupStream(0):wypełnienie MSDA 65536 bajtami 0
BackupStream(0):całkowity rozmiar MSDA =10048 zakresów 0
InitialExpectedSize=658440192 bajty, FinalSize=658440192 bajty, ExcessMode=0 0
Ostatni numer LSN:101:111960:1 0
Kopiowanie plików danych zakończone 0
Kopiowanie dziennika transakcji 0
MediaFamily(0):FID=2, VLFID=101, DataStreamSize=65536 bajtów 4
Kopiowanie dziennika transakcji zakończone 0
Zapisywanie końcowych metadanych 0
BackupStream(0):Zapisywanie końcowych metadanych na urządzeniu c:\temp\floob.bak 0
Zapisywanie końca zestawu kopii zapasowych 30
Zapisywanie rekordów historii 12
Zapisywanie rekordów historii zakończone (upływało =11 ms) 0
KOPIOWANIE BAZY DANYCH zakończone 0

Dane zdarzeń dla operacji tworzenia kopii zapasowej

W przypadku przywrócenia zobaczysz te wiersze:

Wiadomość Czas trwania
(milisekundy)
Rozpoczęto PRZYWRACANIE BAZY DANYCH 0
Otwieranie zestawu kopii zapasowych 3
Przetwarzanie wiodących metadanych 0
Rozpoczyna się planowanie 23
Skuteczne opcje:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB 0
Planowanie zakończone 0
Rozpoczęcie przywracania OFFLINE 0
Dołączona baza danych jako DB_ID=5 1
Przygotowywanie kontenerów 534
Kontenery są gotowe 1097
Przywracanie zestawu kopii zapasowych 0
Szacowany całkowity rozmiar do przesłania =658460672 bajtów 0
Przesyłanie danych 1
BackupStream(0):Przetwarzanie MSDA o rozmiarze 10048 przydziałów 3282
BackupStream(0):Ukończono MSDA 0
Oczekiwanie na zakończenie zerowania dziennika 3
Zerowanie dziennika zakończone 0
BackupStream(0):przetwarzanie MSTL (FID=2, VLFID=101, size=65536 bajtów) 1024
Transfer danych zakończony 14
Zestaw kopii zapasowej został przywrócony 45
Rozpoczyna się przewijanie offline 1
Przetwarzanie 68 nagłówków VLF 69
Przetwarzanie nagłówków VLF zakończone 11
Pierwszy numer LSN:101:111920:43, ostatni numer LSN:101:111960:1 0
Zatrzymaj LSN:101:111960:1 4
Przewijanie offline jest zakończone 17
Naprawianie bazy danych zakończone 2
Przenoszenie bazy danych do ONLINE 2
Ponowne uruchamianie bazy danych w trybie ONLINE 87
PostRestoreContainerFixups rozpoczyna się 5
PostRestoreContainerFixups zakończone 2
Rozpoczyna się PostRestoreReplicationFixup 107
PostRestoreReplicationFixup jest ukończony 2
Baza danych została zrestartowana 9
Wznawianie wszelkich zatrzymanych indeksowań pełnotekstowych 6
Zapisywanie rekordów historii 13
Zapisywanie rekordów historii zakończone (upłynął =13 ms) 2
Konserwacja MSDB zakończona 2
Zakończono PRZYWRACANIE BAZY DANYCH 0

Dane zdarzeń dla operacji przywracania

Jeśli rozwiązujesz problemy z powolną operacją tworzenia kopii zapasowej lub przywracania, możesz łatwo filtrować według czasu trwania, aby na przykład widzieć tylko zdarzenia trwające dłużej niż n milisekund. Jedyną rzeczą, której nie widzę w tych danych wyjściowych, jest jakikolwiek sposób na stwierdzenie, czy podczas przywracania działało natychmiastowe inicjowanie pliku — nadal możesz potrzebować flagi śledzenia 3004, jak opisano w moim poście na wtorek z T-SQL z zeszłego miesiąca.

Nie zapomnij zatrzymać sesji (ale możesz zachować definicję sesji na serwerze, aby móc jej ponownie użyć):

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

Nie przeprowadziłem żadnych testów wydajności ani analizy wpływu, ale ogólnie powiedziałbym, że – podobnie jak flagi śledzenia – nie jest to coś, co chciałbyś uruchamiać przez cały czas, ale tylko podczas rozwiązywania problemów z określoną operacją. Nieco łatwiej jest skonfigurować tę sesję i zapytać o dane, IMHO, niż włączać flagi śledzenia i analizować wszystkie dane wyjściowe z dziennika błędów SQL Server.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak analizować ciągi jak profesjonalista za pomocą funkcji SQL SUBSTRING()?

  2. Rozszerzenie zastosowań DBCC CLONEDATABASE

  3. Łączenie F# z Salesforce.com

  4. Przynieś własną chmurę dostępną dla DigitalOcean

  5. ZDLRA – RMAN-20035 nieprawidłowy wysoki RECID