MySQL远程访问配置与常见问题解决指南

 更新时间:2026年04月28日 09:24:30   作者:code bean  
本文记录了一次MySQL远程连接过程中遇到的坑及其解决方案,主要包括基础命令行操作、远程访问配置、认证插件不兼容、IP被拉黑等问题,提出了解决方案,需要的朋友可以参考下

本文记录了一次完整的 MySQL 远程连接踩坑过程,涵盖基础命令行操作、认证插件报错、IP 被拉黑等问题及解决方案。

一、MySQL 基础命令行操作

1.1 登录与退出

# 本地登录(默认走 localhost)
mysql -u root -p
# 指定 IP 登录(走网络连接)
mysql -h 192.168.1.100 -u root -p
# 指定端口
mysql -h 192.168.1.100 -P 3306 -u root -p
# 退出
exit;
-- 或
quit;

1.2 用户管理

-- 查看所有用户
SELECT User, Host, plugin FROM mysql.user;
-- 创建本地用户
CREATE USER 'alice'@'localhost' IDENTIFIED BY '密码';
-- 创建远程用户(允许任意 IP)
CREATE USER 'bob'@'%' IDENTIFIED BY '密码';
-- 创建远程用户(只允许特定 IP)
CREATE USER 'charlie'@'192.168.1.50' IDENTIFIED BY '密码';
-- 修改密码
ALTER USER 'bob'@'%' IDENTIFIED BY '新密码';
-- 删除用户
DROP USER 'bob'@'%';
-- 刷新权限(修改后必须执行)
FLUSH PRIVILEGES;

1.3 权限管理

-- 授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'bob'@'%';

-- 授予特定数据库权限
GRANT ALL PRIVILEGES ON mydb.* TO 'bob'@'%';

-- 授予只读权限
GRANT SELECT ON mydb.* TO 'readonly'@'%';

-- 撤销权限
REVOKE ALL PRIVILEGES ON *.* FROM 'bob'@'%';

-- 查看用户权限
SHOW GRANTS FOR 'bob'@'%';

1.4 数据库与表操作

-- 创建数据库
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 查看所有数据库
SHOW DATABASES;

-- 切换数据库
USE mydb;

-- 创建表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 查看表结构
DESC users;
-- 或
SHOW CREATE TABLE users;

-- 插入数据
INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com');

-- 查询
SELECT * FROM users WHERE name LIKE '%张%';

-- 更新
UPDATE users SET email = 'new@example.com' WHERE id = 1;

-- 删除
DELETE FROM users WHERE id = 1;

1.5 服务管理(Linux)

# 启动
sudo systemctl start mysql
# 停止
sudo systemctl stop mysql
# 重启
sudo systemctl restart mysql
# 查看状态
sudo systemctl status mysql

二、远程访问配置

2.1 服务端配置

编辑 MySQL 配置文件:

  • Linux: /etc/mysql/mysql.conf.d/mysqld.cnf/etc/my.cnf
  • Windows: my.ini
# 允许所有网卡监听(默认 127.0.0.1 只监听本地)
bind-address = 0.0.0.0
# 或注释掉该行
# bind-address = 127.0.0.1

重启生效:

sudo systemctl restart mysql

2.2 防火墙放行

# UFW (Ubuntu/Debian)
sudo ufw allow 3306/tcp
# firewalld (CentOS/RHEL)
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload
# 云服务器还需在安全组中放行 3306 端口

2.3 用户授权

-- 创建远程专用用户(推荐)
CREATE USER 'remote_user'@'%' IDENTIFIED BY '强密码';
GRANT ALL PRIVILEGES ON mydb.* TO 'remote_user'@'%';
FLUSH PRIVILEGES;

三、踩坑实录:认证插件与 IP 拉黑

3.1 环境背景

  • 服务端: MySQL 8.0(Linux 服务器)
  • 客户端: Windows C++ 程序,使用较老的 MySQL C API 库
  • 连接方式: mysql_real_connect(conn, "10.136.11.246", "root", ...)

3.2 第一坑:IP 被拉黑

报错信息:

mysql_real_connect failed: Host '10.136.26.183' is blocked because of many connection errors;
unblock with 'mysqladmin flush-hosts'

