Removendo o SQL Server Management Data Warehouse (Data Collector)

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.

Comentários
Página 1 de 1 (8 itens)