You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB只读从库突然无法响应PDO请求求助

排查MariaDB只读从库PDO请求无响应且Web CPU占满问题

1. 检查PDO连接配置细节

  • 确认是否启用持久化连接:查看代码中PDO实例化是否设置了PDO::ATTR_PERSISTENT => true。持久化连接在只读从库场景下,若长时间闲置未被正确回收,易出现会话状态异常,导致新请求挂起,进而占满PHP-FPM进程拉高CPU。
  • 检查初始化命令:若设置了PDO::MYSQL_ATTR_INIT_COMMAND(如SET NAMES utf8mb4),确认该命令在只读从库上可正常执行——部分初始化操作可能触发隐性写操作,在只读模式下被阻塞。

2. 分析MariaDB连接状态

  • 执行SHOW PROCESSLIST;,过滤Web应用对应的数据库连接(通过User、Host字段),检查是否有大量处于Sleep或停滞状态的连接,尤其是持久化连接是否堆积。
  • 执行SHOW GLOBAL STATUS LIKE 'Threads_%';,观察Threads_connected(总连接数)、Threads_running(活跃连接数)是否异常,是否达到max_connections上限。

3. 排查PHP-FPM进程状态

  • 执行ps aux | grep php-fpm,查看是否有大量处于D(不可中断睡眠)状态的进程——这类进程通常在等待数据库响应,会持续占用CPU资源。
  • 开启PHP-FPM慢日志(若未启用):修改php-fpm.conf,设置slowlog = /var/log/php-fpm-slow.log、request_slowlog_timeout = 5s,复现问题后查看慢日志,定位卡住的请求细节。

4. 检查MariaDB只读从库核心配置

  • 确认read_only与super_read_only参数:执行SHOW VARIABLES LIKE '%read_only%';,若应用使用的数据库账号拥有SUPER权限,read_only不会限制其操作,但super_read_only会——权限配置错误可能导致隐性写操作被阻塞。
  • 调整连接超时参数:检查wait_timeout、interactive_timeout设置,若wait_timeout大于PHP-FPM进程生命周期,会导致无效持久化连接堆积。建议将wait_timeout设置为略短于PHP-FPM的pm.process_idle_timeout。

5. 排查锁与复制异常

  • 检查元数据锁(MDL):执行SHOW OPEN TABLES WHERE In_use > 0;,确认是否有表被锁定——主库DDL操作同步到从库时,会持有MDL锁,此时访问该表的PDO请求会被阻塞。
  • 检查复制状态:执行SHOW SLAVE STATUS\G,确认Slave_IO_Running、Slave_SQL_Running均为Yes,无复制延迟或错误。复制异常可能导致从库会话状态紊乱。

6. 临时验证与参数调整

  • 临时关闭PDO持久化连接,测试问题是否消失。若恢复正常,说明持久化连接与MariaDB存在兼容性问题,可调整PHP-FPM的pm.max_children降低进程数,或匹配wait_timeout与进程存活时间。
  • 给PDO连接添加超时参数:设置PDO::ATTR_TIMEOUT => 10(单位秒),避免请求无限期等待占用资源。

7. 版本兼容性排查

  • PHP 7.1与MariaDB 10.5.5的PDO驱动可能存在兼容性问题,尝试升级PHP的mysqlnd驱动版本,或测试将MariaDB降级到更稳定的10.4版本(需保证主从复制兼容性)。

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 13:18:08