Depurar problemas de conexión

Introducción

Por lo general, los problemas de conexión se clasifican en una de las siguientes tres áreas:

  • Conexión: ¿Puedes alcanzar tu instancia a través de la red?
  • Autorización: ¿Estás autorizado para conectarte a la instancia?
  • Autenticación: ¿La base de datos acepta las credenciales de tu base de datos?

Además, cada una de ellas puede desglosarse en diferentes rutas de investigación. En la siguiente sección, se incluyen ejemplos de preguntas que puedes formularte para ayudarnos a reducir el problema:

Lista de tareas para los problemas de conexión

Mensajes de error

Para ver mensajes de error de API específicos, consulta la página de referencia Mensajes de error.

Solución de problemas de conectividad adicionales

Para otros problemas, consulta la sección Conectividad de la página de solución de problemas.

Problemas comunes de conexión

Verifica que tu aplicación cierre las conexiones de forma adecuada

Si ves errores que contienen “Aborted connection nnnn to db:”, por lo general, eso indica que la aplicación no detiene las conexiones de forma adecuada. Los problemas de red también pueden causar este error. El error no significa que haya problemas con tu instancia de Cloud SQL. También se recomienda que ejecutes tcpdump para inspeccionar los paquetes a fin de encontrar el origen del problema.

Para obtener ejemplos sobre las prácticas recomendadas de administración de conexiones, consulta Cómo administrar conexiones.

Verifica que tus certificados no hayan vencido

Si tu instancia está configurada para usar SSL, ve a la página Instancias de Cloud SQL en la consola de Google Cloud y abre la instancia. Abre la página Conexiones, selecciona la pestaña Seguridad y asegúrate de que tu certificado de servidor sea válido. Si caducó, debes agregar uno nuevo y rotarlo.

Verifica que estés autorizado para conectarte

Si se generan fallas en tus conexiones, verifica que estés autorizado para conectarte:

  • Si tienes problemas para conectarte mediante una dirección IP, por ejemplo, si te conectas desde tu entorno local con el cliente MySQL, asegúrate de que la dirección IP desde la que deseas conectarte esté autorizada para conectarse a la instancia de Cloud SQL.

    Las conexiones a una instancia de Cloud SQL mediante una dirección IP privada se autorizan de forma automática para los rangos de direcciones RFC 1918. De esta manera, todos los clientes privados pueden acceder a la base de datos sin pasar por el proxy de Cloud SQL Auth. Los rangos de direcciones que no son RFC 1918 deben configurarse como redes autorizadas.

    De forma predeterminada, Cloud SQL no procesa rutas de subred de tu VPC que no son RFC 1918. Debes actualizar el intercambio de tráfico entre redes a Cloud SQL para exportar cualquier ruta que no sea RFC 1918. Por ejemplo:

    gcloud compute networks peerings update cloudsql-mysql-googleapis-com \
    --network=NETWORK \
    --export-subnet-routes-with-public-ip \
    --project=PROJECT_ID
    
  • Aquí encontrarás tu dirección IP actual.

  • Prueba el comando gcloud sql connect para conectarte a la instancia. Este comando autoriza tu dirección IP por un período breve. Puedes ejecutar este comando en un entorno que tenga la CLI de gcloud y el cliente MySQL instalados. También puedes ejecutar este comando en Cloud Shell, que está disponible en la consola de Google Cloud y tiene la CLI de gcloud y el cliente MySQL preinstalados. Cloud Shell proporciona una instancia de Compute Engine que puedes usar para conectarte a Cloud SQL.
  • Permite que todas las direcciones IP se conecten de manera transitoria a una instancia. Para IPv4, autoriza 0.0.0.0/0 (para IPv6, autoriza ::/0).

Verifica cómo te conectas

Si ves un mensaje de error como el siguiente:

ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: NO)

cuando te conectas, verifica que proporcionas una contraseña.

Si ves un mensaje de error como el siguiente:

ERROR 1045 (28000): Access denied for user 'root'@'1.2.3.4' (using password: YES)

cuando te conectas, verifica que usas la contraseña correcta y que te conectas a través de SSL si la instancia lo requiere.

Determina cómo se inician las conexiones

Para ver información sobre tus conexiones actuales, conéctate a tu base de datos y ejecuta el siguiente comando:

SHOW PROCESSLIST;

Las conexiones en las que se muestra una dirección IP, como 1.2.3.4, se conectan mediante una IP. Las conexiones con cloudsqlproxy~1.2.3.4 usan el proxy de Cloud SQL Auth, o se originaron en App Engine. Algunos procesos internos de Cloud SQL pueden usar conexiones de localhost.

Límites de conexión

No hay límites de QPS para las instancias de Cloud SQL. Sin embargo, en su lugar, existen conexiones, tamaños y límites específicos de App Engine. Consulta Cuotas y límites.

Las conexiones de bases de datos consumen recursos en el servidor y en la aplicación de conexión. Usa siempre prácticas adecuadas de administración de conexión para minimizar el espacio de tu aplicación y reducir la posibilidad de superar los límites de conexión de Cloud SQL. Para obtener más información, consulta la página sobre cómo administrar conexiones de bases de datos.

