mysql查看历史sql语句-查看 MySQL 历史 SQL
MySQL 的 `SHOW` 命令确实是个好帮手,但有时候用多了反而像给数据库装了个监控探头,时不时就跳出来一堆历史报错。我之前就遇到过这种情况,本来只是想随意查个 `SELECT 1` 看看有没有难题,结局一检查就发现昨天下午 4 点 10 分凌晨就有 50 多条 sql 运行黄了,光这些黄了记录自己点那会儿就快喘不过气了。 实际上不用非得每次都敲 `SHOW`。
要是你只是想快速看个大约,要么需求特定范围的记录,`SHOW VARIABLES` 要么 `SHOW FULL PROCESSLIST` 可能更直接。
不过有时候想要确实调出所有历史语句,还得靠 `SHOW ALL SQL`。但这事儿有点像翻旧账,数据库是记着每一次执行的,就像你点开了一个挺久那会儿没关的浏览器标签页,里面存着那会儿敲过的代码,只不过目前程序已经跑不动了。 要调出来,记得让服务器保持 `autocommit` 开着的状态,不然那些历史记录可能都存不上来。
然后就是最关键的参数了,`SHOW ALL SQL` 命令自带 `LIMIT` 功能,默认限制是 `500` 条,要是你历史 SQL 超过这个数,就得手动下降这个数字,比如改成 `LIMIT 2000`。我也试过把参数写死在 SQL 语句里,比如 `SHOW ALL SQL LIMIT 2000`,这样不管历史数据多少,都能直接截断到 2000 条。 执行完之后,打开结局集就能看到一堆历史 SQL 了。
不过别急着看行数,先看“ID"和“User"列。
要是发现某个 ID 对应的 User 是 `root` 要么 `mysql`,那这条历史记录大约率就是你自己留下的。
要是看到 `initdb` 要么 `mysqldump` 这种启动时的进程,那就更疯狂了,那是数据库刚启动起来时的系统指令。
有时候历史 SQL 会显示为 `MySQL` 要么 `System` 作为 User,这时候别慌,点进去看看,一般是系统初始化要么后台服务的人留下的少量指令。 要是一条历史 SQL 看起来挺怪,比如交互式的 SQL 要么看起来像脚本的东西,别急着删,先点进去看看是哪位写的,要么有没有参数。
有时候是测试账号留下的,有时候是某个中间人留下的。
要是是自己留下的,记得检查当时的权限设置,比如是不是当时只给了 `SELECT` 权限,结局目前却想执行了 `UPDATE` 操作。 在查看过程中,我见过有些用户会尝试把历史 SQL 直接写进脚本文件里跑,当作这样就不用每次都敲命令了,结局数据库线程池一满,那些历史语句就占满了内存,害得新的查询都办不成了。
这时候能做的就是把数据库重启一下,要么清理掉挺久没用的旧变量,让数据库重新认识一下当前的环境。 要是历史 SQL 忒多,就连想查整个数据库的运行轨迹,那就得换个思路。
比如用 `SHOW ENGINE INNODB STATUS`,这个命令能给你报出数据库的所有毛病日志,别看不像逐条 SQL 那样清楚,但作为故障排查的终极武器,它绝对比一堆历史 SQL 有用。
有时候根本不需求看 SQL,看到毛病堆栈直接就能知道是哪个库宕机了,要么哪个表锁了。 另外,还要留意一下 `SHOW ENGINE INNODB STATUS` 里的 `Previous Thread Status` 局部,那个能告诉你哪个线程在啥时候挂了,就连能看到线程的 CPU 占用情况。
有时候一条 SQL 执行黄了,可能是线程先崩溃了,SQL 根本没跑完就挂了,这时候只看结局集是没用的,得结合线程状态去分析。 最终,别看 `SHOW ALL SQL` 能供给大量历史数据,但别指望它能彻底还原一切。有些中间过程、一些只用于调试的一行无用代码,可能根本就不会被记录要么被截断了。数据库的设计初衷是高效存,故此它倾向于只保留最近的可用的记录。
要是你需求追溯挺久那会儿的特定操作,可能需求单独导出当时的 `binlog` 要么 `general_log` 文件,不过那玩意儿维护起来压力可就大了。 总的来说,`SHOW ALL SQL` 是个工具,不是自动备份。你得自己管住节奏,根据需求调整参数,按需取数。别让它把你变成那个只会输 `SHOW` 命令且没见过其他排查手段的初学者。
有时候换个角度看,比如结合毛病日志和线程状态,比单纯看那一堆 SQL 更有效。毕竟数据库不会撒谎,它只记录事实,而我们要做的,是学会从这些事实里拼凑出真相。
声明:演示网站所有内容,若无特殊说明或标注,均来源于网络转载,仅供学习交流使用,禁止商用。若本站侵犯了你的权益,可联系本站删除。
