За 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.