web-dev-qa-db-fra.com

Impossible de trouver le nom de l'instance SQL sur un PC en réseau

J'ai été confronté à ce genre de situation une douzaine de fois maintenant et enfin je veux une solution permanente.

Problème

Impossible de trouver le nom de l'instance SQL du PC serveur sur le PC client.

Note: - J'ai installé SQL Express And Management Studio sur le serveur et le client.
Nom du PC serveur: M-PC
Version SQL du serveur: SQL Server 2008
Nom du PC client: SHIVANG
Version SQL du client: SQL Server 2008

Capture d'écran du serveur SQL Server du client

Solution que j'ai essayée

1) Désactivation complète du pare-feu du serveur et du PC client (domaine, privé et public)
2) Activation et redémarrage des services: SQL Server et Browser Serviceenter image description here 3) Activation des paramètres de configuration réseau SQL enter image description here 4) Également activé "Autoriser la connexion à distance" à partir de SQL Server du PC
5) La mise en réseau parfaite entre les deux PC permet d’accéder aux fichiers via le réseau des deux.
6) Même modifié les paramètres de configuration IP d’obtenir en statique du PC (IP du serveur est 192.168.1.41 et IP du client est 192.168.1.44) enter image description here
7) J'ai complètement désinstallé SQL Express et Management Studio du client et du serveur et je l'ai réinstallé.
8) J'ai également demandé à mon client de formater le PC, puis d’installer SQL Express et Management Studio. Toujours rien.
9) Ils n’ont pas d’antivirus sur le système (pour bloquer la connexion)

Partie amusante

Maintenant, la partie amusante est ici alors que je tripotais les paramètres du PC client et du serveur. Le PC serveur a commencé à afficher l'instance SQL du PC client alors que le PC client ne parvenait toujours pas à trouver l'instance SQL du serveur.

L'image ci-dessous est celle du serveur SQL Server
enter image description here L'image ci-dessous est celle de SQL Server de l'ordinateur client
enter image description here


Voici les réglages suivants que j'ai manipulés: -

  1. IP changée de Obtain à Statique des deux ordinateurs (client et serveur)
  2. Modification du protocole: TCP/IP de SQL des deux PC (client et serveur) [désolé, j'ai oublié de prendre une capture d'écran et je bidouillais encore plus quand le PC serveur a arrêté de montrer l'instance SQL du PC du client]

Maintenant, je ne sais pas quoi faire ensuite pour résoudre ce problème. S'il vous plaît aidez-moi si vous le pouvez.

Merci d'avance

14
Agent_Spock

Deux niveaux de sécurité doivent être modifiés pour permettre l'accès à distance.

  1. Configuration de SQL Server: par défaut dans les éditions Express, Developer et Enterprise Evaluation, la connexion à l'aide du protocole TCP/IP est désactivée. Activez ceci à l'aide du Gestionnaire de configuration SQL Server.
  2. Pare-feu Windows: Bien que la désactivation du pare-feu fonctionne entièrement Pour ce composant, cela ne constitue pas une pratique recommandée en matière de sécurité (ni requise.) (Remarque: dans cette section, je suppose une configuration par défaut Il existe de nombreux paramètres qui peuvent être modifiés, lesquels affectent légèrement ces étapes.)

Il existe deux cas selon le type d'instance SQL Server à laquelle vous vous connectez:

  1. Instance par défaut (connexion par nom d'ordinateur uniquement). Ajoutez une règle allow Incoming sur le port TCP 1433 ou le service de moteur de base de données .
  2. Instance nommée (connectée par nom d'ordinateur + nom d'instance). Ajoutez une règle Autoriser la règle entrante sur le port UDP 1434 pour accéder au service SQL Browser Ajoutez une règle d'autorisation entrante sur le service de moteur de base de données.

10
Pradeep Kumar

Je n'ai pas de réponse définitive à vos résultats incohérents, mais j'ai quelques informations générales qui peuvent vous aider à résoudre le problème.

Les instances SQL sont énumérées à l'aide de SQL Server Resolution Protocol . Il s'agit d'un protocole de couche d'application qui utilise UDP (et non TCP) pour envoyer des demandes d'énumération aux serveurs du sous-réseau local et recevoir les réponses comme indiqué dans le flux de communication du diagramme de reconnaissance multi-instance . Ce sont les services SQL Server Browser qui écoutent sur le port UDP 1434 pour traiter les demandes d’énumération. 

Il est important de noter que le protocole de multidiffusion UDP ne garantit pas que les demandes ou les réponses sont fournies. Par conséquent, une perte peut être détectée et ne peut être détectée que par une trace réseau. Le protocole de résolution SQL Server ne peut pas savoir pourquoi aucune réponse n'a été reçue; un serveur est en panne, un problème de réseau, un pare-feu, une instance SQL masquée, etc. De plus, les demandes de multidiffusion UDP ne sont envoyées qu'aux périphériques du sous-réseau local, ce qui limite la résolution à ces machines.

Le script PowerShell ci-dessous envoie une demande UDP à un hôte spécifique. Vous pouvez l'exécuter pour vous assurer que le service SQL Browser répond avec les informations attendues sur les instances sur l'hôte.

Function List-Instances($hostName)
{

    Write-Host ("Retrieving information from SQL Server Browser service on Host $HostName ...");

    try
    {
        $udpClient = new-object Net.Sockets.UdpClient($HostName, 1434);
        $bufferLength =  1;
        $browserQueryMessage = new-object byte[] $bufferLength;
        $browserQueryMessage[0] = 2; # list all instances
        $bytesSent = $udpClient.Send($browserQueryMessage, $browserQueryMessage.Length);
        $udpClient.Client.ReceiveTimeout = 10000;
        $remoteEndPoint = new-object System.Net.IPEndPoint([System.Net.IPAddress]::Broadcast, 0);
        $browserResponse = $udpClient.Receive([ref]$remoteEndPoint);
        $payloadLength = $browserResponse.Length - 3;
        $browserResponseString = [System.Text.ASCIIEncoding]::ASCII.GetString($browserResponse, 3, $payloadLength);
        $browserResponseString
        $elements = $browserResponseString.Split(";");
        $elements
        $namedInstancePort = "";
        Write-Host "SQL Browser Data:" -ForegroundColor Green;
        $i = 0;
        while($i -lt $elements.Length)
        {
            if([String]::IsNullOrEmpty($elements[$i]))
            {
                Write-Host "";
                $i += 1;
            }
            else
            {
                Write-Host $("    " + $elements[$i] + "=" + $elements[$i+1]) -ForegroundColor Green;
                $i += 2;
            }
        }
    }
    catch [Exception]
    {
        Write-Host $("ERROR: " + $_.Exception.Message) -ForegroundColor Red;
    }

}

# send request to SQL Brower service to enumerate all SQL instances running on specific Host
List-Instances -hostName "SomeMachine";

En résumé, une résolution réussie nécessite:

  • Le service de navigation SQL Server doit être en cours d'exécution
  • Le port UDP 1434 doit être autorisé à traverser le pare-feu
  • Les serveurs doivent être sur le même sous-réseau
  • Pas de perte de paquet UDP
  • Les serveurs répondent dans les délais
0
Dan Guzman