web-dev-qa-db-fra.com

Le travail de collecteur de données d'activité du serveur échoue en raison de compteurs de performance

tL; DR: Quelle autorisation/configuration de Windows est nécessaire pour le travail de collecte de données "Activité Server" pour fonctionner avec succès?


Je passe SQL Server 2016 SP1 CU6 (13.0.4457.0) sur Windows Server 2012 R2 Datacenter.

Chaque fois que j'essaie d'exécuter le collecteur de données "Activité du serveur", le travail d'agent SQL Server échoue et je vois les trois erreurs suivantes dans le journal des événements d'application sur la case.

Impossible d'ouvrir l'objet de performance du service serveur. Les quatre premiers octets (DWORD) de la section de données contiennent le code d'état.

Source: Perfnet, ID d'événement: 2004

La procédure ouverte pour le service "WMIAPLL" in DLL "C:\WMIAPL.DLL" a échoué. Les données de performance de ce service ne seront pas disponibles. Les quatre premiers octets ( DWORD) de la section de données contient le code d'erreur.

Source: Perflib, ID d'événement: 1008

La procédure ouverte pour le service "bits" in DLL "c:\windows\system32\bitsperf.dll" a échoué. Les données de performance de ce service ne seront pas disponibles. Les quatre premiers octets (DWORD) de la section de données contient le code d'erreur.

Source: Perflib, ID d'événement: 1008

Cela se passe sur les 4 des boîtes SQL Server où je gère ces collectionneurs. Les deux autres collecteurs (statistiques de requête et utilisation du disque) fonctionnent bien sur les 4 serveurs.

Choses que j'ai essayées qui n'avaient aucun effet:

  • Ajoutez l'utilisateur de l'agent SQL Server (compte Windows) au groupe local "Utilisateurs de l'utilisateur" (- Source )
  • Rechargez la bibliothèque de performances avec la commande "LODCTR" ( source )
  • Allumez le service "Adaptateur de performance WMI" et défini sur Automatic ( Source )
  • Exécutez la commande LODCTR à C:\Windows au lieu de C:\Windows\System32 (- Source )

Enfin, j'ai essayé d'ajouter temporairement le compte Windows que SQL Server Agent fonctionne sur le groupe Administrateurs local sur l'une des cases et le redémarrant. Cela a permis au travail de fonctionner avec succès (bien que le BITS est toujours apparu dans le journal des événements de l'application). Inverser cette et le redémarrage a causé le travail de commencer à échouer à nouveau.

Je ne veux pas que ce compte de service soit un administrateur local sur cette case et je serais choqué s'il doit être. Quelles sont donc les autorisations minimales nécessaires à ce compte pour pouvoir accéder aux données de compteur de performance nécessaires à ce jeu de collecte de données?

J'ai scripté les détails du travail, au cas où vous serez utile:

USE [msdb]
GO

/****** Object:  Job [collection_set_2_collection]    Script Date: 3/1/2018 2:17:35 PM ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object:  JobCategory [Data Collector]    Script Date: 3/1/2018 2:17:35 PM ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'Data Collector' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'Data Collector'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback

END

DECLARE @jobId BINARY(16)
EXEC @ReturnCode =  msdb.dbo.sp_add_job @job_name=N'collection_set_2_collection', 
        @enabled=0, 
        @notify_level_eventlog=2, 
        @notify_level_email=0, 
        @notify_level_netsend=0, 
        @notify_level_page=0, 
        @delete_level=0, 
        @description=N'No description available.', 
        @category_name=N'Data Collector', 
        @owner_login_name=N'sa', @job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [collection_set_2_collection_collect]    Script Date: 3/1/2018 2:17:35 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'collection_set_2_collection_collect', 
        @step_id=1, 
        @cmdexec_success_code=0, 
        @on_success_action=1, 
        @on_success_step_id=0, 
        @on_fail_action=3, 
        @on_fail_step_id=0, 
        @retry_attempts=3, 
        @retry_interval=5, 
        @os_run_priority=0, @subsystem=N'CmdExec', 
        @command=N'dcexec -c -s 2 -i "$(ESCAPE_DQUOTE(MACH))\$(ESCAPE_DQUOTE(INST))" -m 0 -e $(ESCAPE_NONE(STOPEVENT))', 
        @flags=80
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object:  Step [collection_set_2_collection_autostop]    Script Date: 3/1/2018 2:17:35 PM ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'collection_set_2_collection_autostop', 
        @step_id=2, 
        @cmdexec_success_code=0, 
        @on_success_action=2, 
        @on_success_step_id=0, 
        @on_fail_action=2, 
        @on_fail_step_id=0, 
        @retry_attempts=0, 
        @retry_interval=0, 
        @os_run_priority=0, @subsystem=N'TSQL', 
        @command=N'exec dbo.sp_syscollector_stop_collection_set @collection_set_id=2, @stop_collection_job = 0', 
        @database_name=N'msdb', 
        @flags=16
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'RunAsSQLAgentServiceStartSchedule', 
        @enabled=1, 
        @freq_type=64, 
        @freq_interval=0, 
        @freq_subday_type=0, 
        @freq_subday_interval=0, 
        @freq_relative_interval=0, 
        @freq_recurrence_factor=0, 
        @active_start_date=20160430, 
        @active_end_date=99991231, 
        @active_start_time=0, 
        @active_end_time=235959, 
        @schedule_uid=N'ec88e0b9-88cf-454b-a4c1-0397ef849519'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
    IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO
4
Josh Darnell

Ajoutez le compte au Performance Monitor Users Groupe local sur le serveur que vous souhaitez surveiller; Ce groupe encapsule tous les droits de sécurité requis requis pour examiner les données de surveillance des performances.

Peut-être que journaux d'erreur de collecteur de données montrera quelques messages d'erreur détaillés?

1
Max Vernon