データ ウェアハウス ジョブが失敗し、イベント 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 つの方法は、問題が再発するのを防ぐ方法です。 これを行うには、すべてのデータ ウェアハウス ジョブの状態が [未開始 ] または [ 失敗] として表示されるまで待ってから、次の手順に従います。
データ ウェアハウス サーバーで、管理者特権のコマンド プロンプトで HealthService サービスを停止します。 これを行うには、次のコマンドを実行します。
Net Stop HealthService
注:
Service Managerのバージョンによっては、このサービス名が Microsoft Monitoring エージェントまたは System Center Management として表示される場合があります。
次の 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
上記のスクリプトに次のメッセージが表示される場合:
"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
管理者特権のコマンド プロンプトで HealthService サービスを再起動します。 これを行うには、次のコマンドを実行します。
Net Start HealthService
注:
- SQL クエリが迅速に完了するまで、数回実行する必要がある場合があります。
- クエリの実行時にログオフしないでください。
- Service Managerでキャプチャされた新しいデータは、サービスの再起動時にデータ ウェアハウスに急増するため、可能な限り迅速にクエリを実行します。
- クエリの実行に時間がかかる場合は、もう一度データが急増する可能性があります。
- 長期的なソリューションとして 解像度 3 を使用します。
解決方法 2
Forefront Identify Manager (FIM) を使用している場合、この問題は、Service Managerに達するデータのフローが原因で再発する可能性があります。 このデータのワークロードを分散するには、スケジュールを FIM_ScheduleReportingIncrementalSynchronizationJob
8 時間ごと の既定値から 2 時間ごとに変更します。 これを行うには、次の手順に従います。
- SQL Server Management Studioで、FIM データベースに接続し、[SQL Server エージェント] を展開して、[ジョブ] を選択します。
- を右クリックし、[
FIM_ScheduleReportingIncrementalSynchronizationJob
プロパティ] を選択し、[スケジュール] を選択します。 - [ Occurs every]\(発生\) の値を
FIM_UpdateReportingIncrementalSynchronizationJobSchedule_1
2 時間に変更します。
解決策 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変換ジョブの既定のタイムアウト期間を変更する方法」を参照してください。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示