Dela via


Konfigurationen kanske inte uppdateras i System Center Operations Manager

Den här artikeln innehåller en lösning på de problem som konfigurationsändringar inte kan uppdatera i en System Center Operations Manager-hanteringsgrupp.

Ursprunglig produktversion: System Center Operations Manager
Ursprungligt KB-nummer: 2635742

Symptom

Du kan uppleva ett eller flera av följande symptom i en System Center Operations Manager-hanteringsgrupp:

  • Nyligen installerade agenter visas som Ej övervakade i driftkonsolen, men befintliga agenter övervakas.
  • En eller flera övervakare på en eller flera agenter kanske inte ändrar tillstånd när felfria eller felaktiga villkor uppfylls.
  • Agenter visas som i underhållsläge i driftkonsolen, men arbetsflödena tas inte bort av System Center Management-tjänsten på den övervakade datorn.
  • Konfigurationsändringar, nya regler, övervakare eller åsidosättningar tillämpas inte på vissa agenter.
  • Operations Manager-händelseloggen på en eller flera agenter visar händelse 21026, vilket indikerar att den aktuella konfigurationen fortfarande är giltig, även om konfigurationen för dessa agenter borde ha uppdaterats.
  • Filen OpsMgrConnector.Config.xml i hanteringsgruppmappen under Health Service State\Connector Configuration Cache uppdateras inte under långa tidsperioder i förhållande till resten av hanteringsgruppen på en eller flera agenter.

Händelseloggen i Operations Manager kan dessutom visa en eller flera händelser med ID 29106 när System Center Configuration Management-tjänsten startas om. Till exempel:

Loggnamn: Operations Manager
Källa: OpsMgr Config Service
Händelse-ID: 29106
Nivå: Varning
Beskrivning:
Begäran om att synkronisera tillstånd för OpsMgr Hälsotjänst identifierad av "da4d36df-ce22-8930-e6d4-45b783e9fdb1" misslyckades på grund av följande undantag "System.Collections.Generic.KeyNotFoundException: Den angivna nyckeln fanns inte i ordlistan.

Loggnamn: Operations Manager
Källa: OpsMgr Config Service
Händelse-ID: 29106
Nivå: Varning
Beskrivning:
Begäran om att synkronisera tillstånd för OpsMgr Hälsotjänst identifierad av "fc1c815b-c0c4-242d-ae27-30db4ef99b54" misslyckades på grund av följande undantag "Microsoft.EnterpriseManagement." Common.DataItemDoesNotExistException: TypedManagedEntityId = "ac8f3d08-ee2a-ae21-0e46-19c3da794183" tas bort.

Insamling av ETL-loggar mot konfigurationstjänsten på INF-nivå kan visa rader som liknar följande:

3326 [ConfigurationChangeSetProvider.UpdateQueryTimestampFromResults] [configurationchangesetprovider_cs595]( 0000000000343A92F )Timestamp = 04/11/2074 08:57:09.
3327 [DatabaseAccessor.NotifyOnChanges] [databasenotification_cs329]( 0000000002E4BD4E )Utlöser ändringsmeddelande.
3328 [ConfigurationEngine.DatabaseHelper.OnConfigurationChange] [configurationengine_cs499]( 00000000023546E1 )IsIncremental=True, NumberOfChanges=0
3329 [StateManager.CollectDirty] [statemanager_cs39]( 0000000035D75A8 )State=274cda45-6031-c0e2-3659-00722251f5655 är smutsig
< stort antal ytterligare GUIDS >
3432 [StateManager.CollectDirty] [statemanager_cs39]( 00000000035D75A8 )State=6ec4fb2d-d1c1-72a8-32e6-fe26df42aba8 är smutsig
3433 [StateManager.CollectDirty] [statemanager_cs45]( 0000000035D75A8 ) NumberOfDirtyStates=104
3434 [ConfigurationEngine.CommunicationHelper.NotifyDirtyStatesTask.Run] [configurationengine_cs869]Slutfört
3435 [DatabaseAccessor.GetPollingIntervalMillisecondsTimeSpan] [databaseaccessor_cs126]Databasavsökningsintervall 0 millisekunder

Kommentar

Tidsstämpeln i rad 3326 är inställd på 2074-04-11. Om detta visas i ETL-loggning använder du SQL-frågorna i avsnittet Mer information för att bekräfta att villkoret som anges i avsnittet Orsak finns.

Orsak

