Para el martes de T-SQL del mes pasado, escribí sobre algunos indicadores de seguimiento no documentados que lo ayudan a cuidar las operaciones de copia de seguridad y restauración de ejecución prolongada. Este mes, el tema de Jes Borland es Eventos extendidos, y pensé que mostraría nuevas capacidades en SQL Server 2016 que en gran medida hacen que estas marcas de seguimiento queden obsoletas.
Si está jugando con CTP2 (puede descargarlo aquí), puede notar una nueva categoría backup_restore
y nuevo evento backup_restore_progress_trace
:
Descubrimiento de un nuevo evento en el cuadro de diálogo Nueva sesión de CTP2
Aquí hay una sesión XE rápida y sucia para capturar los datos de este evento (he agregado comentarios para filtrar solo operaciones de copia de seguridad o solo restauración; de manera predeterminada, ambas están incluidas):
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
Ahora, supongamos que ejecuto las siguientes operaciones:crear una base de datos, hacer una copia de seguridad de algunos datos, soltarla y restaurarla:
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;
Ahora, podemos consultar los datos del archivo de destino del evento:
;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;
Para una copia de seguridad, el indicador de seguimiento 3226 no suprime ninguno de los resultados capturados por Extended Events. He dejado fuera las columnas de salida, debido a los filtros, por brevedad:
Mensaje | Duración (Milisegundos) |
---|---|
BASE DE RESPALDO DE DATOS iniciada | 0 |
Abriendo la base de datos con S lock | 0 |
Adquisición de bloqueo de operaciones masivas en la base de datos | 0 |
La sincronización con otras operaciones en la base de datos está completa | 19 |
Apertura del conjunto de medios de copia de seguridad | 7 |
El conjunto de medios de copia de seguridad está abierto | 0 |
Preparación del juego de medios para escribir | 0 |
El conjunto de medios está listo para la copia de seguridad | 0 |
Opciones efectivas:Checksum=0, Compression=1, Encryption=0, BufferCount=7, MaxTransferSize=1024 KB | 0 |
Borrado de mapas de bits diferenciales | 4 |
Los mapas de bits diferenciales se borran | 0 |
Escribir un punto de control | 6 |
El punto de control está completo (transcurrido =6 ms) | 0 |
Iniciar LSN:101:111920:43, SERepl LSN:0:0:0 | 0 |
Escaneo de mapas de bits de asignación | 4 |
La exploración de mapas de bits de asignación está completa | 0 |
Cálculo del tamaño esperado de los datos totales | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TamañoTotal=658440192 bytes | 0 |
Tamaño total estimado =658460672 bytes (tamaño de datos =658440192 bytes, tamaño de registro =20480 bytes) | 0 |
La estimación del trabajo está completa | 0 |
Último LSN:101:111960:1 | 0 |
Escribir los principales metadatos | 0 |
BackupStream(0):escritura de metadatos principales en el dispositivo c:\temp\floob.bak | 1 |
Cálculo del tamaño esperado de los datos totales | 0 |
FID=1, ExpectedExtents=10047, IsDifferentialMapAccurate=0 | 0 |
TamañoTotal=658440192 bytes | 1 |
Copiar archivos de datos | 2 |
Número de lectores de archivos de datos =1 | 0 |
Leyendo el archivo de datos D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf | 0 |
BackupStream(0):Escritura de MSDA de tamaño 10048 extensiones | 391 |
30 por ciento (198180864/658460672 bytes) procesado | 554 |
60 por ciento (395313152/658460672 bytes) procesado | 576 |
90 por ciento (593494016/658460672 bytes) procesado | 184 |
Se completó la lectura del archivo de datos D:\SQL Server\MSSQL13.SQL16\DATA\floob.mdf | 2 |
BackupStream(0):MSDA de relleno con 65536 bytes | 0 |
BackupStream(0):tamaño total de MSDA =10048 extensiones | 0 |
InitialExpectedSize=658440192 bytes, FinalSize=658440192 bytes, ExcessMode=0 | 0 |
Último LSN:101:111960:1 | 0 |
La copia de archivos de datos está completa | 0 |
Copiar registro de transacciones | 0 |
Familia de medios(0):FID=2, VLFID=101, DataStreamSize=65536 bytes | 4 |
La copia del registro de transacciones está completa | 0 |
Escribir los metadatos finales | 0 |
BackupStream(0):escritura de metadatos finales en el dispositivo c:\temp\floob.bak | 0 |
Escribir el final del conjunto de copia de seguridad | 30 |
Escribir registros históricos | 12 |
La escritura de registros del historial está completa (transcurrido =11 ms) | 0 |
RESPALDO DE BASE DE DATOS finalizado | 0 |
Datos de eventos para una operación de copia de seguridad
Para una restauración, verá estas filas:
Mensaje | Duración (Milisegundos) |
---|---|
RESTAURAR BASE DE DATOS iniciada | 0 |
Abrir el conjunto de copia de seguridad | 3 |
Procesando los principales metadatos | 0 |
Comienza la planificación | 23 |
Opciones efectivas:Checksum=0, Compression=1, Encryption=0, BufferCount=6, MaxTransferSize=1024 KB | 0 |
La planificación está completa | 0 |
Comenzando la restauración SIN CONEXIÓN | 0 |
Base de datos adjunta como DB_ID=5 | 1 |
Preparación de recipientes | 534 |
Los contenedores están listos | 1097 |
Restauración del conjunto de copia de seguridad | 0 |
Tamaño total estimado para transferir =658460672 bytes | 0 |
Transferencia de datos | 1 |
BackupStream(0):procesamiento de MSDA de tamaño 10048 extensiones | 3282 |
BackupStream(0):MSDA completado | 0 |
Esperando que se complete la puesta a cero del registro | 3 |
La puesta a cero del registro está completa | 0 |
BackupStream(0):Procesando MSTL (FID=2, VLFID=101, tamaño=65536 bytes) | 1024 |
La transferencia de datos está completa | 14 |
El conjunto de copia de seguridad se ha restaurado | 45 |
Comienza el avance sin conexión | 1 |
Procesando 68 encabezados VLF | 69 |
El procesamiento de encabezados VLF está completo | 11 |
Primer LSN:101:111920:43, Último LSN:101:111960:1 | 0 |
Detener LSN:101:111960:1 | 4 |
La actualización sin conexión está completa | 17 |
La reparación de la base de datos está completa | 2 |
Transición de la base de datos a EN LÍNEA | 2 |
Reiniciar base de datos para ONLINE | 87 |
Comienza PostRestoreContainerFixups | 5 |
PostRestoreContainerFixups está completo | 2 |
Comienza PostRestoreReplicationFixup | 107 |
PostRestoreReplicationFixup está completo | 2 |
La base de datos se reinicia | 9 |
Reanudar cualquier rastreo de texto completo detenido | 6 |
Escribir registros históricos | 13 |
La escritura de registros del historial está completa (transcurrido =13 ms) | 2 |
El mantenimiento de MSDB está completo | 2 |
RESTAURAR BASE DE DATOS terminado | 0 |
Datos de eventos para una operación de restauración
Si está solucionando un problema de una operación de copia de seguridad o restauración lenta, puede filtrar fácilmente la duración, de modo que solo vea los eventos que tardaron más de n milisegundos, por ejemplo. Lo único que no veo en esta salida es alguna forma de saber si la inicialización instantánea del archivo estaba en efecto durante la restauración; es posible que aún necesite el indicador de seguimiento 3004, como se describe en mi publicación del martes de T-SQL del mes pasado.
No olvide detener la sesión (pero siéntase libre de mantener la definición de la sesión en el servidor, para que pueda usarla nuevamente):
ALTER EVENT SESSION [Backup progress] ON SERVER STATE = STOP;
No realicé ninguna prueba de rendimiento ni análisis de impacto, pero, en general, diría que, al igual que las marcas de rastreo, esto no es algo que desee ejecutar todo el tiempo, sino solo cuando soluciona problemas en una operación específica. Es un poco más fácil configurar esta sesión y consultar los datos, en mi humilde opinión, que activar los indicadores de seguimiento y analizar todos los resultados del registro de errores de SQL Server.