原因分析:
MySQL 有安全机制,当某个 IP 连续多次连接失败(默认阈值 100 次),会自动将该 IP 加入黑名单,防止暴力 破解。

解决方法:

# 服务端执行,清空黑名单
mysqladmin flush-hosts

或登录 MySQL 后:

FLUSH HOSTS;

3.3 第二坑:认证插件不兼容

报错信息:

mysql_real_connect failed: Authentication plugin 'caching_sha2_password' cannot be loaded: 找不到指定的模块。

原因分析:
MySQL 8.0 默认使用 caching_sha2_password 认证插件,但客户端(C++ 的 MySQL 库)版本太老,不支持这个插件。

根本区别:

MySQL 版本默认认证插件兼容性
5.7 及以前mysql_native_password老客户端都支持
8.0+caching_sha2_password需要新版客户端库

3.4 第三坑:ALTER USER 报错

报错信息:

ERROR 1396 (HY000): Operation ALTER USER failed for 'root'@'10.136.11.246'

原因分析:
MySQL 的用户是 用户名 + Host 的组合。查询发现系统中只有:

SELECT User, Host FROM mysql.user;

结果:

+------+-----------+
| User | Host      |
+------+-----------+
| root | %         |
| root | localhost |
+------+-----------+

'root'@'10.136.11.246' 这个用户根本不存在!

MySQL 用户匹配规则:

Host 值含义
localhost只允许本机 socket 连接
127.0.0.1只允许本机 TCP 连接
192.168.1.%允许该网段
10.136.11.246只允许该特定 IP
%允许任意 IP(最宽松)

注意localhost10.136.11.246

  • localhost127.0.0.1,不经过网卡
  • 10.136.11.246 是服务器的实际网卡 IP,走网络协议

四、完整解决过程

步骤 1:确认现有用户

SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';

确认有 'root'@'%' 存在。

步骤 2:修改认证插件(服务端执行)

-- 修改已存在的 'root'@'%' 用户
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;

步骤 3:验证修改结果

SELECT User, Host, plugin FROM mysql.user WHERE User = 'root';

确认 'root'@'%'plugin 变为 mysql_native_password

步骤 4:清空 IP 黑名单

FLUSH HOSTS;

步骤 5:客户端连接测试

C++ 代码:

#include <mysql.h>
MYSQL* conn = mysql_init(nullptr);
if (!mysql_real_connect(conn, 
                        "10.136.11.246",  // 服务器 IP
                        "root",           // 用户名
                        "你的密码",        // 密码
                        "数据库名",        // 数据库
                        3306,             // 端口
                        nullptr, 0)) {
    printf("连接失败: %s\n", mysql_error(conn));
} else {
    printf("连接成功!\n");
}
mysql_close(conn);

五、其他解决方案对比

方案 A:改服务端认证方式(本文采用)

优点:客户端不用改,快速解决
缺点:安全性略降,新特性无法使用

-- 改单个用户
ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY '密码';

-- 或改全局默认(my.cnf)
[mysqld]
default_authentication_plugin = mysql_native_password

方案 B:升级客户端库(推荐长期方案)

优点:支持最新特性,更安全
缺点:需要重新编译项目

  • 下载 MySQL Connector/C++ 8.0+: https://dev.mysql.com/downloads/connector/cpp/
  • 或更新 C API 的 libmysql.dll 到 8.0 版本

方案 C:使用 SSH 隧道(最安全)

# 本地建立隧道,把远程 3306 映射到本地 3307
ssh -L 3307:localhost:3306 user@服务器IP
# 然后 C++ 连接本地 3307,实际走的是加密 SSH
mysql_real_connect(conn, "127.0.0.1", "root", ..., 3307, ...);

优点:不暴露 3306 端口,全程加密
缺点:需要额外配置 SSH

六、安全建议

  1. 不要用 root 远程访问:创建专用账号,最小权限原则
  2. 限制 Host 范围:能用 192.168.1.% 就不要用 %
  3. 强密码 + SSL:生产环境必须配置 SSL 连接
  4. 修改默认端口:将 3306 改为其他端口,减少扫描
  5. fail2ban:自动封禁暴力 破解 IP

