如何为查询执行耗时添加颜色告警_超长SQL爆红显示配置

冬婷姑娘_6301

冬婷姑娘_6301

2026-05-06

518人浏览

原创

mysql慢查询日志本身不支持着色,需在查看阶段用awk/grep动态高亮;cli耗时标红需捕获stderr;sql批量执行推荐python精确计时着色;所有方案均依赖终端支持ansi颜色。

mysql 慢查询日志里怎么让耗时数字自动标红

直接改日志本身做不到——mysqld 输出的慢查询日志是纯文本,不带颜色。真要“爆红”,得在查看阶段加处理,不是在生成阶段。

最常用也最轻量的办法:用 grep 或 awk 配合终端着色,在读取日志时动态高亮超时行。比如把执行时间 ≥ 2 秒的整行标红:

awk '$NF+0 >= 2 {print "\033[31m" $0 "\033[0m"; next} 1' /var/log/mysql/slow.log

注意:$NF 是最后一列(MySQL 慢查日志末尾是 Query_time: 后的数值),+0 强制转为数字避免字符串比较出错;\033[31m 是红色 ANSI 码。

  • 别直接用 grep -E "Query_time: [2-9]\.|[1-9][0-9]" —— 它只能匹配文本,无法区分 1.95s 和 2.01s,精度不够
  • 如果日志用了 log_output = TABLE 存进 mysql.slow_log 表,就得换 SQL 方式查,没法用终端着色
  • 某些旧版终端(如 Windows CMD)不支持 ANSI 颜色,会显示乱码,优先用 WSL、iterm2 或 mintty

MySQL 客户端执行 SQL 时实时标红耗时

MySQL CLI 本身不提供执行耗时着色功能,但可以通过 shell 包装实现:把 mysql 命令套一层脚本,捕获输出里的 Query OK 或 Rows matched 行及前面的耗时提示。

关键点在于 MySQL CLI 默认会在每条语句后打印类似 1 row in set (0.32 sec) 的信息,它其实走的是 stderr,可单独截获:

mysql -u root -p -e "SELECT SLEEP(1);" 2> >(awk '/sec)/ && $(NF-1)+0 > 0.5 {print "\033[31m" $0 "\033[0m"; next} 1' >&2) 

这个命令对 stderr 做了实时过滤,只要括号里秒数 > 0.5 就标红。

  • 2> >(...) 是 bash 进程替换语法,不能在 dash/sh 下用,确保用 bash 启动脚本
  • 别试图修改 my.cnf 里的 pager 配置来着色——pager 只作用于查询结果,不包含耗时统计行
  • 如果开了 profiling=ON,耗时分散在多行,这种简单匹配会失效,得用更重的解析逻辑

SQL 文件批量执行时按耗时分色输出(Python 脚本方案)

当需要跑一堆 .sql 文件并监控每条语句耗时,CLI + shell 组合太脆弱,推荐用 Python 控制执行流,自己测时、判断、着色。

核心是用 mysql-connector-python 或 pymysql 执行单条语句,并用 time.time() 包裹。超过阈值就用 \033[31m 打印语句和耗时:

import time
import mysql.connector
conn = mysql.connector.connect(user='root', password='', database='test')
cursor = conn.cursor()
for sql in open('batch.sql').read().split(';'):
    if not sql.strip(): continue
    t0 = time.time()
    try:
        cursor.execute(sql)
        dt = time.time() - t0
        color = '\033[31m' if dt > 1.0 else ''
        print(f"{color}→ {sql[:50]}... ({dt:.3f}s)\033[0m")
    except Exception as e:
        print(f"\033[33m! {sql[:30]}... ERROR: {e}\033[0m")

这样每条语句独立计时,比看整体执行时间靠谱得多。

  • 别用 subprocess.run(['mysql', '-e', sql]) —— 启动新进程开销大,且无法精确到单条语句粒度
  • 注意 autocommit=False 时,COMMIT 本身也会被计时,需单独判断语句类型
  • 如果 SQL 含注释或换行,split(';') 会切错,得用真正 SQL 解析器(如 sqlparse)做安全切分

为什么不用 Prometheus + Grafana 做“红灯告警”

因为这不是日志着色问题,而是监控告警场景。如果你已经上了 mysqld_exporter,那 mysql_global_status_slow_queries 和 mysql_info_schema_processlist_time 这类指标能反映慢查询趋势,但它们不记录单条 SQL 内容,更不会“爆红显示原始 SQL”。

想在 Grafana 里让某条 SQL 爆红,得先让它进日志、再进 Loki/ELK、最后写 LogQL 查询提取 Query_time 并配告警颜色——链路长、延迟高、还依赖日志格式稳定。

  • 别指望 performance_schema.events_statements_history_long 直接导出带颜色的 HTML 表格——它没渲染能力,只是张内存表
  • 开发环境用着色脚本够用;生产排查才值得上 ELK+Grafana 这套,否则就是杀鸡用核弹
  • 最常被忽略的一点:所有着色方案都依赖终端解释 ANSI 序列。发邮件、存文件、贴进钉钉/企微时,颜色全消失,只剩乱码
PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

2193

6

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.21

1339

5

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.18

775

5

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.19

2992

5

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.25

5048

4

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2023.08.08

1139

3

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.11

5311

4

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

2023.08.14

4662

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

6174

11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习