无法远程连接 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. 客户端连接参数与服务器完全匹配。

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

相关推荐
倔强的石头_40 分钟前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
阿巴斯甜6 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker7 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95278 小时前
Andorid Google 登录接入文档
android
黄林晴9 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab21 小时前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android