七、常用排查命令速查

-- 查看当前连接
SHOW PROCESSLIST;

-- 查看连接错误阈值
SHOW VARIABLES LIKE 'max_connect_errors';

-- 修改阈值(临时)
SET GLOBAL max_connect_errors = 1000;

-- 查看用户认证方式
SELECT User, Host, plugin, authentication_string FROM mysql.user;

-- 查看被拉黑的 IP(performance_schema 需开启)
SELECT * FROM performance_schema.host_cache WHERE SUM_CONNECT_ERRORS > 0;

总结

问题现象解决
IP 被拉黑Host is blockedFLUSH HOSTS;
认证插件不支持caching_sha2_password cannot be loadedmysql_native_password 或升级客户端
用户不存在Operation ALTER USER failedSELECT 查用户,确认 Host 正确
localhost vs IP连接方式不同,匹配的用户不同明确用 % 还是具体 IP

核心教训:MySQL 的用户是 用户名@Host 的组合,修改前务必先查清楚!

本文基于 MySQL 8.0 + Windows C++ 客户端的真实踩坑经历整理。

到此这篇关于MySQL远程访问配置与常见问题解决指南的文章就介绍到这了,更多相关MySQL远程访问配置与常见问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 对MySQL慢查询日志进行分析的基本教程

    对MySQL慢查询日志进行分析的基本教程

    这篇文章主要介绍了对MySQL慢查询日志进行分析的基本教程,文中提到的Query-Digest-UI这个基于B/S的图形化查看工具非常好用,需要的朋友可以参考下
    2015-12-12
  • MySQL 中处理 BLOB 和 CLOB 数据类型小结

    MySQL 中处理 BLOB 和 CLOB 数据类型小结

    在MySQL中,BLOB和CLOB 数据类型用于存储大量的二进制数据和字符数据,可以使用SQL 语句或编程语言将二进制数据和字符数据插入到BLOB 和CLOB列中,这篇文章主要介绍了MySQL 中处理 BLOB 和 CLOB 数据类型,需要的朋友可以参考下
    2025-03-03
  • mysql主从基于docker和django实现读写分离

    mysql主从基于docker和django实现读写分离

    这篇文章主要介绍了mysql主从基于docker和django实现读写分离,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-08-08
  • Windows7 64位安装最新版本MySQL服务器的图文教程

    Windows7 64位安装最新版本MySQL服务器的图文教程

    本文通过图文并茂的形式给大家介绍了Windows7 64位安装最新版本MySQL服务器的教程,非常不错,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-06-06
  • 深入mysql存储过程中表名使用参数传入的详解

    深入mysql存储过程中表名使用参数传入的详解

    本篇文章是对mysql存储过程中表名使用参数传入进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • MySQL的重装问题解决方法

    MySQL的重装问题解决方法

    最近在工作上遇到了MySQL重装的问题,今天记录一下我的解决过程。不论我用控制面板的卸载删除程序方式还是安全卫士的卸载,都会遇到一个问题,就是安装到如下图位置,server start时就程序无响应了,一直死在那里
    2013-04-04
  • MySQL学习笔记4:完整性约束限制字段

    MySQL学习笔记4:完整性约束限制字段

    完整性约束是对字段进行限制,从而符合该字段达到我们期望的效果比如字段含有默认值,不能是NULL等如果插入的数据不满足限制要求,数据库管理系统就拒绝执行操作
    2013-01-01
  • MySQL报1045错误的几种可能场景

    MySQL报1045错误的几种可能场景

    mysql数据库中常常会遇见1045错误,本文主要介绍了MySQL报1045错误的几种可能场景,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 什么情况下需要创建MySQL索引?

    什么情况下需要创建MySQL索引?

    这篇文章主要介绍了什么情况下需要创建MySQL索引?本文同时介绍了哪些情况不适合创建MySQL索引,需要的朋友可以参考下
    2014-10-10
  • 一文详解MySQL 存储引擎

    一文详解MySQL 存储引擎

    本文主要介绍了一文详解MySQL存储引擎,常用两种存储引擎是MyISAM和InnoDB,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05

最新评论