Debian 9下MariaDB无法通过TCP连接(错误110:连接超时)
嘿,我太懂隔段时间碰服务器手生的感觉了!刚上手Debian 9搭配MariaDB确实容易踩TCP连接的坑,尤其是DigitalOcean的默认环境。咱们一步步来排查,应该能搞定:
检查MariaDB的绑定地址配置
默认情况下MariaDB可能只绑定了本地套接字,压根没开启TCP监听。你可以打开配置文件/etc/mysql/mariadb.conf.d/50-server.cnf,找到bind-address这一行,把它改成127.0.0.1(仅允许本地TCP访问)或者0.0.0.0(允许所有IP访问)。修改完成后记得重启MariaDB服务:systemctl restart mariadb验证MariaDB是否在监听TCP端口
用netstat -tulpn | grep mysqld或者ss -tulpn | grep mysqld命令查看,输出里应该要有处于LISTEN状态的3306端口(MariaDB默认端口),并且对应的地址是你刚才设置的127.0.0.1或0.0.0.0。如果看不到这个监听状态,要么是配置没生效,要么是服务没重启成功。确认数据库用户的连接权限
就算开了TCP监听,你的数据库用户可能被限制只能用套接字连接。先通过套接字方式登录MariaDB:mysql -u 你的用户名 -p,然后执行这条SQL查询:SELECT user, host FROM mysql.user;看看你用来连接的用户对应的
host字段是不是127.0.0.1或者%(允许任意IP连接)。如果是localhost,那这个用户只能通过套接字连接,你可以用下面的语句修改权限:GRANT ALL PRIVILEGES ON *.* TO '你的用户名'@'127.0.0.1' IDENTIFIED BY '你的密码'; FLUSH PRIVILEGES;排查系统防火墙规则
DigitalOcean的Debian默认可能启用了ufw防火墙,先检查它有没有拦截3306端口:ufw status。不过本地回环地址(127开头)的连接一般不会被防火墙拦截,但还是确认下更稳妥。如果用的是iptables,就执行iptables -L -n看看有没有针对3306端口的拒绝规则。检查DigitalOcean云防火墙(如果开启)
虽然你是本地连接,但万一云防火墙有异常规则也可能影响(概率不高,但排查要彻底),可以登录DigitalOcean控制面板,查看云防火墙的入站规则,确保本地TCP 3306端口没有被拦截。
按照这些步骤排查下来,应该能定位到问题所在。如果还是不行,可以把netstat的输出、mysql.user的查询结果贴出来,我再帮你进一步分析!
内容的提问来源于stack exchange,提问作者Chris

