如何实时监控mysql中的SQL语句的执行情况
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何实时监控mysql中的SQL语句的执行情况相关的知识,希望对你有一定的参考价值。
首先介绍下 pt-stalk,它是 Percona-Toolkit 工具包中的一个工具,说起 PT 工具包大家都不陌生,平时常用的 pt-query-digest、 pt-online-schema-change 等工具都是出自于这个工具包,这里就不多介绍了。
pt-stalk 的主要功能是在出现问题时收集 OS 及 mysql 的诊断信息,这其中包括:
1. OS 层面的 CPU、IO、内存、磁盘、网络等信息;
2. MySQL 层面的行锁等待、会话连接、主从复制,状态参数等信息。
而且 pt-stalk 是一个 Shell脚本,对于我这种看不懂 perl 的人来说比较友好,脚本里面的监控逻辑与监控命令也可以拿来参考,用于构建自己的监控体系。
三、使用
接着我们来看下如何使用这个工具。
pt-stalk 通常以后台服务形式监控 MySQL 并等待触发条件,当触发条件时收集相关诊断数据。
触发条件相关的参数有以下几个:
function:
∘ 默认为 status,代表监控 SHOW GLOBAL STATUS 的输出;
∘ 也可以设置为 processlist,代表监控 show processlist 的输出;
variable:
∘ 默认为 Threads_running,代表 监控参数,根据上述监控输出指定具体的监控项;
threshold:
∘ 默认为 25,代表 监控阈值,监控参数超过阈值,则满足触发条件;
∘ 监控参数的值非数字时,需要配合 match 参数一起使用,如 processlist 的 state 列;
cycles:
∘ 默认为 5,表示连续观察到五次满足触发条件时,才触发收集;
连接参数:host、password、port、socket。
其他一些重要参数:
iterations:该参数指定 pt-stalk 在触发收集几次后退出,默认会一直运行。
run-time:触发收集后,该参数指定收集多长时间的数据,默认 30 秒。
sleep:该参数指定在触发收集后,sleep 多久后继续监控,默认 300 秒。
interval:指定状态参数的检查频率,判断是否需要触发收集,默认 1 秒。
dest:监控数据存放路径,默认为 /var/lib/pt-stalk。
retention-time :监控数据保留时长,默认 30 天。
daemonize:以后台服务运行,默认不开启。
log:后台运行日志,默认为 /var/log/pt-stalk.log。
collect:触发发生时收集诊断数据,默认开启。
∘ collect-gdb:收集 GDB 堆栈跟踪,需要 gdb 工具。
∘ collect-strace:收集跟踪数据,需要 strace 工具。
∘ collect-tcpdump:收集 tcpdump 数据,需要 tcpdump 工具。
Rainbow702 写道引用最好可以日志或其它方式记录下来数据库本身应该就有操作日志的啊问题补充:我用的hibernate的PostDeleteEvent,还是有些问题
hibernate自带的监听
jkxydp 写道用spring的aop啊,在删除记录的方法上加一个记录日志的切入点去记录啊,dao层一般增、删、改、查的方法都是单独出来的吧,在所有删除记录的方法上写切入点。
或者使用loger,其它的都不写,就在删除的方法里面写上日志应该就没问题。 参考技术B 可以查看日志文件【机器名-slow.log】,里面有执行缓慢的语句,看看是否需要优化程序还是修改数据库结构。
可以show full processlist查看正在执行的语句。 参考技术C
慢查询的话可以开启慢查询日志,生产环境可以开启。
1.启用慢查询日志记录 (建议生产环境开启)
vim /etc/mysql/mariadb.conf.d/50-server.cnf
或者 vim /etc/mysql/my.cnf
slow_query_log=1
log-queries-not-using-indexes
long_query_time=1
log-slow-queries=/data/log/mysql/log-slow-queries.log
超过1s的都认为是慢查询。 开启慢查询以后,可以在慢查询日志文件中查看运行慢的SQL,
$ tail -f /data/log/mysql/log-slow-queries.log
2.监测所有SQL,可以开启MySQL General Log,监测所有SQL请求(生产环境不建议开启)
管理员登陆
$ mysql -u root -p
#设置存放路径
set global general_log_file=/data/log/mysql_general_log.log;
#设置开启general log, 1开启(0关闭),即时生效,不用重启MySQL
set global general_log=1;
详情参考:MySQL查询监测
参考技术D 有啥意义呀?-0-#目的查一下执行了什么sql语句,我现在设置了输出到日志文件中了,能看到,但是没有执行时间的分析监控mysql执行的sql语句
linux平台
可以在/etc/mysqld中添加如下:
修改my.ini,在mysqld下添加log一行,
[mysqld]
log = "D:/tmp/mysql_log/mysql_log.sql"
然后,重新启动mysql,就可以实时看到myql服务器当前正在执行的语句了。
重启mysql
其中第二种方法对我这无效,以后再搞清楚!
一、MYSQL服务
我的电脑——(右键)管理——服务与应用程序——服务——MYSQL——开启(停止、重启动)
二、命令行方式
Windows
1.点击“开始”->“运行”(快捷键Win+R)。
2.启动:输入 net stop mysql
3.停止:输入 net start mysql
提示* Redhat Linux 也支持service command,启动:# service mysqld start 停止:# service mysqld stop 重启:# service mysqld restart
* Windows下不能直接重启(restart),只能先停止,再启动。
三、Too many connections
2008-04-30┆379,578 Views┆56,071
问题分析:
连接数超过了 MySQL 设置的值,与 max_connections 和 wait_timeout 都有关系。wait_timeout 的值越大,连接的空闲等待就越长,这样就会造成当前连接数越大。
解决方法:
1、虚拟主机用户请联系空间商优化 MySQL 服务器的配置;
2、独立主机用户请联系服务器管理员优化 MySQL 服务器的配置,可参考:
修改 MySQL 配置文件(Windows下为 my.ini, Linux下为 my.cnf )中的参数:
- CODE: [COPY]
- max_connections= 1000
- w
以上是关于如何实时监控mysql中的SQL语句的执行情况的主要内容,如果未能解决你的问题,请参考以下文章