🎨 Sysprovider Code
Sysprovider LogoWiki
🇪🇸Hosting español para ecommerce

Solución de errores comunes al conectar aplicaciones a MySQL (Access denied, Connection refused)

Actualizado el 20 de marzo de 2026

Introducción: Cuando MySQL te cierra la puerta

Conectar una aplicación web a una base de datos MySQL es como tender un puente entre dos mundos: el de tu código y el de tus datos. Cuando ese puente se rompe, la frustración aparece rápido. Los dos errores más comunes que verás en pantalla son error mysql access denied y connection refused mysql. Si estás leyendo esto, probablemente ya los has visto y necesitas una solución clara, paso a paso, sin tecnicismos innecesarios.

No te preocupes. Aquí no vamos a asumir que eres un administrador de sistemas con 20 años de experiencia. Vamos a desglosar cada error, entender por qué ocurre y darte soluciones prácticas que puedes aplicar hoy mismo, aunque nunca hayas tocado un servidor antes.


Comprendiendo el problema: ¿Qué significa realmente cada error?

Antes de lanzarnos a cambiar configuraciones, es crucial entender la diferencia entre ambos mensajes. Aunque a veces se confunden, apuntan a problemas distintos.

Error MySQL Access Denied: El "No tienes permiso"

Este error significa que tu aplicación sí encontró el servidor MySQL, pero el usuario o la contraseña que usaste no son válidos, o el usuario no tiene permisos para conectarse desde ese lugar. El mensaje típico es:

ERROR 1045 (28000): Access denied for user 'usuario'@'localhost' (using password: YES)

Piénsalo como intentar entrar a tu casa con una llave equivocada: la cerradura (el servidor) está ahí, pero la llave (credenciales) no abre.

Connection Refused MySQL: El "No te conozco"

Aquí el problema es más básico: tu aplicación ni siquiera puede hablar con el servidor MySQL. El mensaje típico es:

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

Es como llamar a la puerta de una casa que no existe, o donde nadie responde. Puede ser que MySQL no esté corriendo, que el puerto esté bloqueado, o que el servidor esté escuchando en una dirección diferente a la que configuraste.


Sección 1: Solucionar el error MySQL Access Denied

Este es, con diferencia, el error más frecuente. Vamos a revisar las causas más comunes y sus soluciones, de la más simple a la más compleja.

1.1 Verifica tus credenciales (lo obvio pero vital)

Suena tonto, pero el 70% de los casos de error mysql access denied se resuelven aquí. Revisa:

  • Usuario: ¿Tiene mayúsculas o minúsculas? MySQL es sensible a esto en los nombres de usuario.
  • Contraseña: ¿Hay espacios invisibles al copiar y pegar? ¿Tienes activado el bloqueo de mayúsculas?
  • Base de datos: Algunos usuarios solo tienen permisos sobre una base de datos específica. Si intentas acceder a otra, el acceso se deniega.

[TIP] Prueba conectarte directamente desde la terminal o consola de tu servidor con: mysql -u tu_usuario -p. Si esto funciona, el problema está en cómo tu aplicación envía las credenciales, no en el servidor.

1.2 El problema del "MySQL host no permitido"

Este es un clásico. MySQL permite a cada usuario conectarse solo desde ciertos hosts. Si tu aplicación está en un servidor web y la base de datos en otro, el usuario debe estar configurado para aceptar conexiones desde la IP del servidor web.

El error típico sería: ERROR 1130 (HY000): Host '1.2.3.4' is not allowed to connect to this MySQL server

La solución es crear o modificar el usuario para que acepte conexiones desde el host correcto. Conéctate como root a MySQL y ejecuta:

CREATE USER 'mi_usuario'@'%' IDENTIFIED BY 'mi_contraseña_fuerte';
GRANT ALL PRIVILEGES ON mi_base_datos.* TO 'mi_usuario'@'%';
FLUSH PRIVILEGES;

El '%' significa "desde cualquier host". Es la opción más flexible, pero también la menos segura. Si puedes, especifica la IP exacta del servidor de tu aplicación, por ejemplo 'mi_usuario'@'192.168.1.100'.

[WARNING] Usar '%' es cómodo pero abre tu base de datos a todo el mundo. Si tu servidor MySQL está expuesto a internet, es una invitación a problemas de seguridad. Siempre que puedas, limita el host.

1.3 Permisos insuficientes para el usuario

A veces el usuario existe y la contraseña es correcta, pero le faltan permisos sobre la base de datos que la aplicación intenta usar. Para verificar y corregir:

-- Ver los permisos actuales
SHOW GRANTS FOR 'mi_usuario'@'localhost';

-- Otorgar todos los permisos sobre una base de datos específica
GRANT ALL PRIVILEGES ON mi_base_datos.* TO 'mi_usuario'@'localhost';
FLUSH PRIVILEGES;

Si tu aplicación necesita crear o modificar tablas (migraciones, instaladores), necesitará permisos de escritura. Si solo lee datos, con SELECT basta.

