根据错误的类型,可按如下步骤解决:
1. 指定主机和端口号,或者在另一台Mysql服务器上,
bin/mysql -uroot -p123456 -h210.45.123.199 -port 3306
能否登陆?若不能,返回的error code是什么。例如:
ERROR 2061
解决方法:
ALTER USER 'root'@'%' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
2. 对于error2003 错误,使用perror定位详细信息
3. 对于os error code 110,连接超时问题,
select user, host from mysql.user; 检查host的范围
update user set host='%' where user ='root';
flush privileges;
4. 可能网络连接问,远程ping 210.45.123.199 ,能否ping通?
5. 可能由于my.cnf里配置了skip_networking只允许本地socket连接。
知识说明:
(1) skip_networking使MySQL只能通过本机Socket连接,放弃对TCP/IP的监听,致使本地java程序(Connector/J等只能通过TCP/IP来连接)不能连接MySQL。
(2) MySQL本地连接,如果不指 --protocol=tcp, 连接默认是socket方式连接的。MySQL socket连接是根据sokect文件来的,会忽略--port参数。如果是一机多实例,则需要用-S(或者--socket=name )来指定连接哪个实例。
6. 可能my.cnf里配置了 bind_address=127.0.0.1(也可以是其他ip)。
[mysqld]
bind_address=127.0.0.1
知识说明:这种情况可以TCP/IP连接
通过查看了my.cnf文件,以上两个都是没设置的,排除掉这两种情况。
6. 可能my.cnf里配置了 skip_name_resolve。
[mysqld]
skip_name_resolve
知识说明:这个参数加上后,不支持主机名的连接方式,不做DNS解析。
这个情况肯定不可能,因为上面用的是ip,不是主机名。
7. 排查用户和密码问题
用户和密码的错误类似
ERROR 1045 (28000): Access denied for user 'root'@'XXXX' (using password: YES)
8. 排查--port问题,有可能 MySQL port不是默认3306。 远程连接时,没有指定--port,用的是默认值3306, 而服务器上没有对3306进行监听。
show global variables like 'port';
9. 检查防火墙配置,确定3306端口已经开放。
firewall-cmd --query-port=3306/tcp
若没有,则需要开启端口,
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
firewall-cmd --query-port=3306/tcp
按照如上选项,可以解决大多数连接不上的问题。