MySQL no puede conectarse a través de "localhost", solo 127.0.0.1


27

Esto es un misterio para mí. La única forma en que puedo conectarme a MySQL es si lo llamo a través de "127.0.0.1" ... por ejemplo, mi script PHP connect NO funcionará con localhost

Estoy ejecutando Mac OS X Lion, apache2 incorporado, MySQL, PHP, phpMyAdmin

mysqladmin:

count                             0
debug-check                       FALSE
debug-info                        TRUE
force                             FALSE
compress                          FALSE
character-sets-dir                (No default value)
default-character-set             auto
host                              (No default value)
no-beep                           FALSE
port                              0
relative                          FALSE
socket                            (No default value)
sleep                             0
ssl                               FALSE
ssl-ca                            (No default value)
ssl-capath                        (No default value)
ssl-cert                          (No default value)
ssl-cipher                        (No default value)
ssl-key                           (No default value)
ssl-verify-server-cert            FALSE
user                              (No default value)
verbose                           FALSE
vertical                          FALSE
connect-timeout                   43200
shutdown-timeout                  3600
plugin-dir                        (No default value)
default-auth                      (No default value)

1
Esto probablemente sea más por un error del servidor, pero asegúrese de que su archivo de hosts tenga el alias localhost.
Matt

127.0.0.1 localhost está en mi archivo de hosts.
dcolumbus

Abra el símbolo del sistema y escriba ping localhosty vea lo que dice.
Steve Robbins

64 bytes de 127.0.0.1: icmp_seq = 0 ttl = 64 tiempo = 0.100 ms 64 bytes de 127.0.0.1: icmp_seq = 1 ttl = 64 tiempo = 0.102 ms 64 bytes de 127.0.0.1: icmp_seq = 2 ttl = 64 tiempo = 0.096 ms
dcolumbus

Respuestas:


26

MySQL intentará conectarse al socket de Unix si le dice que se conecte a "localhost". Si le dice que se conecte a 127.0.0.1, lo está obligando a conectarse a la toma de red. Entonces, probablemente tenga MySQL configurado para escuchar solo el zócalo de la red y no el zócalo del sistema de archivos.

Lo que está mal exactamente con su socket Unix es difícil de decir. Pero le recomiendo que lea esta página en la guía de referencia de MySQL. Esto debería ayudarte.

ACTUALIZACIÓN: Basado en la pregunta actualizada: el parámetro "socket" debería ser algo como esto: "/var/lib/mysql/mysql.sock". Esta página en el Manual de referencia tiene más información.

Aquí tienes el comienzo de mi archivo /etc/my.cnf:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

Su archivo debe ser similar. Entonces tu problema debería estar resuelto. No olvide reiniciar el servidor MySQL antes de probarlo.


1
Wow: "Se utiliza un archivo de socket Unix si no especifica un nombre de host o si especifica el nombre de host especial localhost". Eso parece ... poco intuitivo. De ahí todas las otras respuestas.
Mark Wagner

Eso es bueno saber +1
Matt

Aprecio la teoría ... simplemente no sé cuál es la respuesta.
dcolumbus

@dcolumbus: Como ya escribí, es difícil saberlo. Lo que puedo recomendar es abrir una consola y simplemente escribir el comando "mysql". Quizás obtengas más información entonces. Otra cosa es buscar en el archivo de registro. El mío se encuentra en el directorio / var / log / y se llama mysql.log. El tuyo podría tener otro nombre u otra ubicación. Si puede proporcionarnos más información, probablemente podamos ayudarlo mejor.
Raffael Luthiger

2
php.ini tiene referencias a "/var/mysql/mysql.sock" (3 lugares para ser exactos) que deben cambiarse a "/tmp/mysql.sock" ... ¡Gracias por su ayuda!
dcolumbus

8

Es posible que tenga habilitado IPv6, su muy posible localhost se resuelve en el ipv6 localhost, que no está definido en su configuración de msql.

También tuve un problema donde tuve que agregar 'localhost' en lugar de '127.0.0.1' a las subredes permitidas para ese usuario, no entiendo por qué (estaba usando ipv4 y fue hace un tiempo) pero vale la pena intentarlo.


Puede verificar esto al ver si 'host localhost' en la línea de comando devuelve :: 1 y 127.0.0.1. Si es así, puede eliminar la asignación :: 1 de / private / etc / hosts o reconfigurar MySQL para escuchar en la dirección IPv6 :: 1, así como 127.0.0.1
David North

Creo recordar haber leído en alguna parte que IPv6 está habilitado de forma predeterminada en Mac OS X ... ¿es ese el caso?
dcolumbus

ipv6 está habilitado para casi todos los sistemas operativos modernos en estos días, estoy en osx10.6 y está habilitado de forma predeterminada.
Silverfire

incorrecto. Localhost tiene un significado especial para los clientes mysql: visite serverfault.com/a/295300/67675
poige

5

Para mí, el php incorporado de OSX está configurado para usar un socket unix diferente al mysql de homebrew. Por lo tanto, no se puede conectar a través de localhost que utiliza ese socket.

Lo arreglé con un truco rápido al simular la ruta de socket configurada de php para que apunte a la que mysql realmente usa.

sudo ln -s /tmp/mysql.sock /var/mysql/mysql.sock

Los siguientes comandos de diagnóstico fueron muy útiles.

Verifique las rutas de socket predeterminadas utilizadas por php y mysql:

php -i | fgrep 'mysql.default_socket'
mysql -e 'show variables where variable_name = "socket"'

