CentOS8小型服务器MariaDB无故停止运行的排查求助
MariaDB 无响应问题排查方案
问题背景
我有一台搭载Apache/MariaDB的小型Web/邮件服务器。上周修改部分WWW代码后,为适配代码调整了php.ini配置:
max_input_vars = 5000(后续降为4000,初始值为1000)
修改后,MariaDB 10.3.28出现异常:完全无法接收请求,重启mysql和httpd后仅能正常运行24小时。日志中频繁出现以下警告(此前仅偶尔出现,现每小时数十次):
2022-10-05 14:28:58 2796199 [Warning] Aborted connection 2796199 to db: 'ACTIVEDB' user: 'USER' host: 'localhost' (Got an error reading communication packets)
已做调整:
- 降低PHP的
max_input_vars值 - 在
my.cnf中添加配置:
max_allowed_packet = 124M max_connections = 400 log_warnings = 3
此前配置均为默认值,曾将日志级别设为4,但日志增长过快且未捕获崩溃节点。服务器磁盘为500GB Intel NVMe,无异常。
一、MariaDB无响应时的检查/连接方法
- 本地直接连接测试:在服务器终端执行
mysql -u 用户名 -p,输入密码尝试连接。成功连接则说明服务本身正常,问题可能在网络或应用端;失败则根据报错判断(如Can't connect to local MySQL server through socket表示socket文件异常,Connection refused可能是服务未启动或端口被占用)。 - 检查服务状态:执行
systemctl status mariadb(或service mariadb status,依系统而定),查看服务是否运行,有无启动失败日志。 - 验证端口监听:用
netstat -tulpn | grep mysql或ss -tulpn | grep mysql检查3306端口是否监听。端口未监听则服务未正常启动。 - TCP方式连接测试:常规连接失败时,尝试
mysql -u 用户名 -p -h 127.0.0.1,绕过socket文件排查权限或文件丢失问题。 - 查看进程状态:执行
ps aux | grep mysqld,确认mysqld进程是否存在,是否有CPU、内存占用过高的异常。
二、分步排查方法
资源占用排查
- 用
top或htop实时监控CPU、内存、磁盘IO使用率。若MariaDB进程占用资源过高,可能是慢查询、连接数耗尽或内存配置不足导致。 - 执行
df -h确认磁盘空间是否充足,iostat检查磁盘IO是否有高读写等待的异常。
- 用
连接与会话分析
- 连接成功后,执行
SHOW GLOBAL STATUS LIKE 'Threads_connected';查看当前连接数,对比max_connections配置,确认是否达到上限。 - 执行
SHOW PROCESSLIST;查看活跃会话,排查是否有长时间运行的查询、锁等待或异常连接。
- 连接成功后,执行
日志深度分析
- 保持
log_warnings=3,同时开启慢查询日志:在my.cnf中添加:
记录执行时间超2秒的查询,排查低效查询导致的资源耗尽。slow_query_log=1 slow_query_log_file=/var/log/mariadb/slow.log long_query_time=2 - 查看MariaDB错误日志(通常路径
/var/log/mariadb/mariadb.log),寻找重启前的异常信息,如内存不足、表损坏、磁盘错误等。
- 保持
配置参数验证
- 检查
max_allowed_packet:若应用有大字段(BLOB/TEXT)写入,可临时调整为256M测试,观察问题是否复现。 - 核对PHP交互配置:确保
mysql.connect_timeout、default_socket_timeout等参数设置合理,避免超时导致连接中断。 - 调整内存相关配置:根据服务器总内存优化
innodb_buffer_pool_size、key_buffer_size,比如8G内存服务器可将innodb_buffer_pool_size设为4G-5G。
- 检查
应用代码排查
- 回顾修改的WWW代码,检查是否存在大量并发请求、循环查询、未释放数据库连接的情况。
- 模拟高并发场景,测试单请求的数据库交互,观察是否触发连接中断或服务无响应。
系统与硬件检查
- 查看系统日志
/var/log/messages或/var/log/syslog,排查是否有OOM killer杀死mysqld、磁盘控制器错误等系统级问题。 - 用
smartctl -a /dev/nvme0n1检查NVMe磁盘健康状态,确认无坏块或硬件故障。
- 查看系统日志
版本与补丁验证
- 查看MariaDB 10.3.28的已知bug,确认是否存在导致连接中断或崩溃的问题,考虑升级至同分支最新稳定版(如10.3.38)修复已知漏洞。
内容的提问来源于stack exchange,提问作者Gokihar
相关产品推荐
相关产品推荐

