mysql当数据库发现了慢sql怎么定位?--待验证
1、应用侧生成链路id。
使用skywalking
2、mybatis写拦截器,sql里面加入链路id
`@Intercepts({
@Signature(
type = StatementHandler.class,
method = "prepare",
args = {Connection.class, Integer.class}
)
})
public class SqlStatementInterceptor implements Interceptor {
@Override
public Object intercept(Invocation invocation) throws Throwable {
StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
String sql = statementHandler.getBoundSql().getSql();
System.out.println("执行的 SQL: " + sql);
// 可以在这里修改 sql
//todo 从threadloal中获取链路id, 然后拼接到sql中。
比如 sql=“/”+链路id+"/"+sql;
// statementHandler.getBoundSql().setSql(modifiedSql);
// 然后继续执行后续操作
return invocation.proceed();
}
@Override
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
@Override
public void setProperties(Properties properties) {
// 可以设置拦截器属性
}
}`
3| 后续导出来的慢sql,自然就会带着traceid。
后续就可以拿着这个traceid去链路追踪平台搜索了。或者去日志里面找相关的业务
为什么不直接从链路追踪的慢sql统计上看 ?
有可能太长了,应用崩了, 慢sql无法记录。但是日志文件肯定在, 看业务日志也能定位问题
手动测试的相关截图