他的回复:
先别重复重置密码:本机已经能登录,说明 root 密码本身是对的,问题在“业务应用那条连接”上。先看报错原文分两类,再按下面顺序查,查到哪一步通了就停:- `Access denied for user 'xxx'@'yyy'`:到了 MySQL、被账号或 Host 挡下来,重点查第 1、2 步;- `Connection refused` / 连接超时:根本没到 MySQL,重点查第 3、4 步。## 第 1 步:应用配置里的密码、账号、地址有没有同步这是最快的一步,先查它:1. 打开业务应用的数据库配置(配置文件或环境变量),核对三项:用户名、密码、地址/端口。重置后只改了 MySQL 侧、没改应用侧,是最常见的“本机通、业务不通”。2. 改完配置要重启应用或重载配置,否则应用可能还拿着旧密码的缓存连接在重试。3. 顺带核对应用连的是哪个地址:是 `127.0.0.1`、内网 IP,还是公网 IP?本机登录用 `localhost` 通,不代表用内网 IP 或公网 IP 也通,地址不同走的授权和网络路径也不同。## 第 2 步:MySQL 用户的 Host 授权本机登录通,应用连不上,第二常见的原因就是用户只授权给了 `localhost`。在 MySQL 服务器上登录后查:```sqlSELECT User, Host, plugin FROM mysql.user;SHOW GRANTS FOR '你的业务账号'@'应用的Host';```- 如果业务账号只有 `'root'@'localhost'` 或 `'业务账号'@'localhost'`,而应用是从另一台机器、另一个 IP 或容器里连过来的,就会被挡下来,报错就是 `Access denied`。- 处理办法是给业务账号加上应用实际来源的 Host,例如应用 IP,或者在确认安全的前提下用 `%`,然后刷新权限:```sqlCREATE USER '业务账号'@'应用IP' IDENTIFIED BY '新密码';GRANT ALL PRIVILEGES ON 业务库.* TO '业务账号'@'应用IP';FLUSH PRIVILEGES;```- 顺带说两点:一是业务应用尽量不要直接用 root 连,单独建一个业务账号,权限只给业务库;二是不要为了图省事把 root 改成 `'root'@'%'` 配弱密码再放通公网,那是把数据库暴露出去了。`plugin` 那一列也要看一眼:MySQL 8 默认是 `caching_sha2_password`,老客户端或老驱动可能不支持,会表现为连不上或认证失败;如果应用驱动确实老,解决办法是升级驱动,或者把业务账号改成 `mysql_native_password`,具体以你的 MySQL 版本和驱动版本为准,这里不直接替你选。## 第 3 步:MySQL 到底在监听哪个地址在 MySQL 服务器上查监听和 bind-address:```bashss -tlnp | grep 3306``````sqlSELECT @@bind_address, @@port;```- 如果 `bind_address` 是 `127.0.0.1`,MySQL 只接受本机连接,应用从别的机器连过来根本到不了 MySQL,跟密码对不对没关系。- 要改的话,改 MySQL 配置文件里的 `bind-address`(改成 `0.0.0.0` 或应用能访问的内网 IP),改完重启 MySQL 服务再生效。改成 `0.0.0.0` 的同时,第 4 步的安全组必须只放应用 IP,不能放 `0.0.0.0/0`。- 不确定的地方:配置文件路径和服务名不同发行版、不同安装方式不一样,可能是 `/etc/my.cnf`、`/etc/mysql/my.cnf` 或 `/etc/mysql/mysql.conf.d/mysqld.cnf`,服务名可能是 `mysqld` 或 `mysql`,以你机器上的实际文件和服务名为准。## 第 4 步:安全组和系统防火墙放没放 3306如果前面三步都没问题,再查网络层,分两层:1. 华为云 ECS 安全组:入方向有没有放行 3306,来源是不是应用服务器的 IP(或应用所在安全组),不是放通所有地址。2. 服务器本机防火墙:`firewalld`、`iptables` 或 `ufw` 有没有放行 3306,例如:```bashfirewall-cmd --list-portsss -tlnp | grep 3306```然后在应用服务器上直接测连通性,不要只在 MySQL 本机测:```bashmysql -h MySQL内网IP -P 3306 -u 业务账号 -p```- 本机 `mysql -u root -p` 通、应用服务器上这条命令不通,就是网络或监听的问题;- 应用服务器上这条命令通、业务应用还不通,就回到第 1 步查应用配置和驱动。## 按这个顺序查,最省时间1. 先看报错原文:`Access denied` 走账号/Host,`Connection refused`/超时走监听/网络;2. 应用配置密码、账号、地址有没有同步,改完有没有重启应用;3. `mysql.user` 里业务账号的 Host 是不是应用实际来源;4. `bind_address` 是不是只绑了 `127.0.0.1`;5. 安全组和本机防火墙有没有只放应用 IP 放行 3306。最后补一句:你帖子里没写 MySQL 版本、应用是不是和 MySQL 在同一台 ECS 上、报错原文到底是哪一句,如果按上面顺序查到某一步卡住了,把那一步的命令输出(账号和密码打码)和报错原文贴出来,能更快定位到是账号、监听还是网络那一层。