CentOS的MySQL远程连接ERROR 2003 (HY000):Can't connect to MySQL server on'XXXXX'(111) 的问题

   今天在CentOS7虚拟机上安装了mysql,想要在宿主机上远程连接,结果一直报错,就百度了原因,这里分享一篇博客以及自己的一点知识。

   引用:

问题描述:

从一台linux远程连接另一台linux上的MySQL, 出现ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.85'(111)错误。

[ mysql@vvmvcs0 ~]$ mysql -hxxx.xxx.xxx.85 -uroot -p
Enter password: www.2cto.com
ERROR 2003 (HY000): Can't connect to MySQL server on 'xxx.xxx.xxx.85' (111)

[mysql@vvmvcs0 ~]$ perror 111
OS error code 111: Connection refused
查看errorCode
[mysql@vvmvcs0 ~]$ perror 111
OS error code 111: Connection refused

问题分析:
1,可能网络连接问,远程ping xxx.xxx.xxx.85 ,能ping通,排除此情况

[mysql@vvmvcs0 ~]$ ping xxx.xxx.xxx.85
PING xxx.xxx.xxx.85 (xxx.xxx.xxx.85) 56(84) bytes of data.
64 bytes from xxx.xxx.xxx.85: icmp_seq=1 ttl=63 time=0.230 ms

2,排查可能由于85上my.cnf里配置了skip_networking或者bind_address,只允许本地socket连接

2.1 在[mysqld]下设置skip_networking,
知识说明: 这使用MySQL只能通过本机Socket连接(socket连接也是本地连接的默认方式),放弃对TCP/IP的监听 www.2cto.com
当然也不让本地java程序连接MySQL(Connector/J只能通过TCP/IP来连接)。

2.2 可能使用了bind_address=127.0.0.1(当然也可以是其他ip)
[mysqld]
bind_address=127.0.0.1
知识说明:这种情况可以TCP/IP连接
通过查看了my.cnf文件,以上两个都是没设置的,排除掉这两种情况

3,排查DNS解析问题,检查是否设置了: skip_name_resolve。 这个情况肯定不可能,因为我用的是ip,不是主机名。
[mysqld]
skip_name_resolve
知识说明:这个参数加上后,不支持主机名的连接方式。
4, 排查用户和密码问题, 其实用户和密码的错误,不会出现111的,所以排除用户密码问题
ERROR 1045 (28000): Access denied for user 'root'@'XXXX' (using password: YES)

5,排查--port问题,有可能85的MySQL port不是默认3306, 这样我远程连接时,没有指定--port,用的是3306, 而85上没有对3306进行监听。
ps -ef | grep mysqld
果然是: 85上的MySQL使用的是3308 port.
最终连接方式:加上--port=3308
[mysql@vvmvcs0 ~]$ mysql -hxxx.xxx.xxx.85 -uroot -p --port=3308
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
其实根本原因是:
1. MySQL本地连接,如果不指mysql --protocol=tcp, 连接默认是socket方式连接的。这点大家都知道。
2, MySQL socket连接是根据sokect文件来的,与--port不相关的,如果是一机多实例,则用-S(或者--socket=name )来指定连接哪个实例。
就是这个socket连接对--port无识别效果,导致排查这个问题这么久。
见下面: 其实85上只有一个port为3308的MySQL实例,但是用3306仍然是连接上此实例,说明socket连接方式忽略--port参数。
-bash-3.2$ mysql -uroot --port=3308
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql -uroot --port=3306
Welcome to the MySQL monitor. Commands end with ; or \g.
再次说明基础细节很重要啊。


   以上是博主分享的各种问题,我经过了上边所有排查,结果依然连接不上。突然灵机一动就想到了系统防火墙,这么重要的细节自己竟然忘掉了,centOS上的防火墙还开着呢,怎么能远程连接。然后关闭防火墙就实现了完美连接。

    这里附上centos有关防火墙的操作:

CentOS6.5查看防火墙的状态:

1
[linuxidc@localhost ~]$service iptable status

  显示结果:

1
2
3
4
5
[linuxidc@localhost ~]$service iptable status
Redirecting  to  /bin/systemctl status  iptable.service
● iptable.service
    Loaded:  not -found (Reason:  No  such file  or  directory)
    Active: inactive (dead)   --表示防火墙已经关闭

    CentOS 6.5关闭防火墙

