Compartilhar via


Removendo o SQL Server Management Data Warehouse (Data Collector)

Introdução

O Data Collector é um componente presente desde o SQL Server 2008 e coleta diferentes informações dos bancos de dados. Todas as informações coletadas são armazenadas em uma base de dados chamada Management Data Warehouse e posteriormente alguns relatórios podem ser extraídos com esses dados.

Esse componente é muito utilizado pelas informações apresentadas através de seus relatórios e também por ser de fácil configuração, mas o problema é quando o usuário deseja remover por completo a solução.

A remoção do MDW (Management Data Warehouse) não é suportada, mas no SQL Server 2012 uma nova Stored Procedure foi adicionada para auxiliar nesse ponto e pode ser executada em versões anteriores.

Vamos avançar para o entendimento do que é criado no processo de configuração e como remover tudo que é criado em seu ambiente. 

Composição

Ao fim da criação do Management Data Warehouse um job chamado de “mdw_purge_data_[MDW]” é criado, esse tem o objeto de limpar os dados de tempos em tempos.

Após a etapa de configurar a instância para ter seus dados coletados, outros 5 jobs (coletores) são criados:

  • “collection_set_1_noncached_collect_and_upload”
  •  “collection_set_2_collection”,
  • “collection_set_2_upload”,
  • “collection_set_3_collection”
  • “collection_set_3_upload”.

Para o SQL Server 2012 3 jobs adicionais são incluídos:

  • “sysutility_get_cache_tables_data_into_aggregate_tables_daily”
  • “sysutility_get_cache_tables_data_into_aggregate_tables_hourly”
  • “sysutility_get_views_data_into_cache_tables”

Remoção

Vamos tentar remover da maneira mais intuitiva.

Vá até cada coletor e pare o serviço de coleta, após esse processo os Jobs estarão desabilitados, com exceção dos “mdw_purge_data” e “sysutility”, você pode ainda desabilitar o próprio Data Collector indo nas propriedades do componente. Na sequência ao tentar excluir os Jobs que não serão mais utilizados, reparem que isso não será possível devido a uma série de restrições associadas a tabela de sistema MSDB.

Essa seria a única maneira viável de exclusão, visto que, via interface de configuração não é apresentado em nenhum momento esse tipo de opção. 

Solução

No SQL Server 2012 a Microsoft adicionou a Stored Procedure “msdb.dbo.sp_syscollector_cleanup_collector” para realizar essa remoção.

Script:

USE msdb;

GO

*-- Disable constraints
*

-- this is done to make sure that constraint logic does not interfere with cleanup process

ALTER TABLE dbo.syscollector_collection_sets_internal

*  NOCHECK CONSTRAINT FK_syscollector_collection_sets_collection_sysjobs*

*ALTER TABLE dbo.syscollector_collection_sets_internal  *

*  NOCHECK CONSTRAINT FK_syscollector_collection_sets_upload_sysjobs*

*-- Delete data collector jobs
*

DECLARE @job_id uniqueidentifier

DECLARE datacollector_jobs_cursor CURSOR LOCAL

FOR

*  SELECT collection_job_id AS job_id FROM syscollector_collection_sets*

*  WHERE collection_job_id IS NOT NULL*

*  UNION*

*  SELECT upload_job_id AS job_id FROM syscollector_collection_sets*

*  WHERE upload_job_id IS NOT NULL*

*
OPEN datacollector_jobs_cursor
*

*FETCH NEXT FROM datacollector_jobs_cursor INTO @job_id*

*
WHILE (@@fetch_status = 0)
*

BEGIN

*  IF EXISTS ( SELECT COUNT(job_id) FROM sysjobs WHERE job_id = @job_id )*

*  BEGIN*

*    DECLARE @job_name sysname*

*    SELECT @job_name = name from sysjobs WHERE job_id = @job_id*

*    PRINT 'Removing job '+ @job_name*

*    EXEC dbo.sp_delete_job @job_id=@job_id, @delete_unused_schedule=0*

*  END*

*  FETCH NEXT FROM datacollector_jobs_cursor INTO @job_id*

END

*
CLOSE datacollector_jobs_cursor
*

DEALLOCATE datacollector_jobs_cursor

*-- Enable Constraints back
*

ALTER TABLE dbo.syscollector_collection_sets_internal

*  CHECK CONSTRAINT FK_syscollector_collection_sets_collection_sysjobs*

ALTER TABLE dbo.syscollector_collection_sets_internal

*  CHECK CONSTRAINT FK_syscollector_collection_sets_upload_sysjobs*

*
-- Disable trigger on syscollector_collection_sets_internal
*

-- this is done to make sure that trigger logic does not interfere with cleanup process

EXEC('DISABLE TRIGGER syscollector_collection_set_is_running_update_trigger

*     ON syscollector_collection_sets_internal')*

*-- Set collection sets as not running state
*

UPDATE syscollector_collection_sets_internal

SET is_running = 0

*
-- Update collect and upload jobs as null
*

UPDATE syscollector_collection_sets_internal

SET collection_job_id = NULL, upload_job_id = NULL

*
-- Enable back trigger on syscollector_collection_sets_internal
*

EXEC('ENABLE TRIGGER syscollector_collection_set_is_running_update_trigger

*     ON syscollector_collection_sets_internal')*

*
-- re-set collector config store
*

UPDATE syscollector_config_store_internal

SET parameter_value = 0

WHERE parameter_name IN ('CollectorEnabled')

*
UPDATE syscollector_config_store_internal
*

SET parameter_value = NULL

WHERE parameter_name IN ( 'MDWDatabase', 'MDWInstance' )

*
-- Delete collection set logs
*

DELETE FROM syscollector_execution_log_internal

Essa SP pode também ser utilizada no SQL Server 2008 e 2008 R2, mas não tão eficiente quanto no 2012.

A base de dados do MDW deve ser excluída manualmente, assim como, o job do “mdw_purge_data_[MDW]” . Os  Schedules existentes também podem ser excluídos, mas não recomendo, pois apesar de parecerem que foram criados junto do MDW, eles são adicionados por padrão na instalação do SQL Server e são necessários para o futuro funcionamento do MDW, caso queiram habilitar novamente.

No SQL Server 2012 também devem ser exclído manualmente os jobs do "sysutility".

Conclusão

Podemos ver que o Management Data Warehouse não é fácil de remover em nenhuma das versões abordadas. Apesar de usarmos um script como parte da solução, existem questões que podem ficar para traz, como logins e usuários.