MySQL 8.0 修改默认端口需编辑配置文件中的 port 参数,配合防火墙放行新端口及调整用户 host 权限才能生效。此操作适用于需要隐藏服务特征或规避端口冲突的场景,但修改端口本身不能替代密码强度和网络隔离等核心安全措施。
先说结论:修改端口属于配置部署类操作,需同步更新防火墙规则和安全组,否则远程连接会失败。
- 适合:需要规避自动化扫描或端口被占用的数据库服务器
- 先准备:备份配置文件 my.cnf 并确认新端口未被占用
- 验收:使用 telnet 或 mysql 客户端从远程机器测试连通性
命令速用版
以下命令基于 Linux 系统,需 root 权限执行。
修改配置文件:vim /etc/my.cnf,在 [mysqld] 下添加 port=3307
重启服务:systemctl restart mysqld
防火墙放行(CentOS):firewall-cmd `--permanent` `--add-port`=3307/tcp && firewall-cmd `--reload`
防火墙放行(Ubuntu):ufw allow 3307/tcp
查看端口监听:ss -tlnp | grep 3307
为什么会这样
MySQL 默认监听 3306 端口且防火墙通常拦截外部访问,修改端口后服务不会自动通知防火墙。
数据库服务启动时仅读取配置文件绑定指定端口,操作系统防火墙独立管理网络包过滤。若只改配置不放行防火墙,外部请求会在网络层被丢弃。此外,云服务商的安全组规则优先级高于系统防火墙,需同步检查。
分步处理
按顺序执行以下步骤,每步完成后检查状态再继续。
1. 备份配置文件
执行 cp /etc/my.cnf /etc/my.cnf.bak,防止配置错误导致服务无法启动。
2. 修改端口配置
编辑配置文件,找到 [mysqld] 段落,添加或修改 port=3307(示例使用 3307)。
3. 重启 MySQL 服务
执行 systemctl restart mysqld,若启动失败查看 journalctl -u mysqld 排查错误。
4. 配置系统防火墙
根据系统类型执行 firewalld 或 ufw 命令放行新端口,确保 TCP 协议允许。
5. 配置云安全组
登录云控制台,在实例安全组入方向添加新端口 TCP 规则,源地址建议限制为特定 IP。
6. 授权远程用户
登录 MySQL 执行 CREATE USER 'user'@'%' IDENTIFIED BY 'password'; 并授权,确保 host 允许远程连接。
怎么验证是否生效
验证分为本地监听检查和远程连通性测试两部分。
本地检查:执行 ss -tlnp | grep mysql,确认 LISTEN 地址为 0.0.0.0:3307 而非 127.0.0.1。
远程测试:在另一台机器执行 mysql -h 服务器 IP -P 3307 -u 用户 -p,能成功登录即配置生效。
端口探测:使用 telnet 服务器 IP 3307 或 nc -zv 服务器 IP 3307 确认端口可达。
常见坑
配置过程中容易忽略 SELinux 限制和云厂商安全组,导致服务正常但无法连接。
- SELinux 拦截:CentOS 开启 SELinux 时,非标准端口可能被拦截,需执行
semanage port -a -t mysqld_port_t -p tcp 3307。 - 云安全组遗漏:系统防火墙已放行但云控制台安全组未开放,外部流量仍无法到达实例。
- 用户 host 限制:MySQL 用户默认 host 为 localhost,需修改为 % 或特定远程 IP 才能远程登录。
- bind-address 配置:配置文件中若设置 bind-address=127.0.0.1,需改为 0.0.0.0 或注释该行。
常见问题
修改端口后 MySQL 服务启动失败怎么办
查看错误日志确认端口是否被占用或配置文件语法错误。
执行 journalctl -u mysqld -n 50 查看最近日志,常见原因是新端口已被其他程序占用或 my.cnf 缩进格式错误。
远程连接报错 2003 Can't connect to MySQL server
通常是防火墙或安全组未放行新端口导致网络不通。
优先检查云控制台安全组入站规则,再检查系统防火墙状态,最后确认 MySQL 用户 host 权限是否允许远程。
如何恢复默认 3306 端口
将配置文件 port 参数改回 3306 并重启服务即可。
修改 /etc/my.cnf 中 port 值为 3306,执行 systemctl restart mysqld,同时记得在防火墙中重新放行 3306 端口。