データ ウェアハウス ジョブが失敗し、イベント ID 33502 がログに記録される

この記事は、Microsoft System Center 2012 Service Managerでデータ ウェアハウス ジョブが失敗し、イベント ID 33502 がログに記録される問題を解決するのに役立ちます。

元の製品バージョン:Microsoft System Center 2012 Service Manager、System Center 2012 R2 Service Manager
元の KB 番号: 3137611

現象

Microsoft System Center 2012 Service Managerでデータ ウェアハウス ジョブが失敗します。 この問題が発生すると、データ ウェアハウス サーバーの Operations Manager イベント ログに次のイベントが記録されます。

ログ名: Operations Manager
ソース: Data Warehouse
イベント ID: 33502
レベル: エラー
説明:
ETL モジュールの実行に失敗しました:
ETL プロセスの種類: 変換
Batch ID: <Batch ID>
モジュール名: TransformEntityRelatesToEntityFact
メッセージ: ErrorNumber="50000" Message="applock を取得できません - モジュールの別のインスタンスが既に実行されている必要があります。Severity="18" State="1" ProcedureName="InitializeTransform" LineNumber="52" Task="(null)"

また、特定のデータ ウェアハウス関連のコマンドレットを実行すると、次のようなモジュールのタイムアウト エラーが頻繁に記録されます TransformEntityRelatesToEntityFact

Get-SCDWJobModule -JobName transform.common
...
1952 TransformEntityRelatesToEntityFact Failed
...

原因

この問題は、変換データの量が、タイムアウト期間内に変換モジュールによって処理できる量を超えた場合に発生する可能性があります。 通常、データ ウェアハウス ジョブが一定期間無効になった後に発生します。変換されるデータの量はすぐにバックログされる可能性があるためです。 既定では、データ ウェアハウス変換ジョブにはハードコーディングされた 60 分のタイムアウトがあります。

解決方法 1

