MySQL启动失败主因是data目录缺失或权限不足,需手动创建并赋权;连接错误2002/2003分别对应socket和TCP问题;8.0登录拒绝多因caching_sha2_password插件不兼容,应改用mysql_native_password。

MySQL启动失败:data目录缺失或权限不足
刚装完MySQL却起不来,systemctl start mysqld 没反应,日志里又没报错?大概率是初始化失败导致 data 目录压根没生成。Wampserver、手动解压安装、或从其他机器拷贝的二进制包,都容易因缺少运行库(如vcruntime140.dll)或权限问题卡在这一步。
- 进
mysql/bin目录,直接运行mysqld --console,错误会实时打印——常见提示是Can't create/write to file或Failed to open log file - 检查
datadir路径(用mysqld --verbose --help | grep "datadir"查),确认该路径是否存在、属主是否为mysql用户(Linux)或当前管理员(Windows) - 若目录为空或不存在,手动创建并赋权:
mkdir -p /var/lib/mysql && chown -R mysql:mysql /var/lib/mysql;Windows 下注意路径中不能有中文或空格
连接不上:ERROR 2002 / ERROR 2003 的真实原因
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' 和 ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' 看似一样,但本质不同:前者是走 Unix socket 本地通信失败,后者是尝试走 TCP 3306 端口连不上。别一上来就重启服务。
- 先看服务状态:
systemctl status mysqld(Linux)或sc query mysql(Windows),确认进程真在跑 - 查 socket 路径是否一致:配置文件(
/etc/my.cnf或my.ini)里的socket项,和客户端实际连接时用的路径(如mysql -S /tmp/mysql.sock)必须匹配 - 如果改过
datadir,务必同步更新socket路径,并在[client]、[mysqladmin]等段落里显式声明,否则mysql命令默认仍找老位置
登录被拒:ERROR 1045 和密码插件不兼容
装完 MySQL 8.0,用默认密码或空密码登录报 ERROR 1045 (28000): Access denied,不是密码错了,而是认证方式变了。MySQL 8.0 默认用 caching_sha2_password 插件,而老客户端(尤其 JDBC 5.x、某些 GUI 工具)不支持。
- 临时绕过:启动时加
--skip-grant-tables进去重置密码,但生产环境慎用 - 更稳妥的是重置 root 认证方式:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; FLUSH PRIVILEGES; - 远程访问还卡住?别只改
host='%',还要确认bind-address在配置里没写死127.0.0.1,否则根本监听不了外部请求
安装中途中断:GPG密钥过期与依赖冲突
用 yum 安装时卡在 Failing package is: mysql-community-client-5.7.39...,提示 GPG key 失效,这是 MySQL 官方密钥每年轮换导致的,不是你源配错了。
- 执行
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022(注意年份要和报错里提示的匹配,2026 年可能已是 2025 或 2026 版) - 卸载残留比硬装更重要:先
rpm -qa | grep mysql | xargs yum remove -y,再删干净/var/lib/mysql和/etc/my.cnf,否则新旧配置打架 - CentOS 7 上若提示
libaio.so.1: cannot open shared object file,补装:yum install -y libaio
真正麻烦的从来不是报什么错,而是错误信息没出现在它该在的地方——MySQL 日志默认可能关着,log_error 路径没配,或者你根本没去看 mysqld.err。装完第一件事,不是连上去建库,是确认 tail -f /var/log/mysqld.log 能看到启动全流程。










