必须同时配置MySQL监听地址、用户host限制和系统防火墙三处;需将bind-address改为内网IP或0.0.0.0,创建指定IP的用户并授权,再配置防火墙精确放行该IP的3306端口,并启用skip_name_resolve。

必须同时配置 MySQL 监听地址、用户 host 限制、系统防火墙三处,缺一不可;只改其中一项,连接仍会失败。
确认 MySQL 绑定的是内网 IP 或 0.0.0.0
MySQL 默认 bind-address = 127.0.0.1,远程根本连不上——这不是权限问题,是网络层直接拒绝连接。必须改监听地址:
- 编辑
/etc/mysql/mysql.conf.d/mysqld.cnf(Ubuntu)或/etc/my.cnf(CentOS) - 在
[mysqld]段下设置:bind-address = 192.168.1.100(填你服务器实际的内网 IP)或更宽松但可控的bind-address = 0.0.0.0 - 确保
skip-networking被注释或删除 - 重启服务:
sudo systemctl restart mysql
创建用户时必须写死客户端 IP,不能用 %
'user'@'%' 是典型安全隐患,也违背“仅允许特定 IP”的要求。host 字段就是访问控制的唯一依据:
解析 MySQL 8.0 的 DDL 脚本,并将表结构导出为 Excel 格式。适用于用户需将 MySQL 的 `CREATE TABLE` 语句转换为结构化的 Excel 文件场景,导出内容包含字段名、数据类型、长度及精度等信息。支持多张表的批量处理,每张表对应 Excel 中的一个独立工作表。适用于数据库文档编写、数据字典生成及模式分析等任务。
- 创建用户:
CREATE USER 'app'@'192.168.1.25' IDENTIFIED BY 'StrongPass!2026'; - 授权:
GRANT SELECT, INSERT ON mydb.* TO 'app'@'192.168.1.25'; - 检查是否生效:
SELECT Host, User FROM mysql.user WHERE User = 'app';—— 输出的Host必须是192.168.1.25,不是%或localhost - 执行
FLUSH PRIVILEGES;(MySQL 8.0+ 多数情况自动刷新,但建议手动执行一次)
系统防火墙规则必须精确匹配源 IP 和端口
即使 MySQL 配置全对,ufw/iptables/firewalld 或云平台安全组仍会拦截请求。规则必须显式指定源 IP:
- Ubuntu(ufw):
sudo ufw allow from 192.168.1.25 to any port 3306 - CentOS/RHEL(firewalld):
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.25" port port="3306" protocol="tcp" accept' --permanent,再firewall-cmd --reload - 阿里云/腾讯云:安全组入方向规则,源 IP 填
192.168.1.25/32,协议端口填TCP:3306 - 切勿用
ufw allow 3306这类开放全部来源的方式——它让前面所有限制失效
最容易被忽略的是 skip_name_resolve 设置。如果未启用,MySQL 会对客户端 IP 做 DNS 反查,而局域网内往往没有对应 PTR 记录,导致连接超时或拒绝。建议在 [mysqld] 下加一行:skip_name_resolve = ON,然后重启服务。

















