mysql服务未启动导致端口不监听是连接被拒绝的首要原因,需先用sc query mysql或服务管理器确认状态,再查错误日志定位启动失败根源。

MySQL服务没起来,端口自然不监听
最常见的情况是 mysqld 根本没启动成功,不是配置问题,是服务压根没跑起来。Windows 上执行 netstat -ano | findstr :3306 没输出,不代表 MySQL 在“等连接”,而是它连 LISTEN 状态都没进入。
- 先查服务状态:
sc query mysql或进「服务」管理器看MySQL服务是否为「正在运行」;如果状态是「已停止」或「启动失败」,直接跳过所有配置检查 - 启动失败时,错误日志才是真相:默认在
C:\ProgramData\MySQL\MySQL Server X.X\Data\主机名.err,打开看最后一段有没有Can't start server、Failed to bind或权限报错 - 常见卡点:data 目录权限不对(尤其从旧版本升级或手动迁移)、my.ini 里写了不存在的路径(比如
datadir=C:\mysql\data但该目录根本没创建)、或者启用了skip-networking(这会直接禁用 TCP 监听)
bind-address = 127.0.0.1 是默认值,不是 bug
MySQL 安装完默认只监听 127.0.0.1:3306,这是安全设计,不是配置遗漏。你用 mysql -u root -p 能连上,是因为走的是本地 socket 或 127.0.0.1;但 telnet localhost 3306 或远程工具连不上,就卡在这儿。
- 确认监听地址:
netstat -ano | findstr :3306输出中,如果只有127.0.0.1:3306,说明配置未生效或没改对地方 - 改配置必须在
[mysqld]段下加:bind-address = 0.0.0.0(允许所有 IPv4 地址)或bind-address = *(MySQL 8.0+ 支持,含 IPv6) - 别写成
bind_address(下划线)或Bind-Address(大小写敏感),也别放在[client]段——那只是影响客户端默认行为 - 改完必须重启服务:
net stop mysql && net start mysql,仅修改文件不重启等于没改
防火墙放行了 3306,但规则没匹配当前网络类型
Windows 防火墙规则是按「网络位置类型」生效的,不是开了就通。你连的是「专用网络」,但规则只勾了「域」,照样被拦。
- 进「高级安全 Windows 防火墙」→「入站规则」,找名称含 3306 的规则,双击打开看「常规」页是否启用、「作用域」页是否允许所需 IP、「配置文件」页是否勾选了你当前的网络类型(右下角通知栏点网络图标可查看)
- 不要依赖「启用 ICMP 回显请求」来测试——
ping不通 ≠ 端口不通;真正该测的是telnet 127.0.0.1 3306(本地)和telnet 你的IP 3306(远程) - 第三方安全软件(如火绒、360)常自带独立防火墙模块,它们的「网络防护」或「端口控制」列表可能把 3306 默认拦截,需单独放行
安装向导跳过了端口配置,my.ini 却没生成
某些 MySQL 安装包(尤其是 ZIP 免安装版或旧 MSI 版)不会自动生成 my.ini,而是靠默认内置参数启动。这时你改了配置文件也没用,因为 mysqld 根本没读它。
- 确认实际加载的配置文件:
mysqld --help --verbose | findstr "Default options",输出里会列出它尝试读取的所有路径(比如C:\WINDOWS\my.ini、C:\ProgramData\MySQL\MySQL Server X.X\my.ini) - 如果这些路径都不存在,mysqld 就按编译默认值跑:
port=3306、bind-address=127.0.0.1、skip-networking=OFF—— 也就是说,你得自己建一个my.ini并确保路径在默认搜索列表里 - 新建
my.ini时,第一行必须是[mysqld],后面紧跟着你要的配置,比如:
[mysqld] port = 3306 bind-address = 0.0.0.0
路径、编码(ANSI 或 UTF-8 无 BOM)、权限(确保 SYSTEM 和 MySQL 服务账户有读取权)任何一个出错,mysqld 都会静默忽略该文件。











