MySQL 连接失败与权限问题排查:从报错到修复
作者:夸父
MySQL 的三类高频故障:连接被拒(1045/2002)、权限不足(1044/1142)、以及"时好时坏"的连接超时。每类给诊断命令与修复动作。
2002 Can't connect:连不上
服务没起:systemctl status mysqld——先确认服务存活。端口不通:telnet IP 3306 测——Docker 部署时注意端口映射是否正确(容器内 3306 映射到宿主机的哪个口)。bind-address 限制:MySQL 配置里 bind-address=127.0.0.1 时拒绝远程连接——远程访问需求改绑 0.0.0.0(配合防火墙白名单,见安全加固)。
1045 Access denied:身份不对
按顺序核四项:密码是否正确(本地 mysql -u user -p 手动连);用户+host 组合是否匹配(SELECT user,host FROM mysql.user; 查看允许的 host——user@'%' 才允许远程);认证插件版本(老客户端连新 MySQL 的插件不兼容,ALTER USER 换插件或升级客户端);.env 里的配置与实际是否一致(部署迁移后最容易错的一项)。
1044/1142:权限不足
账号存在但没有对应库/表的权限。修复:GRANT ALL ON aivideo.* TO 'user'@'%'; FLUSH PRIVILEGES;——按最小权限原则只授业务库,不给全库。逐日 AI 的应用账号需要 aivideo 库的完整读写权限。
too many connections:连接耗尽
SHOW PROCESSLIST; 看当前连接与状态——大量 Sleep 的长连接说明应用连接池配置过大或有泄漏;大量 Query 说明真的高并发(优化慢查询)。处理:临时调大 SET GLOBAL max_connections=500; 应急,长期修连接池配置 + 慢查询(见日常维护的慢查询日志)。
时区与字符集:中国用户的两个隐形坑
时区:SHOW VARIABLES LIKE 'time_zone';——服务器时区与应用时区不一致会导致时间字段偏差 8 小时(统一为 UTC 或 SYSTEM+正确系统时区)。字符集:中文乱码检查库/表/连接的三层字符集是否统一为 utf8mb4(utf8 三字节版会丢 emoji)——建库时就指定,后期转换要重建索引。
常见问题
1045 Access denied 是密码错了吗?
通常是,但不全是:密码错误、用户不存在、host 限制(user 只允许 localhost 而你从远程连)、认证插件不匹配(旧版 mysql_native_password vs 新版 caching_sha2_password)都会报 1045。用 mysql -u user -p 在服务器本地先试,区分是账号问题还是网络问题。
应用"时好时坏"的连接失败是什么原因?
两个高频原因:连接池耗尽(应用并发超过 max_connections,报 too many connections)与 wait_timeout 超时断连(应用拿到的是已死连接)。前者调大 max_connections 或修复连接泄漏,后者给连接池加心跳检测。


