web-dev-qa-db-fra.com

Comment résoudre l'erreur 26: «Erreur de localisation du serveur / de l'instance spécifiée»

J'essaie de configurer TCP accès à mon instance nommée SQL Server (nommée SQL2012). J'utilise Management Studio pour me connecter au moteur de base de données. Je tape le nom du serveur: "tcp: localhost\SQL2012 "et je reçois ce message d'erreur:

(fournisseur: SQL Network Interfaces, erreur: 26 - Erreur de localisation du serveur/de l'instance spécifiée)

Ce message par l'équipe SQL Server semble être vraiment utile, ils suggèrent de tester le service SqlBrowser à l'aide de PortQry. Quand je le fais, j'obtiens ces informations:

Querying target system called:

 localhost

Attempting to resolve name to IP address...


Name resolved to 127.0.0.1

querying...

UDP port 1434 (ms-sql-m service): LISTENING or FILTERED

Sending SQL Server query to UDP port 1434...

Server's response:

ServerName MSWART7
InstanceName SQL2012
IsClustered No
Version 11.0.5058.0
tcp 52329

   ♥K   K P☺K 5 - 2 1 qK 1 4  rK 8 7 0☺    1 qK

==== End of SQL Server query response ====

Et bien sûr, je peux me connecter à la base de données lorsque je spécifie le nom du serveur "tcp: localhost, 52329"

Je ne suis pas sûr de ce qui me manque. Le navigateur SQL semble fonctionner et les ports et les pare-feu semblent ouverts ou non pertinents (j'essaie de me connecter à localhost).

Où dois-je regarder ensuite?

6
Michael J Swart

Lorsque vous essayez de vous connecter à une instance locale, SQL Server tentera toujours d'utiliser la mémoire partagée. Cette connexion fonctionnera bien:

localhost\SQL2012

Cela fonctionne dans mon scénario et la connexion utilise en effet la mémoire partagée dans ce cas.

SELECT session_id,net_transport,local_net_address,local_tcp_port
FROM sys.dm_exec_connections;

Résultats:

session_id  net_transport   local_net_address   local_tcp_port
----------  -------------   -----------------   --------------
53          Shared memory   <local machine>     NULL

Si vous voulez essayer de remplacer la mémoire partagée (vous ne savez pas pourquoi, sur une machine locale) et forcer TCP/IP à la place, vous ne pouvez pas mélanger cela en spécifiant explicitement l'instance nommée, du moins dans tous les cas que j'ai essayés (sans jeu de mots ). L'instance nommée force SQL Server à mapper le nom de l'instance au numéro de port, à l'aide du navigateur SQL Server, mais cela ne peut apparemment pas être fait lorsque vous forcez TCP/IP en premier lieu (le point entier d'utiliser TCP/IP est ainsi vous allez directement au port et ne vous embêtez pas avec le navigateur). Si votre instance nommée se trouve être exécutée sur sa propre adresse IP et forcée au port 1433, vous pourrez peut-être faire fonctionner cela; vous pouvez également le faire fonctionner si vous utilisez un alias de réseau client (mais je ne pouvais pas ).

J'ai pu me connecter si j'ai recherché le port dynamique actuel attribué à cette instance dans Configuration Manager (dans mon cas, c'était 49538), puis me connecter à l'aide de tcp:localhost,49538:

Object Explorer with two connections, one shared memory and one TCP/IP

Alors maintenant:

SELECT session_id,net_transport,local_net_address,local_tcp_port
FROM sys.dm_exec_connections;

Résultats:

session_id  net_transport   local_net_address   local_tcp_port
----------  -------------   -----------------   --------------
53          Shared memory   <local machine>     NULL
54          TCP             10.211.55.10        49538 

Toutes les variantes que j'ai essayées - sur plusieurs machines et versions - où j'ai essayé de combiner une instance nommée avec la mémoire partagée de remplacement et d'utiliser TCP/IP à la place - ont produit la même erreur que vous avez reçue. C'est à la fois lorsque j'ai préfixé le nom du serveur/instance avec tcp: et lorsque j'ai spécifié TCP/IP pour le protocole réseau dans la boîte de dialogue des propriétés de connexion.

En bref: si vous devez vraiment forcer TCP/IP pour une connexion locale, vous devrez utiliser un port fixe pour cette instance et spécifier le port. Ou utilisez 1433 (qui ne fonctionnera que s'il n'y a pas d'instance par défaut ou si vous avez une adresse IP dédiée pour cette instance), vous n'aurez pas besoin de spécifier le port, mais vous devrez toujours spécifier le tcp: préfixe ou utilisez cette option dans la boîte de dialogue de connexion.

Je ne suggère pas d'essayer de désactiver la mémoire partagée. FWIW.

4
Aaron Bertrand