无法远程连接 MySQL
如果经过多次配置仍无法远程连接 MySQL,可能是某些细节被忽略了,我们可以按以下步骤逐一排查,确保每个环节都正确:
一、确认 MySQL 核心配置(最关键)
明确 MySQL 实际加载的配置文件MySQL 启动时会按优先级加载多个配置文件,可能存在 “你修改的文件未被实际加载” 的情况。执行以下命令查看 MySQL 正在使用的配置文件路径:
bash
mysql --help | grep "Default options" -A 10
输出会显示类似:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
,优先修改排在前面的文件(通常是/etc/my.cnf
)。强制修改监听地址打开 MySQL 实际加载的主配置文件(如
/etc/my.cnf
),在[mysqld]
部分明确添加或修改:ini
[mysqld] bind-address = 0.0.0.0 # 必须是0.0.0.0,确保监听所有网卡 port = 3306 # 明确指定端口(默认3306,若修改需同步开放防火墙) skip-name-resolve # 可选,跳过DNS解析,避免因解析问题导致连接失败
修改后必须重启 MySQL:
bash
sudo systemctl restart mysqld
验证 MySQL 监听状态确认 MySQL 是否真的在监听
0.0.0.0:3306
:bash
netstat -tulnp | grep mysqld
若输出包含
tcp6 0 0 :::3306 :::* LISTEN 1234/mysqld
,说明监听正常(:::3306
包含了对 IPv4 的0.0.0.0:3306
支持);若只显示127.0.0.1:3306
,则配置未生效,需重新检查配置文件并重启。
二、用户权限与认证插件(易踩坑点)
确保用户权限正确且生效登录 MySQL,执行以下命令,确认远程用户(如
root@%
)的权限和主机限制:sql
SELECT user, host, plugin FROM mysql.user WHERE user = '你的远程用户名';
host
必须为%
(允许所有 IP)或具体客户端 IP。plugin
若为caching_sha2_password
:部分旧版本 Navicat 不支持,需改为兼容的mysql_native_password
:sql
ALTER USER '你的远程用户名'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES; # 必须执行,刷新权限
测试本地登录是否正常在 openEuler 服务器上,用远程用户本地登录,排除密码错误:
bash
mysql -u 你的远程用户名 -p -h 127.0.0.1 # 必须加 -h 127.0.0.1,模拟远程连接逻辑
若本地登录失败,说明用户创建或密码错误,重新创建用户:
sql
DROP USER IF EXISTS '你的远程用户名'@'%'; # 先删除旧用户 CREATE USER '你的远程用户名'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; GRANT ALL PRIVILEGES ON *.* TO '你的远程用户名'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
三、防火墙与 SELinux(必查)
防火墙必须开放 3306 端口执行以下命令,确保 3306 端口已永久开放并生效:
bash
# 查看已开放的端口 sudo firewall-cmd --list-ports --permanent # 若没有3306/tcp,添加并重启防火墙 sudo firewall-cmd --add-port=3306/tcp --permanent sudo firewall-cmd --reload # 临时关闭防火墙测试(排除防火墙问题) sudo systemctl stop firewalld
关闭防火墙后若能连接,说明是防火墙规则未生效,重新执行开放端口命令即可。
SELinux 限制(openEuler 默认开启)执行以下命令临时关闭 SELinux 测试:
bash
sudo setenforce 0 # 临时关闭(宽容模式)
若关闭后能连接,说明 SELinux 拦截了连接,需永久配置:
bash
# 安装工具 sudo dnf install -y policycoreutils-python-utils # 允许MySQL使用3306端口 sudo semanage port -a -t mysqld_port_t -p tcp 3306 # 永久开启SELinux并保持配置 sudo setenforce 1
四、客户端与网络问题
客户端连接参数绝对不能错
- 主机:必须是 openEuler 服务器的实际 IP(用
ip addr
在服务器上查询,确保客户端能 ping 通)。 - 端口:必须是 3306(或你修改的端口,需与 MySQL 配置和防火墙一致)。
- 用户名 / 密码:与 MySQL 中创建的远程用户完全一致(注意大小写)。
- 主机:必须是 openEuler 服务器的实际 IP(用
用命令行客户端测试,排除 Navicat 问题在客户端机器(Windows 用 CMD,Linux/macOS 用终端)执行:
bash
mysql -h 服务器IP -u 远程用户名 -p -P 3306
- 若提示
Access denied
:密码错误或用户权限问题。 - 若提示
Can't connect to MySQL server
:网络不通、端口未开放或 MySQL 未监听。 - 若能登录:说明是 Navicat 的问题(更新 Navicat 或检查其配置,如 SSL 设置)。
- 若提示
总结
按以上步骤逐一排查,重点确认:
- MySQL 配置文件正确且监听
0.0.0.0:3306
; - 远程用户权限正确、认证插件兼容;
- 防火墙和 SELinux 未拦截 3306 端口;
- 客户端连接参数与服务器完全匹配。
如果某一步测试通过(如关闭防火墙后连接成功),则问题就出在该环节,针对性解决即可。