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
相关产品推荐
相关产品推荐

