MariaDB无法绑定到localhost,导致本地及SSH端口转发连接失败
看起来你的MariaDB确实只在使用Unix socket通信,完全没有监听TCP端口3306——这就是你用127.0.0.1连不上、SSH端口转发也失败的核心原因。咱们一步步排查解决:
1. 排查是否有配置禁用了TCP网络连接
虽然你的50-server.cnf里没写skip-networking,但有可能其他配置文件悄悄覆盖了这个设置。你可以检查这些地方:
- 打开
/etc/my.cnf、~/.my.cnf这两个文件,看是否存在skip-networking配置项 - 查看
/etc/mysql/conf.d/目录下的所有.cnf文件,有没有类似的禁用网络的设置
如果找到skip-networking,直接用#注释掉即可。
2. 检查systemd服务是否带了额外启动参数
有时候MariaDB的systemd服务文件会强制添加--skip-networking参数,你可以查看服务配置:
cat /lib/systemd/system/mariadb.service
或者检查自定义的服务配置片段:
ls -l /etc/systemd/system/mariadb.service.d/ cat /etc/systemd/system/mariadb.service.d/*.conf
看ExecStart这一行后面有没有跟--skip-networking,如果有,直接删掉这个参数。
3. 验证mysqld的实际生效参数
执行下面的命令,查看mysqld加载的所有默认参数:
sudo mysqld --print-defaults
在输出里找有没有--skip-networking,或者--bind-address是不是被改成了非127.0.0.1的地址,或者--port不是3306。如果有异常,回到对应配置文件修正。
4. 重启服务并验证监听状态
修改完配置后,先重载systemd(如果改了服务文件的话),再重启MariaDB:
sudo systemctl daemon-reload sudo systemctl restart mariadb
然后执行这两个命令检查是否已经监听TCP端口:
sudo netstat -anpe | grep 3306 sudo lsof -i -P -n | grep :3306
如果看到类似下面的输出,就说明已经正常监听了:
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 112 19184 2172/mysqld mysqld 2172 mysql 21u IPv4 19184 0t0 TCP 127.0.0.1:3306 (LISTEN)
5. 测试连接
这时候你再尝试本地TCP连接:
mysql -u root -h 127.0.0.1
应该能正常进入MariaDB终端了。同时你的SSH端口转发工具(比如Sequel Pro)也能正常连接,因为现在远程服务器的127.0.0.1:3306已经有服务在监听了。
如果还是不行,再检查mysql.user表中是否存在root@127.0.0.1的账号(用socket连接后执行SELECT user, host FROM mysql.user;),如果没有的话,创建并授权:
CREATE USER 'root'@'127.0.0.1' IDENTIFIED BY ''; GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION; FLUSH PRIVILEGES;
不过这个步骤大概率不需要,因为你用socket能连,说明root账号本身没问题,主要还是监听的问题。
备注:内容来源于stack exchange,提问作者Kevin Matsubara

