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

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

相关推荐
莫小墨1 分钟前
基于TCP/IP和UDP组播的Qt网络直播间项目
网络·qt·tcp/ip·udp
笃行客从不躺平10 分钟前
线程池原理复习
java·开发语言
A尘埃24 分钟前
LLM大模型评估攻略
开发语言·python
littlepeanut.top25 分钟前
C++中将FlatBuffers序列化为JSON
开发语言·c++·json·flatbuffers
一晌小贪欢1 小时前
【Python办公】处理 CSV和Excel 文件操作指南
开发语言·python·excel·excel操作·python办公·csv操作
Android系统攻城狮1 小时前
Android内核进阶之获取DMA地址snd_pcm_sgbuf_get_addr:用法实例(九十一)
android·pcm·android内核·音频进阶·pcm硬件参数
清风与日月1 小时前
c# 集成激光雷达(以思岚A1为例)
开发语言·c#
是苏浙1 小时前
零基础入门C语言之贪吃蛇的实现
c语言·开发语言·数据结构
清空mega1 小时前
Android Studio移动应用基础教程(前言)
android·ide·android studio
化作星辰1 小时前
java 给鉴权kafka2.7(sasl)发送消息权限异常处理
java·大数据·开发语言·kafka