还原数据库后 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

解决方法

若要解决此问题,请修复处于错误状态的实例。 为此,请按照下列步骤进行操作:

  1. 将以下 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
        }
    }
    
  2. 以管理员身份运行 PowerShell。

  3. 运行下面的命令:

    .\FixInstanceStateError.ps1 -ServerInstance SQLserver -Database HpcManagement
    
  4. 重启 HPC SDM 应用商店服务和 HPC 管理服务。

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区