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.