当MySQL连接失败时,其实有一套清晰的排查思路可循。逐一检查服务状态、账号密码、连接地址、用户权限这四个环节,大概率就能定位问题根源。下面直接进入正题,详细说明每一步的具体操作。

确认MySQL服务是否已正常启动
在终端或命令提示符中,执行 systemctl status mysql(Linux系统)或 net start | findstr MySQL(Windows系统)。如果返回信息显示“inactive (dead)”甚至根本找不到MySQL服务名,那基本可以断定服务没有运行。这时千万不要急着尝试登录——进程都没启动,任何客户端连接都会立刻收到“Connection refused”错误提示。
启动服务其实很简单:Linux下运行 sudo systemctl start mysql,Windows则在服务管理器中右键点击“MySQL80”选择“启动”。执行启动前,务必确认my.cnf或my.ini中配置的端口没有被其他程序占用,否则服务也可能启动失败,导致连接异常。
验证MySQL用户名和密码是否匹配
首先尝试本地免密登录,用以验证基础可用性:执行 mysql -u root -p,然后直接回车(如果原本设置的是空密码)或输入当前密码。如果密码已经遗忘,那就需要走另一条路径:先停止MySQL服务,在配置文件中加入 skip-grant-tables,重启服务后登录,执行 ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';,最后删除那条配置项并再次重启服务。
有一点需要特别注意:远程连接时,必须使用 '用户名'@'%' 或具体的IP地址来创建用户。如果只创建了 'root'@'localhost',那么外部无论如何都无法连接成功。
检查连接地址与端口配置是否正确
先确认客户端连接时填写的host是否正确——是127.0.0.1(本地环回地址),还是真实的服务器IP。注意不要误填成localhost,因为某些系统下localhost会走socket文件而非TCP协议,而很多检测工具默认走的是TCP通路。
接着,查看MySQL实际监听的端口:登录MySQL后执行 SHOW VARIABLES LIKE 'port';,默认端口是3306,但可能被修改过。最后用 telnet 127.0.0.1 3306 测试端口连通性。如果不通,问题可能出在防火墙拦截、bind-address设置为127.0.0.1导致外网不可达,或者云服务器安全组未放行该端口。
bind-address参数在my.cnf中默认可能是127.0.0.1,若要允许远程连接,必须改为0.0.0.0或具体内网IP,修改后必须重启MySQL服务才能生效。
排查用户权限与host匹配问题
登录MySQL后,执行 SELECT host,user,authentication_string FROM mysql.user;,重点关注你要连接的用户名对应的host字段值。如果host是localhost,则只能在本机通过socket连接;如果是192.168.1.%,则只能从该网段IP连接;只有%才表示任意主机(包括远程)。
如果host不匹配,可以新建一个用户,例如 CREATE USER 'test'@'%' IDENTIFIED BY 'pwd123';,然后授权 GRANT ALL ON *.* TO 'test'@'%';,最后执行 FLUSH PRIVILEGES; 刷新权限。完成这一步后,远程连接的问题基本就解决了。
