我已经在远程 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 |
+------------------+------+-------------------------------------------+
我可以使用标准 mysql
客户端通过用户 root
从同一远程计算机命令行界面访问。现在我想允许互联网上每个主机的 root 访问权限,所以我尝试添加以下行(它与之前转储中的第一行完全相同,除了 host
列):
mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host | user | password |
+------------------+------+-------------------------------------------+
| % | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+
但是我个人 PC 上的客户端继续告诉我(我隐藏了服务器 IP):
SQL 错误 (2003): 无法连接到“46.xxx”上的 MySQL 服务器 (10061)
我不知道这是身份验证错误还是网络错误。在服务器防火墙上,我为 0.0.0.0/0 启用了端口 3306/TCP,这对我来说没问题...
bind-address
更新:
正如评论中提到的,由于 MySql 8 您需要首先显式创建用户,因此命令将如下所示:
CREATE USER 'root'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
原答案:
这个过程有两个步骤:
a) 授予特权。作为 root 用户执行此替换 'password'
与您当前的 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 上)
运行以下查询:
use mysql;
update user set host='%' where host='localhost'
注意:不推荐用于生产用途。
update mysql.user set host='%' where user='root'
MYSQL 8.0 - 打开 mysql 命令行客户端
GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
使用 mysql
UPDATE mysql.user SET host='%' WHERE user='root';
重启mysql服务
有时
绑定地址 = 127.0.0.1
应该
绑定地址 = *
MariaDB 在 Raspbian 上运行 - 包含绑定地址的文件很难查明。 MariaDB 有一些关于此主题的not-very-helpful-info。
我用了
# sudo grep -R bind-address /etc
找到该死的东西在哪里。
就像上面提到的每个人一样,我还必须在 mysql 中设置权限和主机。
并且在打开 3306 端口以远程连接到我的 Raspberry Pi 时也玩得很开心 - 最后使用了 iptables-persistent。
现在一切都很好。
我正在使用 AWS LightSail,为了让我的实例正常工作,我必须进行更改:
bind-address = 127.0.0.1
至
bind-address = <Private IP Assigned by Amazon>
然后我就可以远程连接了。
如果您的操作系统连接了许多网络,您必须在 my.conf 文件的绑定地址中指定其中一个网络。一个例子:
[mysqld]
bind-address = 127.100.10.234
此 ip 来自 ethX 配置。
就我而言,“绑定地址”设置是问题所在。在 my.cnf
中评论此设置确实 not 有帮助,因为在我的情况下,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=0.0.0.0
最后重新启动您的 MySql 服务器以获取新设置:
sudo service mysql restart
重试并检查是否已选择新设置。
更新 /etc/mysql/mysql.conf.d/mysqld.cnf
中的 bind-address = 0.0.0.0
并从 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
mysql_update
是您所需要的。
我不知道为什么有人会遵循更复杂的方法来纠正这个问题,当 MySql 慷慨地构建了一个已经这样做的工具时......
不定期副业成功案例分享
USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';