无法远程连接 MySQL

如果经过多次配置仍无法远程连接 MySQL,可能是某些细节被忽略了,我们可以按以下步骤逐一排查,确保每个环节都正确:

一、确认 MySQL 核心配置(最关键)

  1. 明确 MySQL 实际加载的配置文件MySQL 启动时会按优先级加载多个配置文件,可能存在 "你修改的文件未被实际加载" 的情况。执行以下命令查看 MySQL 正在使用的配置文件路径:

    bash

    复制代码
    mysql --help | grep "Default options" -A 10

    输出会显示类似:/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf优先修改排在前面的文件 (通常是/etc/my.cnf)。

  2. 强制修改监听地址 打开 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
  3. 验证 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,则配置未生效,需重新检查配置文件并重启。

二、用户权限与认证插件(易踩坑点)

  1. 确保用户权限正确且生效 登录 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;  # 必须执行,刷新权限
  2. 测试本地登录是否正常在 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(必查)

  1. 防火墙必须开放 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

    关闭防火墙后若能连接,说明是防火墙规则未生效,重新执行开放端口命令即可。

  2. **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

四、客户端与网络问题

  1. 客户端连接参数绝对不能错

    • 主机 :必须是 openEuler 服务器的实际 IP (用ip addr在服务器上查询,确保客户端能 ping 通)。
    • 端口:必须是 3306(或你修改的端口,需与 MySQL 配置和防火墙一致)。
    • 用户名 / 密码:与 MySQL 中创建的远程用户完全一致(注意大小写)。
  2. 用命令行客户端测试,排除 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 设置)。

总结

按以上步骤逐一排查,重点确认:

  1. MySQL 配置文件正确且监听0.0.0.0:3306
  2. 远程用户权限正确、认证插件兼容;
  3. 防火墙和 SELinux 未拦截 3306 端口;
  4. 客户端连接参数与服务器完全匹配。

如果某一步测试通过(如关闭防火墙后连接成功),则问题就出在该环节,针对性解决即可。

相关推荐
苏小瀚4 小时前
[MySQL] 事务和视图
数据库·mysql·1024程序员节
Q一件事5 小时前
R语言随机森林分析显示R方和P值
开发语言·随机森林·r语言
Mr.Jessy5 小时前
JavaScript学习第六天:函数
开发语言·前端·javascript·学习·html·1024程序员节
刺客-Andy5 小时前
Python 第二十节 正则表达式使用详解及注意事项
python·mysql·正则表达式
zhangphil5 小时前
Android GPU的RenderThread Texture upload上传Bitmap优化prepareToDraw
android
哈__6 小时前
MongoDB 平替新方案:金仓多模数据库驱动电子证照国产化落地
数据库·1024程序员节
九皇叔叔6 小时前
Java循环结构全解析:从基础用法到性能优化
java·开发语言·性能优化
sulikey6 小时前
Qt 入门简洁笔记:从框架概念到开发环境搭建
开发语言·前端·c++·qt·前端框架·visual studio·qt框架
zzzsde6 小时前
【C++】stack和queue:优先级队列的使用及底层原理
开发语言·c++