1.4 El usuario root y los problemas de autenticación

En muchas instalaciones, especialmente en Ubuntu, el usuario root de MySQL usa auth_socket en lugar de contraseña. Esto significa que solo puedes conectarte como root si eres el usuario root del sistema operativo, o usando sudo. Si tu aplicación intenta conectarse como root con contraseña, fallará.

Solución: Crea un usuario dedicado para tu aplicación, nunca uses root para eso. Es una mala práctica de seguridad.

CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'contraseña_segura_2024!';
GRANT ALL PRIVILEGES ON mi_app_db.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;

Sección 2: Solucionar el error Connection Refused MySQL

Este error indica que el servidor MySQL no está accesible. Vamos a revisar las causas más comunes.

2.1 ¿MySQL está realmente corriendo?

El primer paso es verificar si el servicio está activo. Dependiendo de tu sistema operativo:

En sistemas con systemd (Ubuntu, Debian, CentOS 7+):

sudo systemctl status mysql
# o a veces es mariadb
sudo systemctl status mariadb

Si no está activo, inícialo:

sudo systemctl start mysql
sudo systemctl enable mysql  # Para que arranque automáticamente

En sistemas con SysV (CentOS 6, versiones antiguas):

sudo service mysql status
sudo service mysql start

2.2 El puerto de MySQL está bloqueado o escuchando en la dirección incorrecta

Por defecto, MySQL escucha en el puerto 3306. Si tu aplicación intenta conectarse a otro puerto, o si el servidor MySQL está configurado para escuchar solo en localhost, tendrás un connection refused mysql.

Para ver en qué dirección y puerto está escuchando MySQL:

sudo netstat -tlnp | grep mysql

Deberías ver algo como 0.0.0.0:3306 o 127.0.0.1:3306. Si solo ves 127.0.0.1, significa que MySQL solo acepta conexiones locales. Si tu aplicación está en otro servidor, necesitas cambiar la configuración.

Edita el archivo de configuración de MySQL (normalmente /etc/mysql/mysql.conf.d/mysqld.cnf o /etc/my.cnf) y busca la línea bind-address:

# Cambia esto:
bind-address = 127.0.0.1
# Por esto para aceptar conexiones de cualquier host:
bind-address = 0.0.0.0

[WARNING] Cambiar bind-address a 0.0.0.0 expone tu MySQL a toda la red. Asegúrate de que tu firewall esté configurado para permitir solo conexiones desde los hosts de confianza.

Reinicia MySQL después del cambio: sudo systemctl restart mysql.

2.3 Firewall bloqueando el puerto 3306

Este es un culpable muy común, especialmente en servidores en la nube (AWS, DigitalOcean, Google Cloud). El firewall puede estar bloqueando el puerto 3306.

En Ubuntu con UFW:

sudo ufw allow from 192.168.1.100 to any port 3306
# O si quieres permitir desde cualquier IP (menos seguro):
sudo ufw allow 3306/tcp

En CentOS/RHEL con firewalld:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload

Además, si estás en un proveedor cloud, revisa los Security Groups o las reglas de red en el panel de control. Muchas veces el firewall del sistema operativo está bien, pero el proveedor bloquea el puerto a nivel de red.

2.4 El servidor MySQL está en un contenedor o máquina virtual

Si MySQL corre en Docker o en una máquina virtual, necesitas asegurarte de que el puerto 3306 esté mapeado correctamente al host.

En Docker, verifica que el contenedor tiene publicado el puerto:

docker ps
# Deberías ver algo como: 0.0.0.0:3306->3306/tcp

Si no lo ves, tendrás que recrear el contenedor con -p 3306:3306.


Sección 3: Casos especiales y soluciones avanzadas

3.1 Cuando usas Syspanel (HestiaCP) como panel de control