System Center Management Configuration-tjänsten använder en tidsstämpel för att avgöra när nya konfigurationsdata måste beräknas för agenter och hanteringsservrar. Om systemklockan på en agent är snabbare än systemklockan på hanteringsservern kommer identifieringsdata från den här agenten att ange tidsstämpeln för en eller flera hanterade instanser som hanteras av agenten till den aktuella systemklockatiden för agentsystemet. System Center Configuration Management-tjänsten fördröjer beräkningen av konfigurationsuppdateringar för instanserna på agenten tills systemklockan på hanteringsservern är aktuell med tidsstämpeln för identifieringsdata. Om agentsystemklockan var snabbare än systemtiden för hanteringsservern när identifieringsdata skickades, eller om agenten fortsätter att skicka data med en framtida tidsstämpel, är det möjligt att hanteringsgruppen skulle uppleva de symptom som anges ovan.

Om du ställer in tid för agentsystemets klocktid så att den matchar tidsintervallet för hanteringsserversystemet återställs inte tidsstämpeln för befintliga identifieringsdata och problemet kvarstår tills tidsintervallet för hanteringsserversystemets klocktid överskrider identifieringsdata med rensningsintervallet, när föråldrade identifieringsdata rensas normalt.

Åtgärd

  1. Systemklockorna för alla agenter i hanteringsgruppen får inte avsevärt överskrida systemklockan på hanteringsservrarna när data skickas. Om några agenter har systemklockor som är mer än några minuter snabbare än hanteringsservrarna bör de korrigeras först för att undvika ytterligare data med framtida tidsstämplar som läggs till i databasen.

  2. Framtida tidsstämplar för identifieringsdata som redan har skickats måste ändras i OperationsManager databasen för att återspegla den aktuella tiden.

  3. System Center Configuration Management-tjänsten och System Center Management-tjänsten på hanteringsservern måste startas om efter att båda ovanstående villkor har uppfyllts.

