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无法记录。但是日志文件肯定在, 看业务日志也能定位问题


手动测试的相关截图


posted @ 2024-10-18 17:11  rudolf_lin  阅读(20)  评论(0编辑  收藏  举报