按照网上的教程学习一些MySQL相关的东西,但是在连接数据数据库的时候,总是提示类似如下错误:
<pre>ERROR 1130 (HY000): Host 'xxxx.xxx.xxx.xxx' is not allowed to connect to this MySQL server
在Eclipse中也是提示比较奇怪的类似的错误。因为我平时学习,开发相关的软件和系统都是安装在虚拟机中,所以感觉应该是远程连接的问题。查看了虚拟机的远程端口已经打开:
[root@shitouer.cn ~]# /etc/init.d/iptables status
Table: filter
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:6381
3 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:6380
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:6379
网络也处于监听正常状态:
[root@shitouer.cn ~]# netstat -anp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2793/mysqld
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1964/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2043/master
问题应该是服务器MySQL远程连接需要授权的问题。网上查了一下,确实是,有两种方法解决:
先看下mysql中user表中数据:
mysql> select user, host, password from user;
+--------+-----------+-------------------------------------------+
| user | host | password |
+--------+-----------+-------------------------------------------+
| root | localhost | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |
| root | slave1 | |
| root | 127.0.0.1 | |
| | localhost | |
| | slave1 | |
| noroot | % | *FD571203974BA9AFE270FE62151AE967ECA5E0AA |
+--------+-----------+-------------------------------------------+
root用户只能在localhost上登录。
6 rows in set (0.00 sec)
1。 改表法。可能是你的帐号不允许从远程登陆,只能在localhost。这个时候只要在localhost的那台电脑,登入mysql后,更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称”%” (未测试 不想这么搞)
mysql>update user set host = '%' where user = 'root';
2. 授权法。例如,你想noroot使用mypassword从任何主机连接到mysql服务器的话。
GRANT ALL PRIVILEGES ON *.* TO 'noroot'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
如果你想允许用户noroot从ip为192.168.1.3的主机连接到mysql服务器,并使用mypassword作为密码
GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
grant all PRIVILEGES on mydatabase.mytables to user@remotehost identified by password
下面逐一分析所有的参数:
all PRIVILEGES 表示赋予所有的权限给指定用户,这里也可以替换为赋予某一具体的权限,例如select, insert, update, delete, create, drop等,具体权限间用“,”半角逗号分隔。
mydatabase.mytables 表示上面的权限是针对于哪个表的,mydatabase指的是数据库,后面跟 * 表示对于所有的表,由此可以推理出:对于全部数据库的全部表授权为“*.*”,对于某一数据库的全部表授权为“数据库名.*”,对于某一数据库的某一表授权为“数据库名.表名”。
user表示你要给哪个用户授权,这个用户可以是存在的用户,也可以是不存在的用户。
remotehost 表示允许远程连接的 IP 地址,如果想不限制链接的 IP 则设置为“%”即可。
password为用户的密码。
执行了上面的语句后,再执行下面的语句,方可立即生效。 > flush privileges;
--转自