MySQL服务未运行是主因,需先检查状态(services.msc或systemctl status mysql),再查错误日志;常见原因包括端口占用、my.cnf语法错误、数据目录权限不当、skip-networking启用或bind-address配置异常。

mysqladmin: connect to server at 'localhost' failed 是服务没起来
这不是密码或权限问题,而是 mysqld 进程根本没运行。phpEnv 启动 MySQL 失败时显示这个错误,90% 的情况是 MySQL 服务未启动或启动中途崩溃。
先确认状态:mysqladmin ping 会直接报错;而 ps aux | grep mysqld 很可能查不到进程。Windows 下打开 services.msc 查看 “MySQL” 服务状态是否为“正在运行”。
- Linux/macOS:用
sudo systemctl status mysql或sudo service mysql status看输出里有没有active (running) - 如果显示
failed或inactive,别急着重装,先看日志:sudo tail -20 /var/log/mysql/error.log(路径可能为/var/log/mysqld.log) - 常见启动失败原因:端口被占用(
3306被其他程序占了)、my.cnf配置语法错误、数据目录权限不对(如/var/lib/mysql所属用户不是mysql)
bind-address 和 skip-networking 冲突导致本地连不上
phpEnv 默认配置有时会启用 skip-networking,或把 bind-address 设成 127.0.0.1 以外的地址(比如 0.0.0.0),反而让 localhost 解析失败。
检查你的 MySQL 配置文件(通常是 /etc/my.cnf 或 phpEnv 自带的 my.ini),重点看 [mysqld] 段:
立即学习“PHP免费学习笔记(深入)”;
- 确保没有
skip-networking—— 这个选项会让 MySQL 完全不监听 TCP 端口,mysqladmin就必然失败 -
bind-address推荐设为127.0.0.1(仅本机)或留空(默认行为,等价于127.0.0.1);不要设成0.0.0.0后又没开防火墙,容易引发权限误判 - 改完必须重启:
sudo systemctl restart mysql(Linux)或在 phpEnv 控制面板点“重启 MySQL”
root 用户缺失 localhost 权限记录
即使服务跑着,mysqladmin -u root -p 仍报 Access denied,大概率是 mysql.user 表里没有 'root'@'localhost' 这条记录 —— 只有 'root'@'%' 或 'root'@'127.0.0.1'。
连接进 MySQL(用跳过权限验证方式,见下一条)后执行:
SELECT User, Host FROM mysql.user WHERE User = 'root';
如果结果里没有 localhost,就补一条:
CREATE USER 'root'@'localhost' IDENTIFIED BY 'your_password';GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;FLUSH PRIVILEGES;
注意:不要删掉 'root'@'127.0.0.1',有些客户端(包括部分 phpEnv 脚本)会优先尝试走 IP 连接。
用 skip-grant-tables 重置权限前必须停掉原服务
很多人卡在这步:直接后台起一个 mysqld --skip-grant-tables,但原 MySQL 进程还在占着端口和数据目录,新进程立刻退出或报错 Can't start server: Bind on TCP/IP port。
- Linux/macOS:先
sudo systemctl stop mysql,再手动启动跳过权限验证的实例 - Windows:在管理员命令行中先
net stop mysql,再运行mysqld --console --skip-grant-tables --shared-memory - 启动成功后,新开一个终端执行
mysql -u root(此时不用密码),然后改密码、补权限、FLUSH PRIVILEGES - 改完必须关掉那个
--skip-grant-tables进程,再用正常方式启动 MySQL,否则任何人都能无密码登录
最易忽略的一点:phpEnv 环境下,MySQL 数据目录往往不在系统默认路径,mysqld --skip-grant-tables 启动时要显式指定 --datadir=,否则会初始化空库,导致原有数据库丢失。



















