Acceso a la raíz de MySQL desde todos los hosts

Instalé el servidor MySQL en una máquina Ubuntu remota. El usuario root se define en la tabla mysql.user esta manera:

 mysql> SELECT host, user, password FROM user WHERE user = 'root'; +------------------+------+-------------------------------------------+ | host | user | password | +------------------+------+-------------------------------------------+ | localhost | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | 127.0.0.1 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | | ::1 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | +------------------+------+-------------------------------------------+ 

Puedo acceder con la root del usuario desde la misma interfaz de línea de comando de máquina remota utilizando el cliente estándar de mysql . Ahora quiero permitir el acceso a la raíz de cada host en Internet , así que intenté agregar la siguiente fila (es un duplicado exacto de la primera fila del volcado anterior, a excepción de la columna del host ):

 mysql> SELECT host, user, password FROM user WHERE host = '%'; +------------------+------+-------------------------------------------+ | host | user | password | +------------------+------+-------------------------------------------+ | % | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx | +------------------+------+-------------------------------------------+ 

Pero mi cliente en mi PC personal continúa diciéndome (he oscurecido la IP del servidor):

Error SQL (2003): No se puede conectar al servidor MySQL en ’46 .xxx ‘(10061)

No puedo decir si es un error de autenticación o un error de red. En el firewall del servidor habilité el puerto 3306 / TCP para 0.0.0.0/0 , y eso está bien para mí …

Hay dos pasos en ese proceso:

a) Otorga privilegios. Como usuario root se ejecuta:

 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password'; 

b) enlazar a todas las direcciones:

La forma más fácil es comentar la línea en su archivo my.cnf :

 #bind-address = 127.0.0.1 

y reiniciar mysql

 service mysql restart 

Por defecto, se vincula solo a localhost, pero si comenta la línea, se enlaza a todas las interfaces que encuentra. Comentando la línea es equivalente a bind-address=* .

Para comprobar dónde se ha enlazado el servicio mysql, ejecute como raíz:

 netstat -tupan | grep mysql 

Actualización para Ubuntu 16:

El archivo de configuración es (ahora)

 /etc/mysql/mysql.conf.d/mysqld.cnf 

(al menos en Ubuntu 16 estándar)

Ejecute la siguiente consulta:

use mysql;

update user set host='%' where host='localhost'

NOTA: No recomendado para uso de producción.

A veces

bind-address = 127.0.0.1

debiera ser

bind-address = *

si tiene muchas redes conectadas a su sistema operativo, debe especificar una de esta red en las direcciones de enlace del archivo my.conf. un ejemplo:

 [mysqld] bind-address = 127.100.10.234 

esta ip es de una configuración ethX.

En mi caso, la configuración de “vincular dirección” era el problema. Comentar esta configuración en my.cnf no ayudó, porque en mi caso, mysql estableció el valor predeterminado en 127.0.0.1 por algún motivo.

Para verificar qué configuración usa actualmente MySql, abra la línea de comando en su casilla local:

 mysql -h localhost -u myname -pmypass mydb 

Lea la configuración actual:

 Show variables where variable_name like "bind%" 

Debería ver 0.0.0.0 aquí si desea permitir el acceso desde todos los hosts. Si este no es el caso, edite su /etc/mysql/my.cnf y establezca bind-address en la sección [mysqld]:

 bind-address=0.0.0.0 

Finalmente reinicie su servidor MySql para elegir la nueva configuración:

 sudo service mysql restart 

Inténtelo de nuevo y verifique si la nueva configuración ha sido recogido.

MariaDB ejecutándose en Raspbian: el archivo que contiene bind-address es difícil de precisar. MariaDB tiene información no muy útil sobre el tema.

solía

 # sudo grep -R bind-address /etc 

para ubicar dónde está la maldita cosa

También tuve que configurar los privilegios y hosts en el mysql como todos los señalados anteriormente.

Y también me divertí mucho abriendo el puerto 3306 para conexiones remotas a mi Raspberry Pi, finalmente utilicé iptables-persistent .

Todo funciona bien ahora.

mysql_update es lo que necesitas.

No sé por qué alguien seguiría las formas más complejas de corregir este problema, cuando MySql gentilmente construyó una herramienta que ya hace esto …