温馨提示×

linux mariadb为何连接超时

小樊
57
2026-10-07 04:17:55
栏目: 云计算

在 Linux 上 MariaDB 连接超时通常由以下几类原因导致,你可以按“由外到内”的顺序排查。


一、网络 / 防火墙问题(最常见)

1. 防火墙未放行 3306 端口

# 查看端口是否监听
ss -lntp | grep 3306

# 防火墙状态
systemctl status firewalld
# 或
iptables -L -n

解决

firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload

2. MariaDB 只监听 localhost

检查配置:

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

二、用户权限问题

3. 用户没有远程连接权限

SELECT user, host FROM mysql.user;

若用户是:

user@localhost

则无法从其他 IP 连接。

授权示例:

GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

三、连接超时参数设置

4. connect_timeout 太小

SHOW VARIABLES LIKE 'connect_timeout';

默认通常是 10 秒,网络差时可调大:

[mysqld]
connect_timeout = 30

四、DNS 解析导致超时(非常常见)

5. skip-name-resolve 未开启

MariaDB 默认做反向 DNS 解析,DNS 慢会“假死”。

解决:

[mysqld]
skip-name-resolve

重启后必须使用 IP 或 % 授权。


五、服务器资源问题

6. 连接数打满

SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';

若满了:

max_connections = 500

7. 服务器负载高 / OOM

top
free -h
dmesg | grep mariadb

六、客户端问题

8. 客户端超时设置

如:

mysql -h ip -u user -p --connect-timeout=30

JDBC:

jdbc:mysql://ip:3306/db?connectTimeout=30000

七、快速排查清单 ✅

  1. ping ip
  2. telnet ip 3306
  3. ss -lntp | grep 3306
  4. 检查 bind-address
  5. 检查用户 host
  6. 开启 skip-name-resolve
  7. 看 /var/log/mariadb/mariadb.log

如果你愿意,可以把 具体报错信息(如 Timeout、Can't connect、Lost connection)和 连接方式(本地 / 远程 / Docker)发出来,我可以精准定位。

0 踩