在 Linux 上 MariaDB 连接超时通常由以下几类原因导致,你可以按“由外到内”的顺序排查。
# 查看端口是否监听
ss -lntp | grep 3306
# 防火墙状态
systemctl status firewalld
# 或
iptables -L -n
解决
firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload
检查配置:
grep bind-address /etc/my.cnf /etc/my.cnf.d/*
若是:
bind-address = 127.0.0.1
则只能本机连接。
改为允许远程:
bind-address = 0.0.0.0
然后重启:
systemctl restart mariadb
SELECT user, host FROM mysql.user;
若用户是:
user@localhost
则无法从其他 IP 连接。
授权示例:
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
SHOW VARIABLES LIKE 'connect_timeout';
默认通常是 10 秒,网络差时可调大:
[mysqld]
connect_timeout = 30
MariaDB 默认做反向 DNS 解析,DNS 慢会“假死”。
解决:
[mysqld]
skip-name-resolve
重启后必须使用 IP 或 % 授权。
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
若满了:
max_connections = 500
top
free -h
dmesg | grep mariadb
如:
mysql -h ip -u user -p --connect-timeout=30
JDBC:
jdbc:mysql://ip:3306/db?connectTimeout=30000
ping iptelnet ip 3306ss -lntp | grep 3306bind-addresshostskip-name-resolve/var/log/mariadb/mariadb.log如果你愿意,可以把 具体报错信息(如 Timeout、Can't connect、Lost connection)和 连接方式(本地 / 远程 / Docker)发出来,我可以精准定位。