确认MariaDB端口是否被占需先验证:服务是否启动、防火墙是否拦截、连接是否走TCP而非socket;Linux/macOS用lsof或netstat查LISTEN状态,Windows用netstat加tasklist;连接时强制用127.0.0.1和-P参数。
如何确认 MariaDB 默认端口(3306)是否真被占用了
别急着改配置,先验证是不是真冲突。常见假象是:服务没启动、防火墙拦截、或你连的是本地 socket 而非 tcp 端口。
- Linux/macOS 下执行
sudo lsof -i :3306或netstat -tuln | grep :3306,看到LISTEN且 PID 不是mysqld才算被占 - Windows 下用
netstat -ano | findstr :3306,再用tasklist | findstr <PID>查进程名 - 如果
systemctl status mariadb显示 inactive,那根本不是端口问题,而是服务压根没起来 - 连接时用
mysql -h 127.0.0.1 -P 3306 -u root(强制走 TCP),别用mysql -h localhost(默认走 socket,不走端口)
修改 MariaDB 端口号的正确位置和写法
必须改配置文件里的 port,不能只改命令行参数或客户端设置。MariaDB 启动时只认 [mysqld] 段下的 port。
- 配置文件通常是
/etc/my.cnf或/etc/mysql/mariadb.conf.d/50-server.cnf;Windows 是my.ini - 在
[mysqld]段下加一行:port = 3307(不要写成port=3307,空格可选但等号两边不强制) - 切勿在
[client]或[mysql]段写port——那只是客户端默认值,不影响服务监听 - 改完必须重启服务:
sudo systemctl restart mariadb,reload不生效
改端口后连接不上?检查这三件事
90% 的“改了连不上”是因为漏掉了其中一项,不是配置写错了。
- 客户端显式指定新端口:
mysql -h 127.0.0.1 -P 3307 -u root,-P(大写 P)不能写成-p(小写 p 是密码) - 防火墙放行新端口:Ubuntu/Debian 用
sudo ufw allow 3307,CentOS 用sudo firewall-cmd --add-port=3307/tcp --permanent - 确认
bind_address没锁死:如果配置里有bind_address = 127.0.0.1,那远程连不了;设为0.0.0.0或注释掉才允许外部访问(注意安全)
3306 被占又不想改端口?临时绕过方案
有些场景(比如 Docker 容器、CI 环境)改配置麻烦,可用更轻量的方式解决。
- 停掉占端口的进程:
sudo kill -9 <PID>(先确认它不是关键服务) - 用 socket 文件直连:
mysql --socket=/var/run/mysqld/mysqld.sock -u root,路径查mysqladmin variables | grep socket - Docker 启动时映射端口:
docker run -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123 mariadb,容器内还是 3306,宿主机用 3307 连
端口冲突本身不难解,难的是判断谁在占、改哪段配置、连的时候用对协议和参数。尤其注意 -P 和 -p 混用、localhost 和 127.0.0.1 的行为差异,这些地方一错就卡半天。










