帮朋友维护一个php的网站,用Navicat链接ECS虚拟机的Mysql服务一直失败,出现php
`Can't connect to mysql server on xxx.xxx.xxx.xxx(10038)`
的问题,加上以前对Mysql的配置一直不是很熟悉,碰到过不少的坑,就记一下,省得之后还得各类查。mysql
虽然Mysql也是Oracle的,可是Mysql的权限管理和Oracle还不同,以前在建立Mysql的用户的时候,觉得和Oracle的同样,用了web
Create user XX identified by xxxx
这样的语句,而后再Mysql里各类赋权限,结果连本地mysql客户端都连不上,很郁闷。后来,偶然的机会,才知道,原来通常在实际使用中,Mysql的受权和用户建立时一起进行的,直接一句话就搞定了:sql
GRANT ALL PRIVILEGES ON *.* TO 'XXX'@'%' IDENTIFIED BY 'xxxx' WITH GRANT OPTION
恰好这句话,还解决了另一个问题,就是那个“%”。它容许XXX用户远程链接Mysql服务,而若是@后边的那个值是 localhost 的话,那XXX用户就只能在服务器上链接Mysql服务了。若是用户不是你建的,那就得去mysql的user表中将该用户的host改成%就好了。安全
好了,用户算是建立完了,接下来,就是对Mysql服务进行配置了。打开/etc/my.cnf,将选项skip-networking注释掉(注:有的资料上说还要讲bind-address设置成127.0.0.1,个人配置文件中反正没看到这句话,也就没有设置。这个选项是用来设置能够进行外部访问Mysql的IP,有一个过滤的做用,也没有必要设置)。服务器
下面,咱们就来看看这个选项是干吗的。这个选项上方有它的说明,大体的意思是这样的:不监听TCP/IP端口;本选项能够做为一个安全加强以确保,全部到Mysqld即Mysql服务的链接都是经过本机进行的;全部与Mysql进行到通讯都必须通过Unix sockets和命名管道。如今明白了吧。socket
回来咱们在my.cnf中往上找,看到在[mysqld]组的配置中,开启了3306的端口和一个Unix socket文件,分别用于远程链接和本地链接。若是不将skip-networking注释掉,咱们就只能经过服务器本地进行链接了,而这对于开发和维护都至关的不方便。tcp
至此,问题就算解决一半了,而后,还得去看看防火墙有没有屏蔽掉3306端口。Centos系统的话,在 /etc/sysconfig/iptables 中,有没有这样一句话:ide
A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
有的话就不用管了,没有就加上。而后重启防svg
service iptables restart
就是重启Mysql的服务了:
service mysql restart。