Mer information

  1. Använd följande tre frågor för att avgöra om det här villkoret finns. Frågorna måste köras mot OperationsManager databasen. Om tidsstämpeln med det största värdet i tabellen är större än den aktuella tiden (i UTC-format) finns villkoret.

    Select GetUTCDate()as 'Current Time',
    MAX(TimeGeneratedOfLastSnapshot) as 'DiscoverySource Timestamp' from DiscoverySource
    
    Select GetUTCDate()as 'Current Time',
    MAX(timegenerated) as 'DiscoverySourceToTypedManagedEntity Timestamp' from DiscoverySourceToTypedManagedEntity
    
    Select GetUTCDate()as 'Current Time',
    MAX(timegenerated) as 'DiscoverySourceToRelationship Timestamp' from DiscoverySourceToRelationship
    
  2. Följande tre frågor kan användas för att avgöra vilka datorer som kan ha skickat identifieringsdata med en framtida tidsstämpel. Om systemklockorna på dessa agenter inte är aktuella ställer du in dem på aktuell tid innan du vidtar ytterligare åtgärder.

    Hitta alla datorer med DiscoverySource Timestamp mer än en dag i framtiden

    Select DisplayName, *
    from BaseManagedEntity
    where BaseManagedEntityID in
     (select BaseManagedEntityId from BaseManagedEntity BME
      join DiscoverySource DS on DS.BoundManagedEntityId = BME.BaseManagedEntityId
      where DS.TimeGeneratedOfLastSnapshot > DATEADD (d, 1, GETUTCDATE())
      and FullName like 'Microsoft.Windows.Computer%')
    

    Hitta alla datorer med DiscoverySourceToTypedManagedEntity Timestamp mer än en dag i framtiden

    Select DisplayName, *
    from BaseManagedEntity
    where BaseManagedEntityID in
     (select BaseManagedEntityId from BaseManagedEntity BME
      join DiscoverySourceToTypedManagedEntity DSTME on DSTME.TypedManagedEntityId = BME.BaseManagedEntityId
      where DSTME.TimeGenerated > DATEADD (d, 1, GETUTCDATE())
      and FullName like 'Microsoft.Windows.Computer%')
       )
    

    Hitta alla datorer med DiscoverySourceToRelationship Timestamp mer än en dag i framtiden

    Select DisplayName, *
    from BaseManagedEntity
    where BaseManagedEntityID in
      (select BaseManagedEntityId from BaseManagedEntity BME
       join DiscoverySource DS on DS.BoundManagedEntityId = BME.BaseManagedEntityId
       join DiscoverySourceToRelationship DSR on DSR.DiscoverySourceId = DS.DiscoverySourceId
       where DSR.TimeGenerated > DATEADD (d, 1, GETUTCDATE())
       and FullName like 'Microsoft.Windows.Computer%')
    
  3. Du korrigerar befintliga data genom att köra följande kommandon mot de berörda tabellerna.

    Update DiscoverySource
    Set TimeGeneratedOfLastSnapshot = GETUTCDATE()
    where TimeGeneratedOfLastSnapshot > GETUTCDATE()
    
    Update DiscoverySourceToTypedManagedEntity
    Set TimeGenerated = GETUTCDATE()
    where TimeGenerated > GETUTCDATE()
    
    Update DiscoverySourceToRelationship
    Set TimeGenerated = GETUTCDATE()
    where TimeGenerated > GETUTCDATE()
    
  4. Följande fråga kan användas för att se vilka ytterligare data som har skickats till databasen med en tidsstämpel i framtiden. Tabellerna som är relaterade till underhållsläge bör ha flera rader, förutsatt att det för närvarande finns agenter i underhållsläge som är schemalagda att avslutas någon gång. Alla andra tabeller ska ha tidsstämplar med aktuell tid eller tidigare.

     /* */
    
     /* The following query will search all tables in the database */
    
     /* for columns with datetime datatypes. It will then return */
    
     /* the total number of rows in each table that have values */
    
     /* greater than the configured number of days from present. */
    
     /* Times are all in UTC format. The default increment is */
    
     /* 3 days, but can be adjusted as needed. */
    
     /* */
    
     -- Variable declarations
    
     DECLARE @schemaname AS sysname;
    
     DECLARE @tabname AS sysname;
    
     DECLARE @colname AS sysname;
    
     DECLARE @fcontin AS tinyint;
    
     DECLARE @query AS nvarchar(max);
    
     -- Temporary table to store the results
    
     CREATE TABLE #work
    
     (
    
     SchemaName sysname,
    
     TableName sysname,
    
     ColumnName sysname,
    
     NumRows int
    
     );
    
     -- Cursor to fetch schema, table, and column names with datetime type
    
     DECLARE cur_meta CURSOR FOR
    
     SELECT
    
     s.name AS SchemaName,
    
     t.name AS TableName,
    
     c.name AS ColumnName
    
     FROM
    
     sys.columns c
    
     INNER JOIN
    
     sys.tables t ON c.object_id = t.object_id
    
     INNER JOIN
    
     sys.schemas s ON t.schema_id = s.schema_id
    
     INNER JOIN
    
     sys.types y ON c.system_type_id = y.system_type_id
    
     WHERE
    
     y.name IN ('datetime', 'date', 'datetime2', 'smalldatetime');
    
     -- Open the cursor
    
     OPEN cur_meta;
    
     -- Loop control variable
    
     SET @fcontin = 1;
    
     -- Loop through the cursor
    
     WHILE (@fcontin > 0)
    
     BEGIN
    
     -- Fetch the next row
    
     FETCH cur_meta INTO @schemaname, @tabname, @colname;
    
     -- Exit loop if no more rows
    
     IF (@@FETCH_STATUS < 0)
    
     BREAK;
    
     -- Debug print statement (can be commented out in production)
    
     PRINT 'Schema = ' + @schemaname + ', Table = ' + @tabname + ', Column = ' + @colname;
    
     /* Change the increment in the DATEADD(dd,3,GETUTCDATE()) function */
    
     /* as needed from the default of +3 days from current time */
    
     SET @query = 'IF EXISTS (SELECT 1 FROM ' + QUOTENAME(@schemaname) + '.' + QUOTENAME(@tabname) + ') '
    
     + 'BEGIN '
    
     + ' SELECT ''' + @schemaname + ''', ''' + @tabname + ''', ''' + @colname + ''', COUNT(*) '
    
     + ' FROM ' + QUOTENAME(@schemaname) + '.' + QUOTENAME(@tabname)
    
     + ' WHERE ' + QUOTENAME(@colname) + ' > DATEADD(dd,3,GETUTCDATE())'
    
     + 'END';
    
     -- Execute the query and insert results into the temporary table
    
     INSERT INTO #work (SchemaName, TableName, ColumnName, NumRows)
    
     EXECUTE sp_executesql @query;
    
     END
    
     -- Close and deallocate the cursor
    
     CLOSE cur_meta;
    
     DEALLOCATE cur_meta;
    
     -- Select results ordered by number of rows with future dates
    
     SELECT *
    
     FROM #work
    
     ORDER BY NumRows DESC;
    
     -- Drop the temporary table
    
     DROP TABLE #work;