Muestra subprocesos y conexiones

Si recibes el mensaje de error “Demasiadas conexiones” o quieres saber qué sucede en una instancia, puedes mostrar la cantidad de conexiones y subprocesos con SHOW PROCESSLIST.

Desde un cliente MySQL, ejecuta lo siguiente:

mysql> SHOW PROCESSLIST;

Obtendrás un resultado similar al que se muestra a continuación:

+----+-----------+--------------+-----------+---------+------+-------+----------------------+
| Id | User      | Host         | db        | Command | Time | State | Info                 |
+----+-----------+--------------+-----------+---------+------+-------+----------------------+
|  3 | user-name | client-IP    | NULL      | Query   |    0 | NULL  | SHOW processlist     |
|  5 | user-name | client-IP    | guestbook | Sleep   |    1 |       | SELECT * from titles |
| 17 | user-name | client-IP    | employees | Query   |    0 | NULL  | SHOW processlist     |
+----+-----------+--------------+-----------+---------+------+-------+----------------------+
3 rows in set (0.09 sec)

Para obtener más información sobre cómo interpretar las columnas que muestra PROCESSLIST, consulta la referencia de MySQL.

Para obtener un recuento de subprocesos, puedes usar lo siguiente:

mysql> SHOW STATUS WHERE Variable_name = 'Threads_connected';

Obtendrás un resultado similar al que se muestra a continuación:

+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 7     |
+-------------------+-------+
1 row in set (0.08 sec)

Tiempo de espera de las conexiones (desde Compute Engine)

Las conexiones con una instancia de Compute Engine agotan el tiempo de espera después de 10 minutos de inactividad, lo que puede afectar las conexiones de larga duración sin usar entre la instancia de Compute Engine y la instancia de Cloud SQL. Para obtener más información, consulta Herramientas de redes y firewalls en la documentación de Compute Engine.

Para mantener las conexiones sin usar de larga duración en funcionamiento, puedes establecer TCP keepalive. Los siguientes comandos establecen el valor de TCP keepalive en un minuto y hacen que la configuración sea permanente en los reinicios de las instancias.

Muestra el valor tcp_keepalive_time actual.

cat /proc/sys/net/ipv4/tcp_keepalive_time

Establece tcp_keepalive_time en 60 segundos y haz que sea permanente en todos los reinicios.

echo 'net.ipv4.tcp_keepalive_time = 60' | sudo tee -a /etc/sysctl.conf

Aplica el cambio.

sudo /sbin/sysctl --load=/etc/sysctl.conf

Muestra el valor tcp_keepalive_time para verificar que se aplicó el cambio.

cat /proc/sys/net/ipv4/tcp_keepalive_time

Conéctate con IPv6

Si ves alguno de los siguientes mensajes de error

Can't connect to MySQL server on '2001:1234::4321' (10051)
Can't connect to MySQL server on '2001:1234::4321' (101)

cuando te conectas, es probable que estés intentando conectarte a la dirección IPv6 de tu instancia, pero no tengas IPv6 disponible en tu estación de trabajo. Puedes verificar si IPv6 funciona en tu estación de trabajo en ipv6.google.com. Si no carga, IPv6 no está disponible. Conéctate a la dirección IPv4 o a tu instancia de Cloud SQL. Es posible que primero debas agregar una dirección IPv4 a tu instancia.

Fallas ocasionales de conexión (HA heredada)

Cuando Cloud SQL reinicia una instancia por tareas de mantenimiento, las conexiones pueden enrutarse a la réplica de conmutación por error. Al momento de conectarse a esta réplica, sucede lo siguiente:

  • Las solicitudes de lectura de los clientes que usan conexiones sin encriptar se ejecutan de forma correcta. Sin embargo, las solicitudes de escritura fallan y muestran un mensaje de error, como “Error 1290: El servidor MySQL se ejecuta con la opción solo lectura, por lo que no puede ejecutar esta declaración”.
  • Las solicitudes de lectura y escritura de los clientes que usan conexiones encriptadas fallan y muestran un mensaje de error, como “x509: El certificado es válido para la instancia principal, no para la instancia de conmutación por error”.

Cuando finalice el evento, Cloud SQL restablecerá la conexión. Vuelve a intentar la conexión. Te recomendamos que diseñes tus aplicaciones para manejar fallas ocasionales de conexión mediante la implementación de una estrategia de gestión de errores, como la retirada exponencial. Consulta Implementación de aplicaciones para obtener más información.

Herramientas para depurar la conectividad

tcpdump

tcpdump es una herramienta que se usa para capturar paquetes. Se recomienda ejecutar tcpdump para capturar e inspeccionar los paquetes entre el host y las instancias de Cloud SQL cuando depures los problemas de conectividad.

Ubica tu dirección IP local

