所有主机的MySQL root访问权限

时间:2012-06-27 09:34:08

标签: mysql authentication

我在远程Ubuntu机器上安装了MySQL服务器。 root用户在mysql.user表中以这种方式定义:

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 |
+------------------+------+-------------------------------------------+

我可以使用标准root客户端从同一远程计算机命令行界面使用用户mysql进行访问。现在我想允许来自互联网上每个主机的root访问,所以我尝试添加以下行(它与上一次转储的第一行完全相同,但host列除外) :

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

但是我个人电脑上的客户端继续告诉我(我掩盖了服务器IP):

  

SQL Error(2003):无法连接到'46 .x.x.x上的MySQL服务器'(10061)

我不知道这是认证错误还是网络错误。在服务器防火墙上,我为 0.0.0.0/0 启用了端口 3306 / TCP ,这对我来说没问题......

10 个答案:

答案 0 :(得分:312)

该过程有两个步骤:

a)授予特权。以root用户身份执行:

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

b)绑定到所有地址:

最简单的方法是注释 my.cnf文件中的行:

#bind-address = 127.0.0.1 

并重启mysql

service mysql restart

默认情况下,它仅绑定到localhost,但如果您对该行进行注释,则它会绑定到它找到的所有接口。注释掉该行等同于bind-address=*

检查mysql服务绑定的位置以root身份执行:

netstat -tupan | grep mysql

更新Ubuntu 16:

配置文件是(现在)

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

(至少在标准的Ubuntu 16上)

答案 1 :(得分:29)

运行以下查询:

use mysql;

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

注意:不建议用于生产用途。

答案 2 :(得分:7)

有时

  

bind-address = 127.0.0.1

应该是

  

bind-address = *

答案 3 :(得分:4)

在Raspbian上运行的MariaDB - 包含bind-address的文件很难确定。 MariaDB在这个主题上有一些not-very-helpful-info

我用过

df.select("device").where("signal > 10")      // using untyped APIs   
ds.filter(_.signal > 10).map(_.device)         // using typed APIs
找到该死的东西。

我还必须像上面指出的每个人一样在mysql中设置权限和主机。

还有一些乐趣时间打开3306端口以远程连接到我的Raspberry Pi - 最后使用iptables-persistent

现在一切都很棒。

答案 4 :(得分:2)

MYSQL 8.0-打开mysql命令行客户端
将所有特权授予*。*到'root'@'localhost';
使用mysql
UPDATE mysql.user SET host ='%'WHERE user ='root';
重新启动mysql服务

答案 5 :(得分:1)

如果您的操作系统附加了许多网络,则必须在my.conf文件的bind-addres中指定此网络中的一个。  一个例子:

[mysqld]
bind-address = 127.100.10.234

此ip来自ethX配置。

答案 6 :(得分:1)

在我的情况下,“绑定地址”设置是问题所在。在my.cnf中评论此设置时,不是有帮助,因为在我的情况下,mysql出于某种原因将默认设置为127.0.0.1。

要验证MySql当前使用的设置,请在本地框中打开命令行:

mysql -h localhost -u myname -pmypass mydb

读出当前设置:

Show variables where variable_name like "bind%"

如果要允许所有主机访问,您应该在此处看到0.0.0.0。如果不是这种情况,请编辑/etc/mysql/my.cnf并在[mysqld]部分下设置bind-address:

bind-address=0.0.0.0

最后重新启动MySql服务器以获取新设置:

sudo service mysql restart

再试一次,检查新设置是否已被选中。

答案 7 :(得分:0)

mysql_update是您所需要的。

当MySql优雅地构建了一个已经可以做到这一点的工具时,我不知道为什么有人会遵循更复杂的方法来纠正此问题。

答案 8 :(得分:0)

更新bind-address = 0.0.0.0中的/etc/mysql/mysql.conf.d/mysqld.cnf,并从mysql命令行允许root用户从任何IP连接。

下面是唯一可用于 mysql-8.0 的命令,其他命令均因错误syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'abcd'' at line 1

而失败
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
UPDATE mysql.user SET host='%' WHERE user='root';

重新启动mysql客户端

sudo service mysql restart

答案 9 :(得分:0)

我正在使用AWS LightSail,为了使我的实例正常工作,我必须进行更改:

bind-address = 127.0.0.1

bind-address = <Private IP Assigned by Amazon>

然后我可以进行远程连接。