Database
 sql >> база данни >  >> RDS >> Database

T-SQL вторник #67 :Ново архивиране и възстановяване на разширени събития

За T-SQL вторник от миналия месец написах за някои недокументирани флагове за проследяване, които ви помагат да гледате продължителни операции за архивиране и възстановяване. Този месец темата на Джес Борланд е Разширени събития и реших да покажа нови възможности в SQL Server 2016, които до голяма степен правят тези флагове за проследяване остарели.

Ако играете с CTP2 (можете да го изтеглите тук), може да забележите нова категория backup_restore и ново събитие backup_restore_progress_trace :

Откриване на ново събитие в диалоговия прозорец Нова сесия на CTP2

Ето бърза и мръсна XE сесия за улавяне на данните за това събитие (добавих коментари за филтриране само за операции за архивиране или само за възстановяване; по подразбиране и двете са включени):

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

Сега, да кажем, че изпълнявам следните операции – създавам база данни, поставям малко данни в нея, пускам я и я възстановявам:

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;

Сега можем да потърсим данните от целевия файл за събитие:

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

За резервно копие флагът за проследяване 3226 не потиска нито един от изходните данни, уловени от разширени събития. Пропуснах изходните колони, поради филтрите, за краткост:

Съобщение Продължителност
(милисекунди)
БАЗА ДАННИ ЗА РЕЗЕРВНО копие стартира 0
Отваряне на базата данни със S заключване 0
Получаване на групово заключване на базата данни 0
Синхронизирането с други операции в базата данни е завършено 19
Отваряне на набора от резервни носители 7
Наборът носители за архивиране е отворен 0
Подготовка на медийния комплект за писане 0
Наборът от медии е готов за архивиране 0
Ефективни опции:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB 0
Изчистване на диференциални растерни изображения 4
Диференциалните растерни изображения са изчистени 0
Писане на контролна точка 6
Контролната точка е завършена (изминало =6 ms) 0
Начален LSN:101:111920:43, SERepl LSN:0:0:0 0
Сканиране на растерни карти за разпределение 4
Сканирането на растерни изображения за разпределение е завършено 0
Изчисляване на очаквания размер на общите данни 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 байта 0
Прогнозен общ размер =658460672 байта (размер на данните =658440192 байта, размер на регистрационния файл =20480 байта) 0
Оценката на работата е завършена 0
Последен LSN:101:111960:1 0
Писане на водещите метаданни 0
BackupStream(0):Записване на водещи метаданни към устройството c:\temp\floob.bak 1
Изчисляване на очаквания размер на общите данни 0
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 0
TotalSize=658440192 байта 1
Копиране на файлове с данни 2
Брой четци на файлове с данни =1 0
Четене на файла с данни D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf 0
BackupStream(0):Писане на MSDA с размер 10048 екстенти 391
30 процента (198180864/658460672 байта) обработени 554
60 процента (395313152/658460672 байта) обработени 576
90 процента (593494016/658460672 байта) обработени 184
Завършено четенето на файла с данни D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf 2
BackupStream(0):Допълване на MSDA с 65536 байта 0
Резервен поток(0):общ размер на MSDA =10048 екстента 0
InitialExpectedSize=658440192 байта, FinalSize=658440192 байта, ExcessMode=0 0
Последен LSN:101:111960:1 0
Копирането на файлове с данни приключи 0
Копиране на дневника на транзакциите 0
MediaFamily(0):FID=2, VLFID=101, DataStreamSize=65536 байта 4
Копирането на регистъра на транзакциите е завършено 0
Записване на крайните метаданни 0
BackupStream(0):Записване на крайни метаданни към устройството c:\temp\floob.bak 0
Записване на края на резервния набор 30
Записи на историята на писане 12
Записите в историята на записа са завършени (изминало =11 ms) 0
РЕзервното копие на БАЗА ДАННИ приключи 0

Данни за събитие за операция за архивиране

За възстановяване ще видите тези редове:

Съобщение Продължителност
(милисекунди)
ВЪЗСТАНОВЯВАНЕ НА БАЗА ДАННИ стартира 0
Отваряне на резервния комплект 3
Обработка на водещите метаданни 0
Планирането започва 23
Ефективни опции:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB 0
Планирането е завършено 0
Започва офлайн възстановяване 0
Прикачена база данни като DB_ID=5 1
Подготовка на контейнери 534
Контейнерите са готови 1097
Възстановяване на резервния набор 0
Прогнозен общ размер за прехвърляне =658460672 байта 0
Прехвърляне на данни 1
BackupStream(0):Обработка на MSDA с размер 10048 екстента 3282
BackupStream(0):Завършен MSDA 0
Изчаква се завършване на нулирането на журнала 3
Нулирането на регистрационния файл е завършено 0
BackupStream(0):Обработка на MSTL (FID=2, VLFID=101, размер=65536 байта) 1024
Прехвърлянето на данни е завършено 14
Резервният набор е възстановен 45
Офлайн превъртането напред започва 1
Обработка на 68 VLF заглавки 69
Обработката на VLF заглавките е завършена 11
Първи LSN:101:111920:43, Последен LSN:101:111960:1 0
Спри LSN:101:111960:1 4
Офлайн превъртането напред е завършено 17
Ремонтът на базата данни е завършен 2
Прехвърляне на базата данни към ОНЛАЙН 2
Рестартиране на база данни за ОНЛАЙН 87
PostRestoreContainerFixups започва 5
PostRestoreContainerFixups е завършен 2
PostRestoreReplicationFixup започва 107
PostRestoreReplicationFixup е завършен 2
База данни се рестартира 9
Възобновяване на всяко спряно обхождане на пълен текст 6
Записи на историята на писане 13
Записите в историята на записа са завършени (изминало =13 ms) 2
Поддръжката на MSDB е завършена 2
ВЪЗСТАНОВЯВАНЕТО НА БАЗА ДАННИ приключи 0

Данни за събитие за операция по възстановяване

Ако отстранявате неизправности при бавно архивиране или възстановяване, можете лесно да филтрирате продължителността, така че да виждате само събития, които са отнели повече от n милисекунди, например. Единственото нещо, което не виждам в този изход, е някакъв начин да разбера дали мигновената инициализация на файл е била в сила по време на възстановяването – все още може да се нуждаете от флаг за проследяване 3004, както е описано в публикацията ми за T-SQL вторник от миналия месец.

Не забравяйте да спрете сесията (но не се колебайте да запазите дефиницията на сесията на сървъра, за да можете да я използвате отново):

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

Не извърших никакви тестове за производителност или анализ на въздействието, но като цяло бих казал, че – подобно на флаговете за проследяване – това не е нещо, което бихте искали да работите през цялото време, а само при отстраняване на неизправности при конкретна операция. Малко по-лесно е да настроите тази сесия и да направите заявка за данните, IMHO, отколкото да включите флаговете за проследяване и да анализирате целия изход от регистъра за грешки на 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. Често срещани задачи на Postgres на CentOS 7

  2. Как да филтрирате записи с агрегатна функция COUNT

  3. Команда за T-SQL неща

  4. Как да създадете изглед в SQL

  5. Основи на табличните изрази, част 8 – CTEs, съображенията за оптимизация продължават