我在远程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 ,这对我来说没问题......
答案 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>
然后我可以进行远程连接。