2003 - MySQL连接localhost失败(10061错误)的全面排查指南
1. 为什么会出现MySQL连接localhost失败10061错误当你兴致勃勃地打开数据库客户端准备大干一场时突然蹦出个2003 - Cant connect to MySQL server on localhost(10061)的错误提示是不是瞬间就懵了别急这个错误其实很常见就像你回家发现门锁打不开一样可能是钥匙拿错了也可能是门锁坏了还可能是你走错单元了。MySQL连接localhost失败最常见的原因有这几个MySQL服务压根没启动、端口被占用或防火墙拦截、用户权限配置有问题、配置文件出错。我遇到过最离谱的一次是同事把localhost拼写成了ocalhost排查了半天才发现是手滑打错了字母。所以遇到这个问题先别慌按照我下面给的排查步骤一步步来八成能找到问题所在。2. 基础检查这些低级错误你中招了吗2.1 拼写检查你真的连的是localhost吗首先检查下你的连接字符串特别是主机名部分。我就见过有人把localhost写成localhsot、ocalhost甚至127.0.0..1的。正确的写法应该是localhost127.0.0.1::1 (IPv6格式)如果你用的是编程语言连接检查下连接代码。比如Python的MySQLdb连接字符串应该是这样的import MySQLdb db MySQLdb.connect(hostlocalhost, userroot, passwdyourpassword, dbtest)2.2 MySQL服务状态检查它真的在运行吗MySQL服务没启动是最常见的原因。怎么检查服务状态呢Windows系统按WinR输入services.msc回车在服务列表里找到MySQL服务查看状态是否为正在运行也可以用命令行net start | find MySQL如果服务没启动用管理员权限运行net start mysqlLinux系统systemctl status mysqld # 或者 service mysql status启动服务的命令是systemctl start mysqld # 或者 service mysql start3. 中级排查网络和端口问题3.1 端口检查3306真的可用吗MySQL默认使用3306端口但有些安装方式会修改这个端口。检查端口是否被正确监听netstat -ano | find 3306 # Windows netstat -tulnp | grep mysql # Linux如果没看到3306端口可能是MySQL配置了其他端口。检查my.ini或my.cnf配置文件中的port参数[mysqld] port33063.2 防火墙设置是不是被拦住了防火墙可能会阻止本地连接特别是某些安全软件。临时关闭防火墙测试下Windowsnetsh advfirewall set allprofiles state offLinuxsystemctl stop firewalld # CentOS ufw disable # Ubuntu测试完记得重新开启防火墙。如果确认是防火墙问题添加放行规则Windowsnetsh advfirewall firewall add rule nameMySQL dirin actionallow protocolTCP localport3306Linuxfirewall-cmd --permanent --add-port3306/tcp firewall-cmd --reload3.3 用telnet测试连接这是个很实用的技巧可以快速判断网络连通性telnet localhost 3306如果看到类似下面的输出说明连接是通的Trying 127.0.0.1... Connected to localhost.如果显示无法连接那肯定是网络或服务问题。4. 高级排查MySQL配置和权限问题4.1 检查用户权限有时候问题出在用户权限上。先用root账户登录如果root也连不上可能需要跳过权限检查启动MySQLSELECT user, host FROM mysql.user;检查你的用户名是否有localhost的访问权限。如果没有需要授权GRANT ALL PRIVILEGES ON *.* TO youruserlocalhost IDENTIFIED BY yourpassword; FLUSH PRIVILEGES;4.2 检查skip-networking配置这个参数会让MySQL只接受本地socket连接拒绝TCP/IP连接。检查my.cnf/my.ini# 确保没有这行 skip-networking如果有注释掉它然后重启MySQL。4.3 检查bind-address设置这个参数控制MySQL监听哪个网络接口。如果设置为127.0.0.1就只能本地连接如果设置成服务器IP就可以远程连接如果设置成0.0.0.0就监听所有接口。bind-address 127.0.0.15. 终极武器错误日志分析如果以上方法都解决不了问题那就得请出终极武器——错误日志了。MySQL的错误日志通常会告诉你具体原因。Windows日志位置数据目录下的主机名.err文件通常在C:\ProgramData\MySQL\MySQL Server 8.0\Data\Linux日志位置/var/log/mysql/error.log/var/log/mysqld.log查看日志的典型错误Cant start server: Bind on TCP/IP port: Address already in use → 端口被占用Access denied for user... → 权限问题Too many connections → 连接数满了6. 特殊场景排查6.1 使用MySQL 8.0的新特性注意MySQL 8.0默认使用了新的认证插件caching_sha2_password有些老客户端可能不支持。如果遇到这个问题可以修改用户认证方式ALTER USER youruserlocalhost IDENTIFIED WITH mysql_native_password BY yourpassword;6.2 使用Docker时的特殊问题如果你是用Docker运行的MySQL要注意确保端口映射正确-p 3306:3306检查容器是否正常运行docker ps查看容器日志docker logs mysql_container6.3 连接池配置问题使用连接池时可能会因为配置不当导致连接失败。检查连接池的最大连接数、超时时间等参数。比如Java的HikariCP配置HikariConfig config new HikariConfig(); config.setJdbcUrl(jdbc:mysql://localhost:3306/db); config.setUsername(user); config.setPassword(password); config.setMaximumPoolSize(10); config.setConnectionTimeout(30000);7. 预防措施和最佳实践为了避免以后再次遇到这个问题我有几个建议写个启动脚本自动检查MySQL服务状态定期备份my.cnf配置文件使用配置管理工具管理MySQL配置为应用创建专用数据库用户不要都用root监控MySQL的运行状态和错误日志比如这个简单的Shell脚本可以自动检查并启动MySQL#!/bin/bash if ! systemctl is-active --quiet mysqld; then echo MySQL is not running, starting... systemctl start mysqld fi最后说个真实案例有次我遇到10061错误排查了半天发现是因为磁盘空间满了MySQL无法写入日志导致服务异常。所以遇到问题要全面排查不能只盯着网络和权限。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2465449.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!