Laravel API查询未被RDS MySQL performance_schema追踪问题问询
这问题确实挺怪异的,我之前帮朋友排查过类似的场景,咱们从几个核心方向入手分析:
1. 检查Laravel的数据库连接预处理配置
Laravel默认会使用PDO预处理语句,而MySQL 5.6的performance_schema对模拟预处理的查询追踪支持有坑。如果Laravel开启了PDO::ATTR_EMULATE_PREPARES,实际执行的SQL可能不会被performance_schema正确捕获,而Workbench是直接执行原生SQL,所以能被追踪。
打开你的config/database.php,找到MySQL连接配置,添加/修改options项:
'mysql' => [ // 其他配置... 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::ATTR_EMULATE_PREPARES => false, // 关闭模拟预处理 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ]) : [], ],
修改后重启Laravel服务,再测试查询是否能被追踪。
2. 验证RDS的performance_schema核心参数
登录RDS的MySQL控制台,执行以下命令确认关键配置:
-- 检查performance_schema是否全局开启 SHOW VARIABLES LIKE 'performance_schema'; -- 检查语句摘要追踪的消费者是否启用 SHOW VARIABLES LIKE 'performance_schema_consumer_statements_digest'; -- 检查语句相关的仪器是否全部开启 SELECT NAME, ENABLED, TIMED FROM performance_schema.setup_instruments WHERE NAME LIKE '%statement/%';
确保performance_schema为ON,performance_schema_consumer_statements_digest为ON,且所有statement/%类型的仪器ENABLED都为YES。如果有未开启的,你可以通过RDS参数组调整这些参数(注意RDS参数组修改后需要重启实例生效)。
3. 排查Laravel的持久连接设置
如果Laravel启用了数据库持久连接,可能会导致performance_schema无法追踪到新的请求查询——因为持久连接会复用已有连接,而performance_schema的追踪可能在连接初始化时才绑定。
在config/database.php中关闭持久连接:
'mysql' => [ // 其他配置... 'persistent' => false, ],
4. 确认数据库用户的权限
虽然你用Workbench能正常追踪,但还是要确认Laravel使用的数据库用户是否具备PROCESS权限——performance_schema的部分追踪功能需要这个权限。执行以下命令检查:
SHOW GRANTS FOR 'your_laravel_db_user'@'%';
如果没有PROCESS权限,通过RDS控制台给该用户添加权限即可。
5. MySQL 5.6版本的局限性
MySQL 5.6的performance_schema对预处理语句的支持确实不如后续版本完善,如果你能升级RDS实例到MySQL 5.7或更高版本,这类问题大概率会自动消失。如果暂时无法升级,优先调整前面提到的连接配置和参数。
内容的提问来源于stack exchange,提问作者Ankit