Si tu hosting usa Syspanel (antes conocido como HestiaCP), la gestión de bases de datos tiene sus particularidades. Recuerda que el acceso al panel se hace por el puerto 2106 (por ejemplo, https://tu-dominio.com:2106).

Dentro de Syspanel, ve a la sección de Bases de Datos. Aquí podrás:

  • Ver los usuarios y hosts permitidos para cada base de datos.
  • Cambiar contraseñas de usuarios de BD.
  • Añadir hosts remotos desde los que se permite la conexión.

[INFO] En Syspanel, la gestión de usuarios de BD suele tener un campo llamado "Host" o "Acceso remoto". Asegúrate de que esté configurado correctamente para tu caso de uso. Si tu aplicación está en el mismo servidor, usa localhost. Si está en otro servidor, pon la IP de ese servidor o % si necesitas flexibilidad.

3.2 Problemas de autenticación con versiones antiguas de MySQL

Si tu aplicación usa una versión antigua de PHP o de un cliente MySQL, puede haber problemas de compatibilidad con los métodos de autenticación más nuevos. MySQL 8+ usa caching_sha2_password por defecto, que no es compatible con clientes antiguos.

Solución: Cambiar el método de autenticación del usuario a mysql_native_password:

ALTER USER 'mi_usuario'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mi_contraseña';
FLUSH PRIVILEGES;

3.3 El problema de los saltos (hops) y las conexiones SSH

Si tu aplicación está en un servidor y MySQL en otro, y hay una red compleja de por medio, a veces es necesario usar túneles SSH. Esto es avanzado, pero una solución rápida para pruebas es usar:

ssh -L 3306:localhost:3306 usuario@servidor-mysql

Esto redirige el puerto 3306 local al puerto 3306 del servidor MySQL a través de SSH. Luego, tu aplicación puede conectarse a localhost:3306.


Sección 4: Guía de diagnóstico paso a paso (Checklist)

Cuando todo falla, sigue esta lista en orden. Te llevará de lo más simple a lo más complejo sin saltarte nada.

  1. Verifica que MySQL está corriendo: sudo systemctl status mysql o sudo service mysql status.
  2. Prueba la conexión local: mysql -u tu_usuario -p -h localhost. Si falla, es un problema de credenciales. Si funciona, sigue.
  3. Prueba la conexión remota: mysql -u tu_usuario -p -h IP_DEL_SERVIDOR. Si falla, es un problema de red o de bind-address.
  4. Verifica el bind-address: Asegúrate de que MySQL escucha en la IP correcta.
  5. Revisa el firewall: sudo ufw status o sudo firewall-cmd --list-all.
  6. Revisa los permisos del usuario: SHOW GRANTS FOR 'tu_usuario'@'host';.
  7. Revisa los logs de MySQL: Normalmente en /var/log/mysql/error.log. Busca líneas con "Access denied" o "Connection refused".

Sección 5: Preguntas frecuentes (FAQ)

¿Por qué mi aplicación da error MySQL access denied si la contraseña es correcta?

Puede ser que el usuario esté configurado solo para localhost y tu aplicación se conecte desde otro host. Revisa la sección 1.2 sobre mysql host no permitido. También puede ser que el usuario no tenga permisos sobre la base de datos específica.

¿Cómo sé si MySQL está escuchando en el puerto 3306?

Usa sudo netstat -tlnp | grep 3306. Si no ves nada, MySQL no está escuchando, lo que causará connection refused mysql. También puedes usar telnet IP_DEL_SERVIDOR 3306 desde otra máquina.

¿Es seguro usar el usuario root para mi aplicación?

No, nunca. Es una mala práctica de seguridad. Crea un usuario dedicado con solo los permisos necesarios para tu aplicación.

¿Qué hago si mi hosting usa Syspanel y no encuentro la opción de host remoto?

En Syspanel (puerto 2106), ve a la sección de Bases de Datos. Al editar un usuario de BD, deberías ver un campo "Host" o "Acceso remoto". Si no lo ves, puede que necesites usar el campo % para permitir cualquier host, o contactar con el soporte técnico de tu hosting.

¿Puedo tener MySQL y mi aplicación en servidores diferentes?

Sí, es totalmente posible. Solo necesitas asegurarte de que el bind-address de MySQL esté configurado para aceptar conexiones remotas, que el firewall permita el puerto 3306, y que el usuario de MySQL tenga permisos para conectarse desde el host de tu aplicación.

¿Por qué me sale "connection refused mysql" pero el servidor está corriendo?

Puede ser que MySQL esté escuchando solo en 127.0.0.1 (localhost). Si tu aplicación intenta conectarse a una IP remota, el servidor rechazará la conexión. Cambia el bind-address a 0.0.0.0 y reinicia MySQL.


Conclusión: La paciencia es tu mejor herramienta

Resolver errores de conexión a MySQL puede ser frustrante, pero con un enfoque metódico, casi siempre se encuentra la solución. Recuerda la diferencia fundamental:

  • Access denied = El servidor te conoce pero no te deja pasar (credenciales o permisos).
  • Connection refused = El servidor ni siquiera te responde (red, firewall, bind-address).

Empieza siempre por las soluciones más simples: verifica credenciales, comprueba que el servicio está activo y revisa los permisos del usuario. Y si usas un panel como Syspanel, asegúrate de entender cómo gestiona los hosts permitidos para cada base de datos.

[TIP] Antes de cambiar nada, haz una copia de seguridad de tus archivos de configuración. Un simple sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak puede ahorrarte muchos dolores de cabeza.

Con estas guías, deberías poder resolver el 95% de los problemas de conexión a MySQL. Si después de todo esto sigues atascado, no dudes en consultar los logs de MySQL y buscar el mensaje de error exacto en internet. La comunidad de desarrolladores es enorme, y casi con seguridad alguien ya ha tenido tu mismo problema y ha encontrado la solución.

¡Buena suerte con tus conexiones y que tus aplicaciones funcionen sin interrupciones!

¿Necesitas ayuda?Son dos de nuestros técnicos, Agustín y Mikel, y están disponibles para resolver cualquier problema.

Hablar con ellos ahora
Agustín y Mikel