15 octubre, 2009

Diagnóstico de problemas de conexión a SQL Server 2005/2008

/*
Este artículo está basado en el artículo:

SQL Server 2005 Remote Connectivity Issue TroubleShoot
http://blogs.msdn.com/sql_protocols/archive/2006/09/30/SQL-Server-2005-Remote-Connectivity-Issue-TroubleShooting.aspx

publicado en el blog del equipo de SQL Protocols, firmado por Ming Lu
*/


A diferencia de lo que sucedía con SQL Server 2000, conectarse a SQL Server 2005/2008 cuando está instalado en un XP, Windows 2003/2008, Vista o Windows 7 atrás de un firewall, suele presentar ciertas dificultades en el diagnóstico del problema. Los principales motivos son que, desde SQL Server 2005, se aplicaron dos cambios importantes respecto a la versión 2000: Apagado de protocolos de red y el servicio SQL Browser.

Para hacer más seguro al producto, la conectividad fué reducida por omisión. Durante la instalación de una edición Express o Developer, el servicio SQL solamente escucha via Shared Memory (SM) y Named-pipe (NP) local (TCP, NP remoto y VIA están desactivados). Si se está instalando una edición Enterprise, Standard o Workgroup, SM, NP local y TCP están habilitados.
Entonces, para hacer una conexión remota primero hay que asegurarse que NP o TCP están habilitados en la instancia remota de SQL Server.

El servicio SQL Browser es un servicio Windows que inicia y solicita el puerto UDP 1434. Cuando una aplicación cliente quiere conectarse, envía un mensaje UDP al servidor por el puerto 1434. El SQL Browser responde al mensaje indicando cuál es el puerto TCP/IP o el NP en el que la instancia solicitada está atendiendo.

Ahora es necesario que el SQL Browser esté iniciado para cuando un cliente intenta conectarse a una instancia de SQL Server. Si la instancia remota es una instancia sin nombre, no es requerido tener iniciado al SQL Browser ya que los clientes van a intentar usar el puerto TCP 1433 y el NP "\\pipe\sql\query".

La lista de problemas que puede aparecer se relacionan entonces con:

1. Falla de conexión sobre TCP/IP o NP, si el protocolo usado no está habilitado.

2. Falla de conexión sobre TCP/IP o NP si hay un firewall intermedio y están bloqueados los puertos necesarios o no se ha agregado a la lista de excepciones del firewall a "File and Printer Sharing".

3. Falla de conexión a la instancia SQL remota si el SQL Browser no está iniciado o si el puerto TCP 1434 (donde escucha el SQL Browser) no está abierto en el firewall.

Veamos ahora cómo hacer el tratar un problema de conectividad a una instancia remota. Asumiremos que la instancia de SQL server está iniciada en un servidor remoto y que el cliente ha especificado correctamente el nombre de la instancia remota.

EN EL SERVIDOR SQL:

1. Habilitar TCP y/o NP remoto:

SS2005: Usar SQL Server Surface Area Configuration / Configuration for Services and Connections / Remote Connections.

SS2008: Usar Management Studio / Object Explorer / Seleccionar instancia, clic-derecho, propiedades, Connections y marcar "Allow connections to this server".

2. Verificar el log de errores del servidor SQL, determinar en qué puerto TCP y/o NP está escuchando.

3. Cuando se usa TCP, usar el comando de línea NETSTAT para ver si el servidor está escuchando en el puerto correcto.

netstat -noa findstr NumeroPuerto

4. Verificar el servicio SQL Browser:

Ejecutar en línea de comandos SERVICES.MSC, buscar el servicio "SQL Server Browser", habilitarlo y reiniciarlo. También ir a la utilidad SQL Server Configuration Manager, revisar las propiedades del SQL Browser, en la sección "Advanced" y confirmar que está activo.

5. Habilitar "File and Printer Sharing" en la lista de excepciones del firewall.

6. Agregar el puerto TCP y/o SQLSERVR.EXE (..\Binn\sqlservr.exe) a la lista de excepciones del firewall.

