我已经在远程 Ubuntu 机器上安装了 MySQL 服务器。root用户在表中以这种mysql.user方式定义:
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。现在我想 允许从 Internet 上的每个主机进行 root 访问 ,所以我尝试添加以下行(它与先前转储中的第一行完全相同,host列除外):
mysql
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 ,这对我来说没问题… __
更新:
正如评论中提到的,由于 MySql 8 您需要首先显式创建用户,因此命令将如下所示:
CREATE USER 'root'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
原答案:
这个过程有两个步骤:
a) 授予特权。作为 root 用户执行此替换'password'为您当前的 root 密码:
'password'
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';
b) 绑定到所有地址:
最简单的方法是 注释掉 文件中的行my.cnf:
my.cnf
#bind-address = 127.0.0.1
并重新启动mysql
service mysql restart
默认情况下,它只绑定到 localhost,但如果你注释它绑定到它找到的所有接口的行。注释掉该行相当于bind-address=*.
bind-address=*
要检查 mysql 服务绑定的位置,请以 root 身份执行:
netstat -tupan | grep mysql
Ubuntu 16 更新:
配置文件是(现在)
/etc/mysql/mysql.conf.d/mysqld.cnf
(至少在标准 Ubuntu 16 上)