Estou tentando rastrear... algo ... que está fazendo uma conexão com um banco de dados específico sem (aparentemente) fazer nada com a conexão. No entanto, até agora não tive sorte.
Os dados deste banco de dados foram migrados para outros bancos de dados no mesmo servidor, e após os desenvolvedores confirmarem que alteraram/retiram todo o acesso a este banco de dados específico (incluindo strings de conexão que foram incorporadas, mas não utilizadas), renomeamos o banco de dados para algo como DBNAME_Old
. No entanto, isso fez com que erros dispersos fossem gerados. Renomeamos o banco de dados de volta para o nome original e os erros desapareceram. No entanto, depois de examinar seu código, os desenvolvedores ainda não conseguiram identificar nenhum outro pedaço de código que pudesse estar causando os problemas.
O código que acessa o banco de dados não está acessível para mim (ou eu mesmo o teria pesquisado).
Em seguida, configurei um trabalho agendado que tentava identificar todas as conexões feitas ao banco de dados. Eu poderia identificar os processos em execução no banco de dados por meio de vários métodos, mas nada aparecia enquanto meu monitoramento estava em execução (com relativa pouca frequência, pois não havia produção interrompida).
Eu então tentei alguns procedimentos de eventos estendidos:
-- Attempt 1 -
CREATE EVENT SESSION [DBToMonitorMonitoring] ON SERVER
ADD EVENT sqlserver.connectivity_ring_buffer_recorded(
ACTION(sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_nt_username,sqlserver.session_server_principal_name,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],N'DBToMonitor') AND [sqlserver].[session_server_principal_name]<>N'[THEDOMAIN\Domain_Login]')),
ADD EVENT sqlserver.login(SET collect_options_text=(1)
ACTION(sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_nt_username,sqlserver.session_server_principal_name,sqlserver.sql_text,sqlserver.username)
WHERE ([database_name]=N'DBToMonitor' OR [sqlserver].[database_name]=N'DBToMonitor')),
ADD EVENT sqlserver.logout(
ACTION(sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_nt_username,sqlserver.session_server_principal_name,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[database_name]=N'DBToMonitor')),
ADD EVENT sqlserver.rpc_starting(SET collect_statement=(1)
ACTION(sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_nt_username,sqlserver.session_server_principal_name,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],N'DBToMonitor') AND [sqlserver].[session_server_principal_name]<>N'[THEDOMAIN\Domain_Login]')),
ADD EVENT sqlserver.sql_batch_starting(
ACTION(sqlserver.client_app_name,sqlserver.client_connection_id,sqlserver.client_hostname,sqlserver.database_name,sqlserver.nt_username,sqlserver.server_principal_name,sqlserver.session_nt_username,sqlserver.session_server_principal_name,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],N'DBToMonitor') AND [sqlserver].[not_equal_i_sql_unicode_string]([sqlserver].[session_server_principal_name],N'AMERICAS\DTNA_S_SQLService')))
ADD TARGET package0.ring_buffer(SET max_events_limit=(400))
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO
-- Attempt 2 - Found on the internet
CREATE EVENT SESSION [DBToMonitor_DB_Usage] ON SERVER
ADD EVENT sqlserver.sql_statement_completed(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.username)
WHERE ([sqlserver].[database_name]=N'DBToMonitor'))
ADD TARGET package0.event_file(SET filename=N'D:\Traces\DBToMonitor_DB_Usage.xel',metadatafile=N'D:\Traces\DBToMonitorDB_Usage.xem')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
GO
Embora o segundo pudesse identificar conexões diretas feitas ao banco de dados, ele não conseguiu identificar casos comoSELECT TOP 1 * FROM DBToMonitor.dbo.SampleTable
Quaisquer recomendações para identificar qualquer conexão feita aos dados em um banco de dados específico, ou qualquer login, mesmo que nenhum dado seja tocado no banco de dados, seria totalmente apreciada aqui, porque cheguei ao fim dos meus recursos aqui, além de bater o servidor com monitoramento contínuo que deixaria a produção de joelhos.
Ajuda?