7. Agregar SQLBROWSER.EXE (..\Shared\sqlbrowser.exe) a la lista de excepciones del firewall o agregar el puerto UDP 1434.

8. Confirmar si la instancia remota SQL es la instancia por omisión (sin nombre)

En este caso debe escuchar en el puerto TCP 1433 y en el NP "\\pipe\sql\query"


EN LA ESTACION CLIENTE:

1. Probar PING:

ping IPservidorSql

2. Probar TELNET:

telnet IPservidorSql\NombreInstancia NumeroPuerto

Si la consola de comandos queda totalmente negra sin mensajes, el TELNET ha sido exitoso. Falla cuando aparece un mensaje de error indicando que no pudo conectarse al servidor.

3. Probar \\IpServidorSql

4. Verificar los protocolos del cliente:

Usar SQL Server Configuration Manager / SQL Native Client Configuration / Client Protocols. Confirmar que NP o TCP están habilitados; clic en las propiedades de los protocolos cliente, ver que NP o TCP están habilitados. Se recomienda poner a TCP al comienzo de la lista de protocolos.

5. Configurar MDAC:

Si se usa MDAC (Driver={SQL Server} o SQLOLEDB.x) en la aplicación cliente, en línea de comandos ejecutar CLICONFG.EXE, habilitar NP y TCP (poner TCP primero en la lista).

6. Probar conexión con OSQL.EXE o SQLCMD.EXE:

osql /S servidor\instancia /E
osql /S servidor\instancia /U usuario /P password

7. Revisar string de conexión

Revisar la sintaxis y los valores del string de conexión de la aplicación cliente, es frecuente cometer errores en el string de conexión.

8. Revisar alias

Si la aplicación cliente se conecta al servidor remoto usando un alias: Si se usa MDAC ejecutar CLICONFG.EXE, ver la solapa "Alias". Si se usa el SQL Native Client, ejecutar SQL Server Configuration Manager y revisar "Aliases".

Si todo lo anterior está revisado y correcto, ver en los siguientes links información de diagnóstico acorde a los distintos mensajes de error recibidos:

Diagnóstico de problemas de conexión a SQL Server 2005/2008, Parte 2
http://ascii164.blogspot.com/2010/02/diagnostico-de-problemas-de-conexion.html

Troubleshoot Connectivity Issue in SQL Server 2005 - Part II
http://blogs.msdn.com/sql_protocols/archive/2005/10/29/486861.aspx

Troubleshoot Connectivity Issue in SQL Server 2005 - Part III
http://blogs.msdn.com/sql_protocols/archive/2005/12/22/506607.aspx

Troubleshoot Connectivity Issue with SQL Server Express 2005
http://blogs.msdn.com/sql_protocols/archive/2006/03/23/558651.aspx

5 comentarios:

  1. gracias me sirvio mucho el post,para aquellos que a pesar de que tienen habilitado permitir las conexiones remotas, es tmbn importante habilitar lo siguiente en el Configuration Manager: Protocols for SQLExpress: TCP/IP enable. con eso resolvio mi problema. gracias espero tmbn ayudar.

    ResponderEliminar
  2. Bueno, despues de buscar en foros y foros, blogs y blogs resolvi mi problema de conexion, esta guia paso a paso ayuda para esos problemas sencillos(En fin Al mejor cazador se le va la liebre :P) Revise una y otra ves el firewall de windows pero La solucion a mi problema fue deshabilitar mi firewall personal de NOD32 en mi servidore SQL. Nada mas sencillo que eso!!! me olvide que ahora los antivirus vienen con firewall incluido! me tomo 5 horas de mi vida. En fin Muchas gracias!

    ResponderEliminar
  3. Estupendo....al fin me funcionó, gracias por esta información...tenía 3 días con este problema...GRACIAS!!

    ResponderEliminar
  4. Gracias por la información, tambien puede resolver mi error de conexión al sql server, solo configure en el CLICONFG.EXE el NP y se conecto.

    ResponderEliminar
  5. Que debo hacer para conectarme al servidor? Si éste, esta detras de NAT

    ResponderEliminar

Nota: solo los miembros de este blog pueden publicar comentarios.