1
2
[root@localhost ~]#servcie iptables stop                     --临时关闭防火墙
[root@localhost ~]#chkconfig iptables  off                     --永久关闭防火墙

    CentOS 7.2关闭防火墙

CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤。


firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

1
2
[root@localhost ~]#firewall-cmd  --state
not  running

   检查防火墙的状态:

从centos7开始使用systemctl来管理服务和程序,包括了service和chkconfig。

1
2
[root@localhost ~]#systemctl list-unit-files|grep firewalld.service             --防火墙处于关闭状态
firewalld.service                          disabled

  或者

1
2
3
4
[root@localhost ~]#systemctl status firewalld.service
● firewalld.service - firewalld -  dynamic  firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
    Active: inactive (dead)

   关闭防火墙:

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动

1
2
[root@localhost ~]#systemctl stop firewalld.service
[root@localhost ~]#systemctl disable firewalld.service
1
2
3
4
5
6
7
8
启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
显示一个服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl  is -enabled firewalld.service;echo $?
查看已启动的服务列表:systemctl list-unit-files|grep enabled




CentOS6.5查看防火墙的状态:

1
[linuxidc@localhost ~]$service iptable status

  显示结果:

1
2
3
4
5
[linuxidc@localhost ~]$service iptable status
Redirecting  to  /bin/systemctl status  iptable.service
● iptable.service
    Loaded:  not -found (Reason:  No  such file  or  directory)
    Active: inactive (dead)   --表示防火墙已经关闭

    CentOS 6.5关闭防火墙

1
2
[root@localhost ~]#servcie iptables stop                     --临时关闭防火墙
[root@localhost ~]#chkconfig iptables  off                     --永久关闭防火墙

    CentOS 7.2关闭防火墙

CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤。


firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

1
2
[root@localhost ~]#firewall-cmd  --state
not  running

   检查防火墙的状态:

从centos7开始使用systemctl来管理服务和程序,包括了service和chkconfig。

1
2
[root@localhost ~]#systemctl list-unit-files|grep firewalld.service             --防火墙处于关闭状态
firewalld.service                          disabled

  或者

1
2
3
4
[root@localhost ~]#systemctl status firewalld.service
● firewalld.service - firewalld -  dynamic  firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
    Active: inactive (dead)

   关闭防火墙:

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动

1
2
[root@localhost ~]#systemctl stop firewalld.service
[root@localhost ~]#systemctl disable firewalld.service
1
2
3
4
5
6
7
8
启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
显示一个服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl  is -enabled firewalld.service;echo $?
查看已启动的服务列表:systemctl list-unit-files|grep enabled

CentOS6.5查看防火墙的状态:

1
[linuxidc@localhost ~]$service iptable status

  显示结果:

1
2
3
4
5
[linuxidc@localhost ~]$service iptable status
Redirecting  to  /bin/systemctl status  iptable.service
● iptable.service
    Loaded:  not -found (Reason:  No  such file  or  directory)
    Active: inactive (dead)   --表示防火墙已经关闭

    CentOS 6.5关闭防火墙

1
2
[root@localhost ~]#servcie iptables stop                     --临时关闭防火墙
[root@localhost ~]#chkconfig iptables  off                     --永久关闭防火墙

    CentOS 7.2关闭防火墙

CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤。


firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

1
2
[root@localhost ~]#firewall-cmd  --state
not  running

   检查防火墙的状态:

从centos7开始使用systemctl来管理服务和程序,包括了service和chkconfig。

1
2
[root@localhost ~]#systemctl list-unit-files|grep firewalld.service             --防火墙处于关闭状态
firewalld.service                          disabled

  或者

1
2
3
4
[root@localhost ~]#systemctl status firewalld.service
● firewalld.service - firewalld -  dynamic  firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
    Active: inactive (dead)

   关闭防火墙:

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动

1
2
[root@localhost ~]#systemctl stop firewalld.service
[root@localhost ~]#systemctl disable firewalld.service
1
2
3
4
5
6
7
8
启动一个服务:systemctl start firewalld.service
关闭一个服务:systemctl stop firewalld.service
重启一个服务:systemctl restart firewalld.service
显示一个服务的状态:systemctl status firewalld.service
在开机时启用一个服务:systemctl enable firewalld.service
在开机时禁用一个服务:systemctl disable firewalld.service
查看服务是否开机启动:systemctl  is -enabled firewalld.service;echo $?
查看已启动的服务列表:systemctl list-unit-files|grep enabled

你可能感兴趣的:(虚拟化学习)