¿Cuándo se tomó una base de datos sin conexión?

9

Estoy tratando de encontrar una manera de averiguar cuándo un par de mis bases de datos sql se desconectaron.

Revisé los registros pero no pude encontrar ninguna información de este tipo y, además, no hay ningún rastreo predeterminado habilitado.

Solo tengo una información de que antes había un DBA que lo desconectó, pero no había correos electrónicos o una comunicación escrita como tal ...

¿Podemos encontrar información sobre esto?

por favor sugiera, gracias!

KASQLDBA
fuente

Respuestas:

11

Puede descubrir todos estos eventos que están en el ciclo de registro de eventos actual usando sp_readerrorlog:

EXEC sys.sp_readerrorlog @p1 = 0, @p2 = 1, @p3 = N'OFFLINE';

Puede recorrer los valores de @p1si no lo encuentra en el registro de eventos actual. De manera predeterminada, debería poder leer los 6 archivos de registro de errores actuales y anteriores, así que use 0-6 como argumentos para retroceder lo más posible (en mi sistema no pude obtener 0/ NULLagregar en todos los archivos de registro; YMMV )

Devolverá algo como esto:

LogDate        ProcessInfo Text
-------------  ----------- ---------------------------------------------------------
yyyy-mm-dd...  spid72      Setting database option OFFLINE to ON for database 'foo'.

Existe la posibilidad, por supuesto, de que el registro de errores se llene lo suficiente como para que los eventos ocurrieron antes del conjunto actual de registros de errores. En ese caso, no tienes suerte. Para mantener un historial de ejecución más largo en el futuro, puede cambiar la cantidad de registros de errores que se mantienen. En el Explorador de objetos, expanda Administración, haga clic con el botón derecho en Registros de SQL Server y elija Configurar. Allí puede cambiar la configuración de reciclaje del archivo de registro de errores, incluido el mantenimiento de los 99 archivos anteriores. También vea esta respuesta .

Tenga en cuenta que sp_readerrorloges indocumentado y no es compatible, aunque muchas personas han escrito al respecto . Al final, los archivos de registro de errores son solo archivos de texto sin formato, por lo que puede escribir su propio PowerShell, CLR, etc., que solo analiza los archivos y devuelve la misma información. Puede determinar dónde están los archivos de registro de errores para esta instancia utilizando:

SELECT SERVERPROPERTY('ErrorLogFileName');

Los archivos se nombrarán ERRORLOG, ERRORLOG.1, ERRORLOG.2, etc Usted puede ir y abrir los archivos en un editor de texto básico para ver la estructura, aunque me gustaría tener cuidado de no abrir el archivo actual en uso ( ERRORLOG).

Aaron Bertrand
fuente
Hola, Aaron: No he iniciado sesión sin conexión en mis registros de SQL Server. ¿Hay alguna configuración que nos permita ver este alter? Gracias
DBALUKE HUANG
@DBALUKEHUANG No, si sucedió antes de la primera entrada en el registro de errores, y no hay nada en el visor de eventos , no tiene suerte.
Aaron Bertrand
Sí Aaron, no hay nada relacionado con fuera de línea en los registros de SQL Server. Para el en línea, tiene los registros ... Me pregunto si hay alguna configuración especial para permitir que SQL Server detecte esto.
DBALUKE HUANG
@DBALUKEHUANG Solo recuerde que una base de datos puede desconectarse por razones que no sean alguien que la configure explícitamente OFFLINE. ¿Es offlinerealmente el estado en sys.databases?
Aaron Bertrand
4

Si la base de datos se estableció sin conexión:

es decir

alter database AdventureWorks2012
set offline;
go

Vería un mensaje registrado en el registro de errores de SQL Server:

Establecer la opción de base de datos OFFLINE en ON para la base de datos 'AdventureWorks2012'.

select *
from sys.messages
where language_id = 1033
and text like '%setting database option%for database%';

ID de mensaje de 5084 si está monitoreando cambios en las opciones de la base de datos.

Thomas Stringer
fuente