現在失敗状態の場合は、解決策 1 を使用してバックログを処理し、操作を機能状態に戻します。 他の 2 つの方法は、問題が再発するのを防ぐ方法です。 これを行うには、すべてのデータ ウェアハウス ジョブの状態が [未開始 ] または [ 失敗] として表示されるまで待ってから、次の手順に従います。

  1. データ ウェアハウス サーバーで、管理者特権のコマンド プロンプトで HealthService サービスを停止します。 これを行うには、次のコマンドを実行します。

    Net Stop HealthService
    

    注:

    Service Managerのバージョンによっては、このサービス名が Microsoft Monitoring エージェントまたは System Center Management として表示される場合があります。

  2. 次の SQL クエリを更新して、 ModuleName 失敗しているジョブ内のモジュールの値を Transform.Common 反映します。 この例では、 を使用します TransformEntityRelatesToEntityFact

    注:

    失敗しているモジュールの値をModuleName確認する最も簡単な方法は、Service Manager コンソールを開き、[Data Warehouse] を選択、もう一度 [Data Warehouse] を選択し、[Data Warehouse ジョブ] を選択してから を選択Transform.Commonすることです。 下部中央のウィンドウには、モジュールの一覧と現在の状態が表示されます。 変更を行った後、クエリを実行します。

    Use DWStagingAndConfig  
    declare  
    @mybatchid INT,  
    @mysourceid INT,  
    @outXML XML,  
    @myProcessCategoryName NVARCHAR(100),  
    @myProcessName NVARCHAR(100),  
    @myModuleName NVARCHAR(100),  
    @sqlString NVARCHAR(150),  
    @paramDef NVARCHAR(100)  
    set @myProcessCategoryName = N'Transform'  
    set @myProcessName = N'Transform.Common'  
    set @myModuleName = N'TransformEntityRelatesToEntityFact'  
    USE DWStagingAndConfig  
    create table #MyTempTable (  
    ProcessCategoryName NVARCHAR(150),  
    ProcessName NVARCHAR(150),  
    BatchId INT,  
    BatchStatus NVARCHAR(150),  
    WorkItemStatus NVARCHAR(150),  
    WorkItems INT  
    )  
    insert #MyTempTable  
    exec Infra.GetBatchDetails @ProcessCategoryName=@myProcessCategoryName, @ProcessName=@myProcessName  
    select @mybatchid = BatchId from #MyTempTable  
    select @mysourceid = sourceid from etl.source where SourceName='SCDW'  
    create table #MyTempTable2 (  
    myWaterMark XML  
    )  
    insert #MyTempTable2  
    exec etl.GetWaterMark @BatchId=@mybatchid, @ModuleName=@myModuleName, @ProcessName=@myProcessCategoryName, @SourceId=@mysourceid  
    select @outXML = myWaterMark from #MyTempTable2  
    create table #MyTempTable3 (  
    myWaterMark XML,  
    BatchId INT,  
    UpdatedRowCount INT,  
    InsertedRowCount INT  
    )  
    USE DWRepository  
    set @paramDef = N'@ioutXML XML'  
    set @sqlString = 'insert #MyTempTable3 exec ' + @myModuleName + 'Proc @WaterMark=@ioutXML'  
    exec sp_executesql @sqlString, @paramDef, @ioutXML=@outXML  
    select @mybatchid = BatchId, @outXML = myWaterMark from #MyTempTable3  
    USE DWStagingAndConfig  
    exec etl.SetWaterMark @BatchId=@mybatchid, @ModuleName=@myModuleName, @ProcessName=@myProcessCategoryName, @SourceId=@mysourceid, @WaterMark=@outXML  
    update infra.workitem set statusid = 6 where batchid = @mybatchid
    update infra.batch set statusid = 6 where batchid = @mybatchid
    exec infra.CreateBatch N'Transform.Common'
    drop table #MyTempTable  
    drop table #MyTempTable2  
    drop table #MyTempTable3
    
  3. 上記のスクリプトに次のメッセージが表示される場合:

    "applock を取得できません -モジュールの別のインスタンスが既に実行されている必要があります"

    SQL Server Management Studioから次のクエリを実行し、手順 2 で SQL クエリを再実行します。

    insert #MyTempTable
    exec Infra.GetBatchDetails @ProcessCategoryName='Transform', @ProcessName='Transform.Common'
    GO
    Update infra.workitem set statusid = 6 where batchid IN (SELECT myBatchID FROM #MyTempTable)
    GO
    Update infra.batch set statusid = 6 where processid = (SELECT ProcessId from infra.process where processname = 'Transform.Common')
    GO
    EXEC infra.CreateBatch 'Transform.Common'
    DROP TABLE #MyTempTable
    
  4. 管理者特権のコマンド プロンプトで HealthService サービスを再起動します。 これを行うには、次のコマンドを実行します。

    Net Start HealthService
    

注:

  • SQL クエリが迅速に完了するまで、数回実行する必要がある場合があります。
  • クエリの実行時にログオフしないでください。
  • Service Managerでキャプチャされた新しいデータは、サービスの再起動時にデータ ウェアハウスに急増するため、可能な限り迅速にクエリを実行します。
  • クエリの実行に時間がかかる場合は、もう一度データが急増する可能性があります。
  • 長期的なソリューションとして 解像度 3 を使用します。

解決方法 2

Forefront Identify Manager (FIM) を使用している場合、この問題は、Service Managerに達するデータのフローが原因で再発する可能性があります。 このデータのワークロードを分散するには、スケジュールを FIM_ScheduleReportingIncrementalSynchronizationJob8 時間ごと の既定値から 2 時間ごとに変更します。 これを行うには、次の手順に従います。

  1. SQL Server Management Studioで、FIM データベースに接続し、[SQL Server エージェント] を展開して、[ジョブ] を選択します
  2. を右クリックし、[FIM_ScheduleReportingIncrementalSynchronizationJobプロパティ] を選択し、[スケジュール] を選択します
  3. [ Occurs every]\(発生\) の値を FIM_UpdateReportingIncrementalSynchronizationJobSchedule_12 時間に変更します。

解決策 3

より長期的なソリューションの場合は、Microsoft System Center 2012 R2 Service Manager Update Rollup 4 (UR4) 以降のバージョンにアップグレードします。 更新プログラムのロールアップ 4 以降では、Service Managerには調整可能なタイムアウト設定があります。 また、既定のデータ ウェアハウスでは、ジョブのタイムアウトが 60 分 から 180 分に変わります。 モジュールが完了するのに十分な時間が Transform.Common 3 時間でない場合は、次のレジストリ値を変更して値を増やすことができます。

HKLM\SOFTWARE\Microsoft\System Center\2010\Common\DAL

  • SqlCommandTimeout = (DWord 32 ビット (秒)

注:

Forefront Identity Managerを使用している場合は、Microsoft Identity Manager 2012 R2 にアップグレードして、Service Manager 2012 R2 のサポートを受ける必要があります。

詳細

詳細については、「Data Warehouse変換ジョブの既定のタイムアウト期間を変更する方法」を参照してください。