配置未生效,需检查配置文件加载顺序、systemd启动参数是否硬编码--bind-address、skip-networking是否启用,并通过SHOW VARIABLES LIKE 'bind_address'确认实际值。

bind-address设成0.0.0.0但netstat看不到监听
改完配置文件重启 mysqld,netstat -tlnp | grep :3306 仍显示 127.0.0.1:3306?说明配置根本没生效。常见原因有三个:
- 配置被多个文件覆盖:MySQL 会按顺序加载
/etc/my.cnf、/etc/mysql/my.cnf、/etc/mysql/mysql.conf.d/mysqld.cnf等,后加载的会覆盖前面的。用mysqld --help --verbose | grep "Default options"查实际读取路径 - systemd 启动参数硬编码:执行
systemctl cat mysql,看ExecStart行是否含--bind-address=127.0.0.1—— 这个优先级高于配置文件 - skip-networking 被启用:哪怕没在配置里写,某些发行版(如 Ubuntu 的 mysql-server 包)默认在 systemd service 文件里加了
--skip-networking,直接禁用 TCP
验证最终生效值:连进 MySQL 执行 SHOW VARIABLES LIKE 'bind_address';,输出必须是 0.0.0.0 才算真正生效。
MySQL 8.0+ 改了bind-address还是连不上
看到 netstat 显示 *:3306,但远程客户端报 ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded,这是认证插件不兼容,和监听无关,但常被误判为“连不上”。
- MySQL 8.0 默认用
caching_sha2_password,老版本客户端(如 Python 2 的MySQLdb、PHP 7.2 以下的mysqli)不支持 - 创建用户时必须显式指定插件:
CREATE USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; - 已有用户可改:
ALTER USER 'app'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd'; -
FLUSH PRIVILEGES;在这类变更后建议执行,避免权限缓存延迟
bind-address = 0.0.0.0 启动失败或报错
配置文件里写 bind-address = 0.0.0.0,重启服务失败,日志里出现 Invalid argument 或直接退出 —— 很可能是因为 SELinux 或 AppArmor 拦截了绑定行为。
- 先临时关闭 SELinux 测试:
sudo setenforce 0,再重启 mysqld;若成功,说明是策略限制 - Ubuntu/Debian 上检查 AppArmor:
sudo aa-status | grep mysql,若启用,需更新/etc/apparmor.d/usr.sbin.mysqld,加入network inet stream,和network inet6 stream, - 别忽略 IPv6 冲突:某些系统上
bind-address = 0.0.0.0和 IPv6 栈异常共存会导致启动失败,可尝试加skip-name-resolve或临时禁用 IPv6 网卡测试
想监听特定内网IP却误用了多地址写法
在配置里写 bind-address = 192.168.1.10,127.0.0.1 或 bind-address = ["127.0.0.1","192.168.1.10"],mysqld 直接启动失败 —— bind-address 只接受单个 IPv4 地址或 0.0.0.0,不支持列表、逗号分隔或通配符组合。
- 要同时响应 localhost 和内网设备,唯一可靠做法是设
bind-address = 0.0.0.0,再靠用户host字段和防火墙白名单控制来源 - 例如:创建
'dev'@'127.0.0.1'和'dev'@'192.168.1.%'两个账号,权限一致,但 host 精确匹配 - 防火墙同步限制:
ufw allow from 192.168.1.0/24 to any port 3306,避免0.0.0.0带来的暴露面扩大
真正卡住的人,往往不是没改配置,而是改了但不知道 MySQL 实际加载了哪份配置、被哪个启动参数覆盖、或者被安全模块静默拒绝 —— 先跑 SHOW VARIABLES LIKE 'bind_address'; 和 mysqld --help --verbose,比反复重启更省时间。


















