当前位置: 当前位置:首页 > 百科 > linux mysql 开放 3306正文

linux mysql 开放 3306

作者:热点 来源:焦点 浏览: 【大 中 小】 发布时间:2026-10-17 06:04:20 评论数:

MySQL装完,开放监听地址默认绑在 127.0.0.1,开放端口 3306 只对本机开放。开放远程连不上,开放不是开放防火墙的问题,就是开放 MySQL 自己没放开。别急着去改 iptables,开放先确认 MySQL 到底在听哪个地址。开放

登录数据库,开放执行:

mysql -u root -p SHOW VARIABLES LIKE 'bind_address'; 

返回值如果是开放 127.0.0.1 或者 localhost,那远程必然连不上。开放这时候有两个选择:改配置文件把 bind-address 设成 0.0.0.0,开放或者在 my.cnf 里直接注释掉这一行。开放我一般倾向于注释,开放因为 MySQL 8.0 之后默认行为已经变了,开放留着这行反而容易忘。

配置文件的位置取决于你的发行版。CentOS 系通常在 /etc/my.cnf,Debian/Ubuntu 系在 /etc/mysql/mysql.conf.d/mysqld.cnf。用 mysqld --verbose --help | grep my.cnf 能查到实际加载顺序,别猜。

找到 [mysqld] 段,把 bind-address = 127.0.0.1 改成 bind-address = 0.0.0.0,或者直接在前面加 # 注释掉。保存,重启 MySQL:

systemctl restart mysqld # 或者 systemctl restart mysql 

重启完再查一次 SHOW VARIABLES LIKE 'bind_address';,看到 0.0.0.0 或者 * 才算生效。这一步经常有人漏掉,改完配置文件不重启,然后对着报错怀疑人生。

MySQL 层面还有一道门:用户权限。root 用户默认只允许从 localhost 登录。你 bind-address 放开了,防火墙也开了,但用户表里 root 的 host 字段还是 localhost,照样连不上。

查一下:

SELECT user, host FROM mysql.user; 

如果 root 对应的 host 只有 localhost,需要加一个远程访问的用户,或者改现有用户的 host。生产环境不建议直接把 root 的 host 改成 %,风险太大。更合理的做法是建一个专用账号:

CREATE USER 'app_user'@'%' IDENTIFIED BY '强密码'; GRANT ALL PRIVILEGES ON your_db.* TO 'app_user'@'%'; FLUSH PRIVILEGES; 

注意 % 表示任意主机。如果你知道客户端的固定 IP,把 % 换成具体 IP 更安全。比如 'app_user'@'192.168.1.50'。

MySQL 8.0 还有个坑:默认认证插件是 caching_sha2_password,老版本的客户端或者某些语言的驱动连不上,报 Authentication plugin 'caching_sha2_password' cannot be loaded。解决办法是建用户时指定插件:

CREATE USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY '强密码'; 

或者改全局默认:

[mysqld] default_authentication_plugin = mysql_native_password 

数据库这边搞定,轮到系统防火墙。CentOS 7 以上默认用 firewalld:

firewall-cmd --permanent --add-port=3306/tcp firewall-cmd --reload firewall-cmd --list-ports 

Ubuntu 常用 ufw:

ufw allow 3306/tcp ufw status 

如果是云服务器,还有一层安全组。阿里云、腾讯云、AWS 的控制台里都要手动放行 3306 入站规则。我见过太多人本地防火墙全开了,就是忘了云控制台那一层,折腾半天。

验证是否真正开放,不要在本机用 mysql -h 127.0.0.1 测,那走的是 loopback,测不出问题。从另一台机器执行:

telnet 你的服务器IP 3306 # 或者 nc -zv 你的服务器IP 3306 

返回 Connected 或者看到 MySQL 的握手包,才算通。如果卡住或者 Connection refused,按上面顺序往回查:MySQL 监听地址 → 用户权限 → 系统防火墙 → 云安全组。

最后说一个实际踩过的坑。有次帮人排查,bind-address 改了,防火墙开了,用户也建了,还是连不上。最后发现 my.cnf 里有个 skip-networking 没注释掉。这参数一开,MySQL 直接不走 TCP,只走 socket。查配置文件的时候顺手搜一下有没有这行,能省不少时间。

3306 开放本身不复杂,难的是每一层都确认到位。别跳步,一层层过。