Skip to content

Script para monitorear el funcionamiento del proceso de log shipping en SQL Server

11/09/2014
SQLServerLogo

El proceso de log shipping es una de las técnicas de alta disponibilidad más simples de implementar y en muchos casos nos puede brindar una solución económica y robusta a nuestras necesidades de replicación de datos en SQL Server.

En notas anteriores presenté mejoras a esta implementación, como la posibilidad de comprimir los backups que se utilizan en el proceso de log shipping. En esta oportunidad me dedicaré a un script de TSQL que permite determinar el correcto funcionamiento del log shipping a partir de verificar que se hayan restaurado sobre la base secundaria los correspondientes backups del log de transacciones tomados de la base primaria.

Este script que he desarrollado recorre todas las bases configuradas para log shipping y obtiene las operaciones de restore que se realizaron sobre la misma, seleccionando luego la más reciente y comparando su fecha y hora con un parámetro de tolerancia. Funciona en todas las versiones de SQL Server a partir de la 2005:

USE msdb
GO

DECLARE @mins int
SET @mins = 60; –Tolerancia en minutos para la última operación de restore

WITH UltimosRestore AS
( SELECT  ls.secondary_database AS DB,
rsh.user_name AS [Restored By],
CASE WHEN rsh.restore_type = ‘D’ THEN ‘Database’
WHEN rsh.restore_type = ‘F’ THEN ‘File’
WHEN rsh.restore_type = ‘G’ THEN ‘Filegroup’
WHEN rsh.restore_type = ‘I’ THEN ‘Differential’
WHEN rsh.restore_type = ‘L’ THEN ‘Log’
WHEN rsh.restore_type = ‘V’ THEN ‘Verifyonly’
WHEN rsh.restore_type = ‘R’ THEN ‘Revert’
ELSE rsh.restore_type
END AS [Restore Type],
rsh.restore_date AS [Restore Started],
bmf.physical_device_name AS [Restored From],
rf.destination_phys_name AS [Restored To], RANK() OVER (PARTITION BY [Database_name] ORDER BY [Restore_date] DESC) as NroRestore
FROM log_shipping_secondary_databases LS LEFT JOIN sys.databases DB ON LS.secondary_database= DB.name
LEFT JOIN msdb.dbo.restorehistory rsh ON rsh.destination_database_name=DB.name AND rsh.restore_date >= DATEADD(n, @mins*(-1), GETDATE()) –Busca en los restore de los últimos minutos
LEFT JOIN msdb.dbo.backupset bs ON rsh.backup_set_id = bs.backup_set_id
LEFT JOIN msdb.dbo.restorefile rf ON rsh.restore_history_id = rf.restore_history_id
LEFT JOIN msdb.dbo.backupmediafamily bmf ON bmf.media_set_id = bs.media_set_id
)

SELECT db as Base
FROM UltimosRestore
WHERE NroRestore=1 and [Restore Started] is null
ORDER BY db

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: