1. 用户不存在或拼写错误

-- 错误现象:ERROR 1045 (28000): Access denied for user 'admi'@'localhost' (using password: YES)
-- 技术栈:MySQL 8.0命令行操作

-- 诊断步骤:
SELECT user,host FROM mysql.user;  -- 查看所有用户和主机权限
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'P@ssw0rd!';  -- 注意用户名字母正确性

解决办法
① 使用root账户查询用户表
② 特别注意保留字user字段的大小写敏感问题
③ 新建用户时主机地址要与登录请求完全匹配


2. 密码错误或策略冲突

# 密码强度策略验证(示例报错)
mysql -u root -pWeakPass  # 输入简单密码时报错:
# ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

# 查看密码策略配置(需root权限)
SHOW VARIABLES LIKE 'validate_password%';

解决方案
① 临时调整策略(生产环境慎用):

SET GLOBAL validate_password.policy=LOW;  -- 改为低强度策略
ALTER USER 'user1'@'%' IDENTIFIED BY 'New@ComplexPwd123'; 

② 永久修改策略:
修改/etc/mysql/mysql.conf.d/mysqld.cnf添加:

[mysqld]
validate_password.policy=0  # 0=OFF, 1=MEDIUM, 2=STRONG

3. 主机权限限制

-- 用户创建时指定错误的主机地址
CREATE USER 'dev'@'192.168.1.100' IDENTIFIED BY 'DevPass123';

-- 实际客户端连接地址为192.168.1.101时触发错误:
-- ERROR 1045 (28000): Access denied for user 'dev'@'192.168.1.101' (using password: YES)

解决办法
① 精确授权:

GRANT ALL ON db1.* TO 'dev'@'192.168.1.%';  -- 允许整个子网段

② 通配符授权(慎用):

CREATE USER 'remote_user'@'%' IDENTIFIED BY 'R3motePwd!';  -- 允许任意主机访问

4. 配置文件参数异常

# 错误示例:/etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
skip-networking=1  # 禁用网络连接
bind-address=127.0.0.1  # 仅允许本地连接

诊断工具

netstat -tulpn | grep mysql  # 查看监听端口状态
systemctl status mysql.service  # 检查服务运行日志

解决方案
① 注释掉skip-networking配置项
② 修改bind-address=0.0.0.0允许远程连接
③ 重启服务:systemctl restart mysql


5. 服务未正常运行

典型症状

  • 连接时出现Can't connect to MySQL server on 'localhost' (10061)
  • 客户端直接返回连接超时

处理流程

# Ubuntu系统操作示例
sudo systemctl stop mysql
sudo mysqld_safe --skip-grant-tables &  # 进入安全模式
mysql_upgrade -u root  # 修复系统表
sudo systemctl start mysql

6. 加密协议不匹配

MySQL 8.0默认使用caching_sha2_password认证,旧客户端可能出现:

Authentication plugin 'caching_sha2_password' cannot be loaded

兼容性处理方案

ALTER USER 'legacy_app'@'%' 
IDENTIFIED WITH mysql_native_password BY 'OldPwd123';  -- 修改认证方式

SHOW CREATE USER 'legacy_app'@'%'\G  -- 验证修改结果

7. 权限表未刷新

-- 修改权限后未生效的典型场景
GRANT SELECT ON sales.* TO 'report'@'192.168.2.%';
FLUSH PRIVILEGES;  -- 必须执行才能使授权生效

最佳实践
① 每次授权操作后立即执行FLUSH PRIVILEGES
② 使用SHOW GRANTS FOR 'user'@'host'验证权限
③ 定期检查mysql.user表的密码过期字段


8. 网络防火墙拦截

典型报错
ERROR 2003 (HY000): Can't connect to MySQL server on 'host' (110)

诊断步骤

telnet dbserver 3306  # 测试端口连通性
traceroute dbserver   # 检查路由路径
iptables -L -n -v    # 查看防火墙规则

解决方案
① 开放云服务器的安全组3306端口
② 配置本地防火墙:

sudo ufw allow from 192.168.1.0/24 to any port 3306

9. 应用场景分析

开发环境:密码策略可适当放宽,但需设置测试数据隔离
生产环境:必须启用强密码策略,采用白名单IP限制
混合云架构:使用SSH隧道或VPN保证传输安全


10. 技术方案对比

方法 优点 缺点
修改认证插件 快速解决兼容性问题 降低安全性
调整密码策略 符合企业规范 增加用户记忆难度
IP白名单 精确控制访问源 维护成本高
证书认证 最高安全级别 部署复杂度高

11. 操作注意事项

  1. 修改root密码后立即测试备用连接方式
  2. 批量修改用户密码前做好权限快照
  3. 远程访问必须配置SSL加密传输
  4. 定期清理mysql.user表中的僵尸账户

12. 终极解决方案

当所有常规手段失效时,可尝试:

# 停止MySQL服务
sudo systemctl stop mysql

# 启动跳过权限验证
sudo mysqld_safe --skip-grant-tables --skip-networking &

# 无密码登录重置
mysql -u root
UPDATE mysql.user SET authentication_string='' WHERE user='root';
FLUSH PRIVILEGES;
exit

# 重启服务并设置新密码
sudo systemctl restart mysql
mysqladmin -u root password 'NewSecurePwd123!'