Si no conoces la dirección local del host, ejecuta el comando ip -br address show. En Linux, este muestra la interfaz de red, el estado de la interfaz, la IP local y las direcciones MAC. Por ejemplo: eth0 UP 10.128.0.7/32 fe80::4001:aff:fe80:7/64

Como alternativa, puedes ejecutar ipconfig o ifconfig para ver el estado de tus interfaces de red.

Realiza pruebas de conectividad

Las pruebas de conectividad son una herramienta de diagnóstico que te permite verificar la conectividad entre extremos de tu red. Analiza la configuración y, en algunos casos, la verificación del entorno de ejecución. Actualmente, es compatible con Cloud SQL. Sigue estas instrucciones para ejecutar pruebas con las instancias de Cloud SQL.

Probar la conexión

Puedes usar el cliente MySQL a fin de probar tu capacidad de conexión desde tu entorno local. Si quieres obtener más información, consulta Conecta un cliente MySQL mediante una dirección IP y la página para conectar el cliente MySQL con el proxy de Cloud SQL Auth.

Define la dirección IP de la aplicación

Para definir la dirección IP de una computadora que ejecuta tu aplicación a fin de que puedas autorizar el acceso a la instancia de Cloud SQL desde esa dirección, debes usar una de las siguientes opciones:

  • Si la computadora no se encuentra detrás de un proxy o firewall, accede a esta y usa el sitio What is my IP? para determinar su dirección IP.
  • Si la computadora se encuentra detrás de un proxy o firewall, accede a esta y usa una herramienta o servicio como whatismyipaddress.com para definir su dirección IP verdadera.

Abre puertos locales

Para verificar que tu host esté escuchando en los puertos que crees que está, ejecuta el comando ss -tunlp4. Este te indica qué puertos están abiertos y escuchando. Por ejemplo, si tienes una base de datos MySQL activa, el puerto 3306 debe estar activo y escuchando. Para SSH, deberías ver el puerto 22.

Toda la actividad del puerto local

Usa el comando netstat para ver toda la actividad del puerto local. Por ejemplo, netstat -lt muestra todos los puertos activos en el momento.

Conéctate a tu instancia de Cloud SQL con telnet

Para verificar que puedes conectarte a tu instancia de Cloud SQL con TCP, ejecuta el comando telnet. Telnet intenta conectarse a la dirección IP y al puerto que le proporcionas.

Por ejemplo, si tu instancia de Cloud SQL ejecuta una base de datos MySQL, deberías poder ejecutar telnet en ella en el puerto 3306: telnet 35.193.198.159 3306.

Si el proceso se completa correctamente, verás lo siguiente:

Trying 35.193.198.159...

Connected to 35.193.198.159. .

Si se produce un error, verás interrupciones de telnet hasta que fuerces el cierre del intento:

Trying 35.193.198.159...

^C. .

Cloud Logging

Cloud SQL usa Cloud Logging. Consulta la documentación de Cloud Logging para obtener información completa y revisa las consultas de muestra de Cloud SQL.

Ver registros

Puedes ver los registros de las instancias de Cloud SQL y otros proyectos de Google Cloud, como instancias de Cloud VPN o de Compute Engine. Sigue estos pasos para ver los registros de las entradas de registro de una instancia de Cloud SQL:

Console

  1. En la consola de Google Cloud, ve a la página de Cloud Logging.

    Ir a Cloud Logging

  2. Selecciona un proyecto existente de Cloud SQL en la parte superior de la página.
  3. En el compilador de consultas, agrega lo siguiente:
    • Recurso: Selecciona Base de datos de Cloud SQL. En el cuadro de diálogo, selecciona una instancia de Cloud SQL.
    • Nombres de registros: Desplázate a la sección de Cloud SQL y selecciona los archivos de registro apropiados para la instancia. Ejemplos:
      • cloudsql.googlapis.com/mysql-general.log
      • cloudsql.googleapis.com/mysql.err
    • Gravedad: Selecciona un nivel de registro.
    • Intervalo de tiempo: Selecciona un ajuste predeterminado o crea un intervalo personalizado.

gcloud

Usa el comando gcloud logging para ver las entradas del registro. En el siguiente ejemplo, reemplaza PROJECT_ID. La marca limit es un parámetro opcional que indica la cantidad máxima de entradas que se mostrarán.

gcloud logging read "projects/PROJECT_ID/logs/cloudsql.googleapis.com/mysql-general.log" \
--limit=10

Direcciones IP privadas

Las conexiones a una instancia de Cloud SQL mediante una dirección IP privada se autorizan de forma automática para los rangos de direcciones RFC 1918. Los rangos de direcciones que no son RFC 1918 se deben configurar en Cloud SQL como redes autorizadas. También debes actualizar el intercambio de tráfico entre redes a Cloud SQL para exportar cualquier ruta que no sea RFC 1918. Por ejemplo:

gcloud compute networks peerings update cloudsql-mysql-googleapis-com 
--network=NETWORK
--export-subnet-routes-with-public-ip
--project=PROJECT_ID

Solución de problemas de VPN

Consulta la página de solución de problemas de Cloud VPN.