Erreur (la clé donnée n’était pas présente dans le dictionnaire) et l’installation SQL Server FCI échoue sur une VM Azure dans Server 2019

Cet article vous aide à résoudre le problème qui se produit lorsque vous essayez d’installer une instance en cluster de Microsoft SQL Server (FCI) dans Windows Server 2019 sur une machine virtuelle Microsoft Azure.

S’applique à :   SQL Server vm - Windows, Windows Server 2019
Numéro de la ko d’origine :   4525647

Symptômes

Lorsque vous essayez d’installer une instance de cluster de Microsoft SQL Server (FCI) dans Windows Server 2019 sur une machine virtuelle Microsoft Azure, l’installation échoue et vous recevez le message d’erreur suivant :

La clé donnée n’était pas présente dans le dictionnaire.

Dans ce cas, vous pouvez voir les informations supplémentaires suivantes dans le fichier journal Details.txt dans le SQL Server d’installation :

Données d’action : Fonctionnalité = SQL_Engine_Core_Inst_sql_engine_core_inst_Cpu64 Scenario = install Timing = ConfigNonRC ConfigObjectType = Microsoft.SqlServer.Configuration.ClusterConfiguration.FailoverClusterNamePrivateConfigObject FeatureName = SQL_Engine_Core_Inst FeatureCpuType = Cpu64 FeaturePackageId = sql_engine_core_inst FeatureClusterState = CompleteFailoverCluster Configuration action failed for feature SQL_Engine_Core_Inst during timing ConfigNonRC and scenario ConfigNonRC. La clé donnée n’était pas présente dans le dictionnaire. La catégorie d’échec de configuration de l’exception actuelle est l’échec de l’action ConfigurationFailure pour la fonctionnalité SQL_Engine_Core_Inst lors du minutage ConfigNonRC et du scénario ConfigNonRC. System.Collections.Generic.KeyNotFoundException : la clé donnée n’était pas présente dans le dictionnaire. at System.ThrowHelper.ThrowKeyNotFoundException() at System.Collections.Generic.Dictionary22.get_Item(TKey key) at Microsoft.SqlServer.Configuration.ClusterConfiguration.FailoverClusterNamePrivateConfigObject.CreateFailoverClusterNameResource(FailoverClusterNamePublicConfigObject pubConfig) at Microsoft.SqlServer.Configuration.ClusterConfiguration.FailoverClusterNamePrivateConfigObject.Install(ConfigActionTiming timing, Dictionary actionData, PublicConfigurationBase spcb) at Microsoft.SqlServer.Configuration.SqlConfigBase.PrivateConfigurationBase.Execute(ConfigActionScenario scenario, ConfigActionTiming timing, ConfigBaseAction action, Dictionary22 actionData, PublicConfigurationBase spcbCurrent) at Microsoft.SqlServer.Configuration.SqlConfigBase.SqlFeatureConfigBase.Execute(ConfigActionScenario scenario, ConfigActionTiming timing, ConfigBaseAction action, Dictionary actionData, PublicConfigurationBase spcbCurrent) at Microsoft.SqlServer.Configuration.SqlConfigBase.SlpConfigAction.ExecuteAction(StringId action) at Microsoft.SqlServer.Configuration.SqlConfigBase.SlpConfigAction.Execute(String actionId, TextWriter errorStream) The following is an exception stack listing the exceptions in outermost to innermost inner order Inner exceptions are being indented Exception type: System.Collections.Generic.KeyNotFoundException Message: The given key was not present in the dictionary. HResult : 0x80131577 données : SQL. Setup.FailureCategory = ConfigurationFailure WatsonConfigActionData = INSTALL@CONFIGNONRC@SQL_ENGINE_CORE_INST WatsonExceptionFeatureIdsActionData = System.String[] Stack: at System.ThrowHelper.ThrowKeyNotFoundException() at System.Collections.Generic.Dictionary22.get_Item(TKey key) at Microsoft.SqlServer.Configuration.ClusterConfiguration.FailoverClusterNamePrivateConfigObject.CreateFailoverClusterNameResource(FailoverClusterNamePublicConfigObject pubConfig) at Microsoft.SqlServer.Configuration.ClusterConfiguration.FailoverClusterNamePrivateConfigObject.Install(ConfigActionTiming timing, Dictionary actionData, PublicConfigurationBase spcb) at Microsoft.SqlServer.Configuration.SqlConfigBase.PrivateConfigurationBase.Execute(ConfigActionScenario scenario, ConfigActionTiming timing, ConfigBaseAction action, Dictionary2 actionData, PublicConfigurationBase spcbCurrent) at Microsoft.SqlServer.Configuration.SqlConfigBase.SqlFeatureConfigBase.Execute(ConfigActionScenario scenario, ConfigActionTiming timing, ConfigBaseAction action, Dictionary 2 actionData, PublicConfigurationBase spcbCurrent) chez Microsoft.SqlServer.Configuration.SqlConfigBase.SlpConfigAction.ExecuteAction(String actionId) chez Microsoft.SqlServer.Configuration.SqlConfigBase.SlpConfigAction.Execute(String actionId, TextWriter errorStream)

Cause

Un nouveau commutateur, ManagementPointNetworkType, qui peut être appelé par les cmdlets PowerShell pour FailoverClusters est introduit dans Windows Server 2019. Vous pouvez utiliser les options suivantes pour le nouveau commutateur.

Paramètre switch Utilisation
Singleton Utilise la méthode traditionnelle d’adresse IP statique ou DHCP.
Distribué Utilisez un nom de réseau distribué à l’aide d’adresses IP de nœud.
Automatique Utilise la détection pour déterminer le paramètre approprié. Si SQL Server est en cours d’exécution dans Azure, utilise Distributed. Si SQL Server est en cours d’exécution en local, utilise Singleton (paramètre par défaut).

Si vous créez le cluster Windows à l’aide de l’outil Windows Cluster Manager, l’outil définit le paramètre de commutateur sur Automatique. Étant donné que vous travaillez sur une VM Azure, le commutateur utilise plutôt un nom de réseau distribué.

Vous pouvez le vérifier en exécutant la commande PowerShell suivante :

C:\windows\system32> Get-clusterresource

La sortie renvoyée par cette commande ressemble à ceci :

Name                 State          OwnerGroup                ResourceType
Cloud Witness                       Online Cluster Group      Cloud Witness
Cluster Name                        Online Cluster Group      Distributed Network Name
Cluster Pool 1                      Online 45d8f3c2-e8df-4a01-87b8-f3c383801f3f
                                                              Storage Pool
Cluster Virtual Disk
   (ClusterPerformanceHistory)      Online Cluster Group      Physical Disk
Health                              Online Cluster Group      Health Service
SDDC Management                     Online Cluster Group      SDDC Management
Storage QoS Resource                Online Cluster Group      Storage QoS Policy Manager

La CreateFailoverClusterNameResource(FailoverClusterNamePublicConfigObject pubConfig) fonction vérifie le nom de la ressource dont le type estNetworkName. Cela consiste à vérifier que le nom du serveur virtuel que vous avez entré existe déjà.

Toutefois, l’installation SQL Server FCI sur un cluster Windows qui ne possède qu’un nom de réseau distribué n’est pas prise en charge. Le message d’erreur mentionné dans la section Symptômes indique qu’il n’existe aucune ressource disponible dans Windows Server 2019 dont le type estNetworkName.

Résolution

Pour résoudre ce problème, vous pouvez supprimer le cluster actuel, puis le créer à nouveau à l’aide d’une commande PowerShell qui a le paramètre suivant :

managementpointnetworktype singleton