还原数据库后 HPC 管理服务无法启动
本文提供了在还原损坏的数据库后 HPC 管理服务无法启动的问题的解决方案。
现象
还原损坏的 HPC 管理数据库后,HPC 管理服务无法初始化。 重新启动头节点并验证所有其他 HPC 服务是否处于运行状态。 但是,HPC 管理服务仍无法启动。
HPC 管理事件日志中显示了以下错误:
HPC 管理服务无法正确初始化:无法在当前实例视图中解析 ID 的实例集合。
原因
HPC 管理服务崩溃并出现“InstanceCacheLoadException”。 下面是 HPC 管理事件日志中的错误消息:
[HPCManagement]异常:Microsoft.SystemDefinitionModel.InstanceCacheLoadException:无法在当前实例视图中解析 ID 的实例集合。
出现此问题的原因是许多实例处于错误状态。 对于每个实例,“当前”状态中应只有一个版本(instanceState 值为 2)。 当出现问题时,有两个或三个版本的实例处于“当前”状态(instanceState 值为 2)。 若要验证处于“当前”状态的实例版本数,请针对 HPC 管理数据库运行以下 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 管理服务。
联系我们寻求帮助
如果你有任何疑问或需要帮助,请创建支持请求或联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区。