Conéctese utilizando un socket especificado:

php -r 'var_dump(mysql_connect("localhost:/tmp/mysql.sock", "user", "pass"));'
mysql --socket=/tmp/mysql.sock

Determine qué tipo de socket utiliza el cliente mysql para conectarse:

lsof | egrep '^mysql .*(IPv|unix)'

2

¿Podría verificar mysql/conf/my.conf(la estructura del directorio debería ser la misma en OSx) para ver si no skip-networkingestá comentada? Si es así, agregue un #frente de la línea y reinicie el servidor mysql.

De hecho, tuve un problema similar hace un tiempo (aunque eso no estaba en OSx), así que pensé que valdría la pena intentarlo.


1
¿Por qué esto fue rechazado? Una explicación sería útil.
karllindmark

No te rechacé, pero tu respuesta es en realidad lo opuesto a lo que pregunta el OP. Pero te voté porque luché con la condición opuesta: me conectaría a través de un enchufe, pero NO a través de la red. Por cierto, NO PODRÍA arreglar esto a través de my.conf; Tuve que ponerlo en la línea de comando: "mysqlf --skip_networking = 0 ..."
Jan Steinman

2

PHP todavía está tratando de usar la ubicación de socket predeterminada. Este problema puede aparecer si ha movido la carpeta MariaDB / MySQL de / var / lib / mysql a otra ubicación. Para resolver el problema, debe definir la ubicación del nuevo socket en el archivo /etc/php.ini .

mysqli.default_socket =/newDBLocation/mysql/mysql.sock

Tenga cuidado, dependiendo del controlador que utilice, es posible que deba especificar pdo_mysql.default_socket = !

Para verificar su directorio actual ejecute el siguiente comando en mysql:

select @@datadir;


1

Pude recrear sus mismos síntomas en mi cuadro de prueba, espero que esto ayude.

En MySQL, los usuarios están definidos por dos partes (nombre y host). Por defecto, MySQL tendrá 3 usuarios root:

mysql> SELECT host,user,password FROM mysql.user WHERE user='root';
+-----------------------+------+-------------------------------------------+
| host                  | user | password                                  |
+-----------------------+------+-------------------------------------------+
| localhost             | root |                                           |
| localhost.localdomain | root |                                           |
| 127.0.0.1             | root | *PASSWORD_HASH_GOES_HERE                  |
+-----------------------+------+-------------------------------------------+

El campo de contraseña estará en blanco (sin contraseña) o tendrá un hash almacenado. Si configura la contraseña para un usuario específico, no se actualizará automáticamente, ya que MySQL los ve como usuarios diferentes.

Por ejemplo:

mysql> set password for 'root'@'127.0.0.1' = password('Password');

actualizará la contraseña para 'root'@'127.0.0.1', pero no 'root'@'localhost'o'root'@'localhost.localdomain'

Echa un vistazo a la skip_name_resolvevariable:

mysql> show variables like 'skip_name_resolve';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| skip_name_resolve | ON    |
+-------------------+-------+
1 row in set (0.00 sec)

Por defecto skip_name_resolvees OFF, e intentará resolver todas las direcciones IP a nombres de host. Por ejemplo, si te conectas como 'root'@'127.0.0.1', MySQL cambiará conectarte como 'root'@'localhost'.

Si es así ON, MySQL verá y se conectará 'root'@'127.0.0.1'y, 'root'@'localhost'como usuarios separados. Y pueden tener o no contraseñas diferentes, dependiendo de cómo se establecieron.


Primero, verificaría si hay diferencias de contraseña: mysql> SELECT host,user,password FROM mysql.user WHERE user='root';

Si los hay, puede arreglarlos o puede continuar investigando.

Entonces verificaría skip_name_resolve: mysql> show variables like 'skip_name_resolve';

Si es así ON, averiguaría dónde se está configurando (por ejemplo /etc/my.cnf) y lo eliminaría, a menos que sea necesario.

¡Espero que esto te ayude!


1

Estaba teniendo este problema y no pude resolverlo. Intenté todo lo que pude sin resultado.

Descubrí que tenía un .netrc en / root / que tenía información.

Lo eliminé y el problema desapareció.

Capaz de iniciar sesión en mysql usando mysql -uroot -p sin problema ahora.

Sé que esta es una publicación antigua, pero espero que esto ayude a alguien.


1

Para mí, cambiar los permisos para que se puedan leer públicamente en el directorio principal de mysql.sock solucionó el problema:

chmod 755 /var/lib/mysql

1

Para las personas que usan CageFS con CloudLinux:

Recreaba /var/lib/mysqlporque estaba reconstruyendo el servidor MySQL desde cero ...

que desmontó el camino de las jaulas. Sé que no está relacionado, pero estaba usando cPanel y CloudLinux. No pude verificar por qué la conexión de socket no funcionaría, y finalmente, me di cuenta.

agregando /var/lib/mysqla /etc/cagefs/cagefs.mp (si ya existe, continúe con el siguiente paso) y ejecutando

cagefsctl --remount-all

solucionó el problema


1
¡DIOS MIO! ¡Esto es lo que me arregló! Ya estaba en /etc/cagefs/cagefs.mpfuncionamiento pero lo cagefsctl --remount-allreparó. ¡Gracias hombre!
Alvaro Flaño Larrondo

0

tienes que definirlo en privado / etc / hosts, creo ... o simplemente usar 127.0.0.1 porque de todos modos es lo mismo, solo un alias.


127.0.0.1 localhost está en mi archivo de hosts.
dcolumbus
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.