¡Hola, chicos!
¿Todo en paz?
Con este artículo, me gustaría demostrarle cómo saber cuánto tiempo ha estado en línea la instancia o cuándo se lanzó. Esta información se puede utilizar de diferentes maneras, como crear un monitor de cuándo se reinició el servicio SQL y luego iniciar una auditoría de quién lo reinició o el motivo por el cual se reinició el servicio, por ejemplo.
Demostraré algunas soluciones que conozco a continuación y señalaré que, generalmente, las fechas tienen pequeñas diferencias con la fecha/hora devuelta entre los métodos.
Alternativa n.º 1: dm_os_sys_info
Una forma práctica y sencilla de saber cuándo se inició por última vez el servicio SQL Server es consultando el DMV sys.dm_os_sys_info, disponible a partir de SQL Server 2008 en adelante. Esta es la forma más confiable de obtener esta información..
Permiso requerido: VER ESTADO DEL SERVIDOR
SELECT sqlserver_start_time FROM sys.dm_os_sys_info
Alternativa n.º 2: sys.databases
Otra forma de obtener cuándo se inició el servicio por última vez es consultando la vista del sistema sys.databases (disponible en SQL Server 2008) y observando la fecha de creación de la base de datos tempdb. Como sabes, esta base de datos se recrea cada vez que se inicia la instancia.
Permiso requerido: VER ESTADO DEL SERVIDOR
SELECT create_date
FROM sys.databases
WHERE [name] = 'tempdb'
Sin embargo, recrear tempdb no es lo primero que hace SQL Server durante el proceso de carga del servicio SQL; de hecho, las bases de datos de los usuarios se inician (proceso de recuperación) antes de recrear tempdb. En escenarios donde la rutina de recuperación de la base de datos lleva mucho tiempo, puede haber una gran diferencia entre la hora de inicio de la instancia y la fecha de recreación de tempdb.
Alternativa n.º 3: sys.sysdatabases
Otra vista que podemos usar para satisfacer las necesidades de esta publicación es sys.sysdatabases, disponible desde SQL Server 2000. La idea es la misma que sys.databases (Alternativa #2).
Permiso requerido: VER ESTADO DEL SERVIDOR
SELECT crdate
FROM sys.sysdatabases
WHERE [name] = 'tempdb'
Vale la pena señalar que esta vista está marcada como obsoleta y será eliminada en futuras versiones de SQL Server, por lo que recomiendo usar esta alternativa solo en casos de compatibilidad con versiones anteriores.
Alternativa n.º 4: sys.dm_exec_sessions
Usando la vista sys.dm_exec_sessions (disponible desde SQL Server 2008 en adelante) también podemos satisfacer las necesidades de esta publicación filtrando por sesión 1 (las sesiones con sid < 50 son todas internas de SQL).
Permiso requerido: VER ESTADO DEL SERVIDOR
SELECT login_time
FROM sys.dm_exec_sessions
WHERE session_id = 1
Alternativa #5: sys.traces
Usando la vista sys.traces (disponible en SQL Server 2005) filtrando por la columna is_default = 1, verá la fecha de creación del seguimiento predeterminado de SQL Server, que se recrea cada vez que se reinicia la instancia.
Permiso requerido: VER EL ESTADO DEL SERVIDOR y ALTERAR EL SEGUIMIENTO
SELECT start_time
FROM sys.traces
WHERE is_default = 1
Vale la pena recordar que esta característica se marcó como obsoleta a partir de SQL Server 2012 y debe ser reemplazada en futuras versiones del producto por system_health, que implementa esta característica mediante Extended Events (XE).
Alternativa n.º 6: sys.dm_io_virtual_file_stats
Presentando otra alternativa más, tenemos DMV sys.dm_io_virtual_file_stats, que nos brinda estadísticas de E/S con respecto a archivos de datos y registros de bases de datos.
Permiso requerido: VER ESTADO DEL SERVIDOR
SELECT DATEADD(ms, -sample_ms, GETDATE()) AS StartTime
FROM sys.dm_io_virtual_file_stats(1,1)
Para satisfacer nuestras necesidades, usaremos la columna sample_ms, que, según BOL, devuelve el número de milisegundos desde que se inició la computadora. Es decir, con esta consulta tenemos información incluso antes del inicio de SQL Server, que es cuando se inició el servidor que está ejecutando el servicio SQL Server.
Como habrás notado en la captura de pantalla anterior, probablemente hubo un error en este DMV, ya que la fecha teórica de inicio del servidor es mucho posterior a las otras fechas de inicio del servicio SQL Server, utilizando las otras alternativas en esta publicación.
Alternativa n.º 7: xp_readerrorlog o sp_readerrorlog
Usando el procedimiento almacenado del sistema xp_readerrorlog (disponible desde SQL Server 2005 en adelante), podemos leer el archivo de registro de SQL Server y buscar la cadena que contiene el registro cuando se inició el servicio.
Esta información, a pesar de ser un poco más difícil de obtener, es una de las más fiables, aunque la documentación de Microsoft nos informa que el SP del sistema sp_cycle_errorlog se puede utilizar internamente para reciclar los archivos de registro, sin necesidad de reiniciar la instancia, por lo que no podrás recuperar esta información, si esto sucede.
Permiso requerido: VER EL ESTADO DEL SERVIDOR y ser miembro del rol de servidor securityadmin
DECLARE @Retorno TABLE ( [LogDate] DATETIME, [ProcessInfo] NVARCHAR(12), [Text] NVARCHAR(3999) )
INSERT INTO @Retorno
EXEC xp_readerrorlog 0, 1, N'Copyright (c) Microsoft Corporation'
SELECT LogDate FROM @Retorno
Los sistemas SP xp_readerrorlog y sp_readerrorlog son muy similares entre sí. De hecho, sp_readerrorlog realiza algún procesamiento en la entrada de datos e internamente ejecuta xp_readerrorlog.
Vale la pena señalar que hay algunos informes de errores en las versiones 2012 y posteriores, al intentar usar un valor varchar en el tercer y cuarto parámetro de xp_readerrorlog (solo funciona con NVARCHAR), y eso no ocurre en sp_readerrorlog.
Si quieres saber un poco más sobre estos SP’s del sistema, lee mi post Procedimientos extendidos no documentados de SQL Server.
Alternativa n.º 8: sys.dm_server_services
Utilizando la DMV sys.dm_server_services (disponible a partir de SQL Server 2008 R2 SP1 en adelante), podemos consultar información relativa a los servicios de la instancia, como el propio servicio SQL Server y también el Agente SQL, Búsqueda de texto completo y otros.
Permiso requerido: VER ESTADO DEL SERVIDOR
SELECT last_startup_time
FROM sys.dm_server_services
WHERE ServiceName LIKE 'SQL Server (%'
Alternativa #9: sys.sysprocesses
Usando la vista del sistema sys.sysprocesses (disponible a partir de SQL Server 2000 en adelante), podemos verificar información sobre los procesos abiertos en la instancia. Para intentar identificar la fecha en que la instancia entró en línea, tomemos el primer proceso abierto (spid = 1), en una técnica similar a la alternativa n.° 4.
Permiso requerido: VER ESTADO DEL SERVIDOR
SELECT login_time
FROM sys.sysprocesses
WHERE spid = 1
Alternativa #10: msdb.dbo.syssessions
Cada vez que se inicia el servicio del Agente SQL, se agrega un registro en la tabla msdb.dbo.syssessions con el ID de la nueva sesión del Agente y la marca de tiempo de este evento. De esta manera, esta tabla registra el historial de cuándo se inició el Agente.
Normalmente, este servicio se inicia junto con el servicio SQL Server, pero este es un punto de falla para esta alternativa (cuando no lo hace). Otro punto débil de esta solución es que el Agente tarda unos segundos en iniciarse, lo que significa que la hora no está tan sincronizada con la hora de inicio del servicio SQL Server.
Si quieres ver más ejemplos de sesiones de sistema, lee mi publicación. Cómo consultar el historial de inicio del Agente SQL en SQL Server.
Permiso requerido: VER ESTADO DEL SERVIDOR
SELECT MAX(agent_start_date) AS agent_start_date
FROM msdb.dbo.syssessions
¡Eso es todo, amigos!
Espero que hayas disfrutado de esta publicación y ¡hasta la próxima!
Servidor SQL: ¿cuánto tiempo ha estado la instancia en línea cuando se inició el servicio?
Servidor SQL: ¿cuánto tiempo ha estado la instancia en línea cuando se inició el servicio?
servidor SQL cuando el servicio de instancia de fecha y hora se puso en línea y se puso en línea
servidor SQL cuando el servicio de instancia de fecha y hora se puso en línea y se puso en línea













Comentários (0)
Carregando comentários…