データベースの復元後に HPC Management Service の起動に失敗する
この記事では、破損したデータベースを復元した後に HPC Management Service の起動に失敗する問題の解決策について説明します。
現象
破損した HPC 管理データベースを復元すると、HPC Management Service は初期化に失敗します。 ヘッド ノードを再起動し、他のすべての HPC サービスが実行中の状態であることを確認します。 ただし、HPC Management Service は引き続き開始できません。
HPC Management イベント ログに次のエラーが表示されます。
HPC Management Service が正しく初期化できませんでした。ID のインスタンス コレクションを現在のインスタンス ビューで解決できません。
原因
HPC Management Service が "InstanceCacheLoadException" でクラッシュしました。 HPC Management イベント ログのエラー メッセージを次に示します。
[HPCManagement]例外: Microsoft.SystemDefinitionModel.InstanceCacheLoadException: ID のインスタンス コレクションを現在のインスタンス ビューで解決できません。
この問題は、多くのインスタンスが間違った状態にあるために発生します。 インスタンスごとに、"Current" 状態のバージョンは 1 つだけである必要があります (instanceState 値は 2)。 問題が発生すると、"Current" 状態のバージョンが 2 つまたは 3 つのインスタンスがあります (instanceState 値は 2)。 "現在" 状態のインスタンス バージョンの数を確認するには、HPC Management Database に対して次の SQL クエリを実行します。
SELECT instanceId, count(*) as Number FROM Instances where instanceState = 2 group by instanceId having count(*) > 1
上記の SQL クエリによって返される instanceId ごとに、次の SQL クエリを実行します。
SELECT Instances.instanceId, Instances.changeId, Instances.instanceVersion, Instances.instanceName, Instances.instanceState, Changes.changeName, Changes.changeState FROM Instances INNER JOIN Changes on Instances.changeId = Changes.changeId Where Instances.instanceId = '<instanceId>' and Instances.instanceState <> 3 Order by Instances.instanceVersion DESC
解決方法
問題を解決するには、間違った状態のインスタンスを修正します。 これを行うには、次の手順を実行します。
次の PowerShell スクリプトを FixInstanceStateError.ps1 ファイルとして保存します。
param ( [Parameter(Mandatory=$true)] [string] $ServerInstance, [Parameter(Mandatory=$false)] [string] $Database = "HpcManagement" ) $dupInstances = Invoke-Sqlcmd -ServerInstance $ServerInstance -Database $Database -Query "SELECT instanceId, count(*) as Number FROM Instances where instanceState = 2 group by instanceId having count(*) > 1" $instanceIds = $dupInstances.instanceId $idsString = $instanceIds -join "','" $instanceEntries = Invoke-Sqlcmd -ServerInstance $ServerInstance -Database $Database -Query "SELECT * FROM Instances Where instanceId IN ('$idsString') and instanceState = 2" $sortedEntries = $instanceEntries | Sort-Object -Property @{Expression="instanceId"; Descending=$true},@{Expression="instanceVersion"; Descending=$true} $idMap = @{} foreach($entry in $sortedEntries) { if($idMap[$entry.instanceId]) { Invoke-Sqlcmd -ServerInstance $ServerInstance -Database $Database -Query "Update Instances set instanceState = 3 where instanceId = '$($entry.instanceId)' and instanceVersion = $($entry.instanceVersion)" } else { $idMap[$entry.instanceId] = $true } }
管理者として PowerShell を実行します。
次のコマンドを実行します。
.\FixInstanceStateError.ps1 -ServerInstance SQLserver -Database HpcManagement
HPC SDM ストア サービスと HPC Management サービスを再起動します。
お問い合わせはこちらから
質問がある場合やヘルプが必要な場合は、サポート要求を作成するか、Azure コミュニティ サポートにお問い合わせください。 Azure フィードバック コミュニティに製品フィードバックを送信することもできます。