Acceso root de MySQL desde todos los hosts
He instalado MySQL Server en una máquina Ubuntu remota. El usuario root
se define en la tabla mysql.user
de 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 user root
desde la misma interfaz de línea de comandos de la máquina remota utilizando el cliente estándar mysql
. Ahora quiero permitir el acceso root desde cada host en Internet, así que intenté agregar la siguiente fila (es un duplicado exacto de la primera fila del volcado anterior, excepto por la columna host
):
mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host | user | password |
+------------------+------+-------------------------------------------+
| % | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+
Pero mi cliente en mi personal PC sigue diciéndome (oscureció la IP del servidor):
Error SQL (2003): No se puede conectar al servidor MySQL en el '46.x. x. x' (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í...
7 answers
Hay dos pasos en ese proceso:
A) Conceder privilegios. Como usuario root ejecutar:
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';
B) enlace 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 enlaza solo a localhost, pero si comentas la línea se enlaza a todas las interfaces que encuentra. Comentar la línea es equivalente a bind-address=*
.
Para comprobar dónde el servicio mysql ha enlazado ejecutar 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 estándar 16)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-14 07:46:31
Ejecute la siguiente consulta:
use mysql;
update user set host='%' where host='localhost'
NOTA: No recomendado para uso en producción.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-13 15:31:15
A veces
Bind-address = 127.0.0.1
Debe ser
Bind-address = *
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-08 16:52:31
MariaDB corriendo en Raspbian - el archivo que contiene bind-address es difícil de identificar. MariaDB tiene algo no-muy-útil-info sobre el tema.
He utilizado
# sudo grep -R bind-address /etc
Para localizar dónde está la maldita cosa.
También tuve que establecer los privilegios y hosts en mysql como todos los anteriores señalaron.
Y también me divertí abriendo el puerto 3306 para conexiones remotas a mi Raspberry Pi - finalmente usé iptables-persistent.
Todos funciona muy bien ahora.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-01 16:17:14
Si tiene muchas redes conectadas a su sistema operativo, debe especificar una de esta red en las direcciones de enlace de mi.archivo conf. un ejemplo:
[mysqld]
bind-address = 127.100.10.234
Esta ip es de una configuración ethX.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-24 17:12:37
mysql_update
es lo que necesitas.
No se por qué alguien seguiría las formas más complejas de corregir este problema, cuando MySQL gentilmente construyó una herramienta que ya hace esto...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-19 10:24:10
En mi caso la configuración "bind-address" fue el problema. Comentar esta configuración en my.cnf
hizo no ayuda, porque en mi caso mysql estableció el valor predeterminado a 127.0.0.1 por alguna razón.
Para verificar qué configuración está usando MySQL actualmente, abra la línea de comandos en su casilla local:
mysql -h localhost -u myname -pmypass mydb
Lee 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 recoger la nueva configuración:
sudo service mysql restart
Inténtelo de nuevo y compruebe si se ha seleccionado la nueva configuración.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-26 21:21:47