MySql怎样跟踪SQL脚本执行

MySql怎样跟踪SQL脚本执行,第1张

其实方法很简单,开启mysql的日志log功能,通过查看跟踪日志即可。

开启mysql的日志log方法:

windows环境下的配置方法:

我使用的版本:Version: 5.0.37-community-nt-log (MySQL Community Edition (GPL))

找到my.ini,我的是在“G:\Program Files (x86)\MySQL\MySQL Server 5.0”目录下,

找到[mysqld],在下面添加:

log=存放日志的路径/my.log

首先介绍下 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 工具。

mysql服务器自身没有提供审计功能,但是我们可以使用init-connect + binlog的方法进行mysql的 *** 作审计。由于mysql binlog记录了所有对数据库长生实际修改的sql语句,及其执行时间,和connection_id但是却没有记录connection_id对应的详细用户信息。在后期审计进行行为追踪时,根据binlog记录的行为及对应的connection-id 结合 之前连接日志记录 进行分析,得出最后的结论。

1. 设置init-connect

1.1 创建用于存放连接日志的数据库和表

create database accesslog

CREATE TABLE accesslog.accesslog (`id` int(11) primary key auto_increment, `time` timestamp, `localname` varchar(30), `matchname` varchar(30))

1.2 创建用户权限

可用现成的root用户用于信息的读取

grant select on accesslog.* to root

如果存在具有to *.* 权限的用户需要进行限制。

这里还需要注意用户必须对accesslog表具有insert权限

grant select on accesslog.* to user@’%’

1.3 设置init-connect

在[mysqld]下添加以下设置:

init-connect=’insertinto accesslog.accesslog(id, time, localname, matchname)

values(connection_id(),now(),user(),current_user())’

------注意user()和current_user()的区别

log-bin=xxx

这里必须开启binlog

1.4 重启数据库生效

shell>/etc/init.d/mysql restart

2. 记录追踪

2.1 thread_id确认

可以用以下语句定位语句执行人

Tencent:~ # mysqlbinlog --start-datetime='2011-01-26 16:00:00'

--stop-datetime='2011-01-26 17:00:00' /var/lib/mysql/mysql-bin.000010

| grep -B 5 'wsj'

COMMIT/*!*/

# at 767

#110126 16:16:43 server id 1 end_log_pos 872 Query thread_id=19exec_time=0 error_code=0

use test/*!*/

SET TIMESTAMP=1296029803/*!*/

create table wsj(id int unsigned not null)

--

BEGIN

/*!*/

# at 940

#110126 16:16:57 server id 1 end_log_pos 1033 Query thread_id=19exec_time=0 error_code=0

SET TIMESTAMP=1296029817/*!*/

insert into wsj(id) values (1)

--

BEGIN

/*!*/

# at 1128

#110126 16:16:58 server id 1 end_log_pos 1221 Query thread_id=19exec_time=0 error_code=0

SET TIMESTAMP=1296029818/*!*/

insert into wsj(id) values (2)

2.2 用户确认

thread_id 确认以后,找到元凶就只是一条sql语句的问题了。

mysql>select * from accesslog where id=19

+----+---------------------+---------------------+-----------+

| id | time| localname | matchname |

+----+---------------------+---------------------+-----------+

| 19 | 2011-01-26 16:15:54 | test@10.163.164.216 | test@%|

+----+---------------------+---------------------+-----------+

1 row in set (0.00 sec)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6145641.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-16
下一篇 2023-03-16

发表评论

登录后才能评论

评论列表(0条)

保存