如何实时监控mysql中的SQL语句的执行情况

如何实时监控mysql中的SQL语句的执行情况,第1张

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

collect:触发发生时收集诊断数据,默认开启。

∘ collect-gdb:收集 GDB 堆栈跟踪,需要 gdb 工具。

∘ collect-strace:收集跟踪数据,需要 strace 工具。

∘ collect-tcpdump:收集 tcpdump 数据,需要 tcpdump 工具。

MySQL数据库的导入,有两种方法: 1) 先导出数据库SQL脚本,再导入; 2) 直接拷贝数据库目录和文件。 在不同 *** 作系统或MySQL版本情况下,直接拷贝文件的方法可能会有不兼容的情况发生。 所以一般推荐用SQL脚本形式导入。

创建表,存储每天的表空间占用情况

CREATE TABLE [dbo][t_rpt_table_spaceinfo](

[table_name] [sysname] NOT NULL,

[record_date] [date] NOT NULL,

[record_time] [time](7) NOT NULL,

[rows_count] [bigint] NULL,

[reserved] [bigint] NULL,

[data_size] [bigint] NULL,

[index_size] [bigint] NULL,

[unused] [bigint] NULL,

CONSTRAINT [PK_t_rpt_table_spaceinfo] PRIMARY KEY CLUSTERED

(

[table_name] ASC,

[record_date] ASC,

[record_time] ASC

)

)

2 新建作业

新建作业,作业计划每天凌晨运行一次,每天记录表占用的空间情况,存储到上一步建立的表中

作业中执行的T-SQL代码为:

SET NOCOUNT ON

/创建临时表,存放用户表的空间及数据行数信息/

CREATE TABLE #tablespaceinfo

(

nameinfo VARCHAR(500) ,

rowsinfo BIGINT ,

reserved VARCHAR(20) ,

datainfo VARCHAR(20) ,

index_size VARCHAR(20) ,

unused VARCHAR(20)

)

DECLARE @tablename VARCHAR(255);

/使用游标,循环得到表空间使用情况/

DECLARE Info_cursor CURSOR

监控Oracle 数据库中长时间运行进程的两种方式,通过这些方 法,我们可以监控单条语句的 长时间 *** 作,监控存储过程的运行进度,甚至自己'生成'进度信息 关键词:监控进度V$SESSION_LONGOPS 当Oracle 存储过程运行时间较长时,我们希望客 户端能了解到它在后台执行的状况或者进度信息(类 似WINDOWS 安装软件时的进度条信息),这样可以知 道运行在后台的应用进程是否终止或者休眠,更近一 步要求,最好能知道进行到哪一步骤,还有多少时间才 能完成 简单到一条SQL 语句的情况,如果执行时间较长, 我们如何得到它的运行状况是否后台还在运行虽 然可以查看SQL 的执行计划了解它的执行步骤,但如 何知道它运行到哪一个步骤了呢如何才能估计出它 的合理的较为精确的执行时间呢 Oracle 数据库前端发出执行命令后,进程在后台 执行,普通开发人员一般无法了解到后台在做什么,一 般采用的方法是用DBMSOUTPUTPUT_LINE 来打印出 来,但DBMS—OUTPUTPUT—LINE 打印的信息受缓冲区 大小限制,如果信息较多就容易溢出,而且如果存储过 程执行时间较长,只有在其执行完后,这些信息才会打 印出来,这就增加了调试周期,影响了调试效果有的 开发人员在存储过程中通过写日志表的形式来记录进 度,但需要COMMIT 后其他进程才能看到这些日志信 息,而在某些控制结构中(如游标CURSOR 循环)COM— MIT,则很容易引起ORA 一01555 错误,造成程序出错 下面介绍两种监控方法 如何监控单条长语句从ORACLE8 开始,出现一个新的动态视图:V $SESSION_LONGOPS,从这个视图可以获知一些 *** 作 (如全表扫描,并行查询,RMAN,排序等)的执行进度, 我们先来了解一下V$SESSION—LONGOPS 视图的一些 重要字段: 列说明 sID 会话标识 5ERIAL#会话序列号 OPfE *** 作的简短描述 TARG 盯 *** 作的对象,如xx TAR~_DESC目标描述 SOFAR 目前已执行单位数目 ToTAIWORK 总单位数目 UNlTS 单位 START_TIME 开始执行时间 LAST_ UPDATE_TIME 统计数据最后更新时间 TIME_ REMAINING 估计剩余时间c ELAPSED_SECONDS 已执行时间(秒) MEsSAGE 统计数据汇总信息 USERA^^E 用户名 ~L_ADDRES5 语句的地址,,用于和V$sql_text 等关联 语句的hash 地址,用于和V$sql_texlSQLHASH VALUE等关联 这个动态视图显示各个运行时间超过6 程这些进程包含许多备份和恢复功能,统计数据收集,查询等 执行以下语句就可以得到数据库中各个长时间 *** 作的进程信息: select'Icfromv$sesslon_ longopswheretime_ re- malnlng>0 我们也可以用图形化工具查看,如TOAD,OEM中 均可查看长 *** 作进程进度信息 Oracle 自带的管理工具OracleEnterpriseManager (OEM)提供了图形化查看长 *** 作的功能,如: 计算机系统应用2007 Quest公司的数据库管理工具TOAD 也可以看到 长 *** 作信息,如: 表的统计信息 长时问运行的SQL 语句可以用V$SESSION—LON 为了能监控到查询进程执行的进度,必需使用 CBO 优化器并且: 设置TlMED—STATISTICS或者SQL—TRACE 用ANALYZE语句或者DBMS—STAT 包收集相关 108 实践经验P 帕cficalExpen GOPS来监控实际上,长时间运行的存储过程也可以 监控那是否任何 *** 作都可以通过这个视图来监控进 度呢很遗憾,V$SESSION—LONGOPS 只会报告它认为 耗时长的 *** 作对于NEsTEDLOOP/UNIQUEINDEX READS/INDEXRANGEScANS 等执行速度很快的 *** 作, 2007 期计算机系统应用由于它们执行一般不超过6 秒,因此将不会出现在V $SESSION—LONGOPS 如何监控自定义存储过程单条长语句可以用上面的方法监控,Oracle 动生成V$SESSION— LONGOPS 记录那么存储过程中 有许多小 *** 作,如何监控进度呢其实,我们也可以手 工生成V$SESSION—LONGOPS 记录,方法是调用DBMS APPLICATION—INFO 包来生成自定义进度信息 从Oracle72 开始,提供了DBMS—APPLICATION— INFo 包,通过调用这个包,应用可以将自己的名字和 动作填写到V$SESSION 和V$SQLAREA 的MODULE ACTION列中V$SESSION 列出每个会话的用户名, *** 作系统机器名,终端名,程序名等 应用可以在执行模块时设置模块名和动作名,模 块名一般是甩户自定义的而动作名一般描述模块中 的当前执行的事务的名字 DBMSAPPLICATION_INFO 包包含以下过程 SET_ MODULE 设置当前运行程序的模块名 SET__AEl'ION 设置当前模块的当前动作名 SESSION—LON-在V$SESSIONLONGOPS视图中 GoPS 插入一行进度信息 SETMODULE过程设置模块名和动作名: createorreplaceproceduredel—cust(v_cust—Id varchar2) begindbms—— application—— infoset— module(module—— name=>"delcust" actlon_name=>"deletetablecust)i deletefromcustwherecustld=v_ cusLId; dbms_appllcatlon— InfoseLmodule(,); end;以上设置的模块名和动作名可以通过查询V $sqlarea 获取 如:selectsql—text,module,actionfromv $sqlareawheremodule="del_cust: sql_textmoduleadion Deletefr0mcustdel_ custdeletetableoust 1rowselected SET_SESSION—LONGOPS 过程用于在V$session— longops 中插入一行,开发人员可以调用此过程设置长 时间 *** 作的状态信息,这样,任何其他其他会话都可以 看到这个进度信息如下例所示: declare nohlntnumberdefaultdbmsapplicatlon_infoset_ session— Iongops_ nohint; IdndexnumberdefaultInohlnt: slnonumber;begin forlIn18888888888 loop update; dbms_ appllcaflon— Infosetsesslon_ longops (rlndex=>l_rlndex, slno=>I_slno op_name=>"updateahugetable target=>126, target_desc=>'msgdescription context=>0sOfar=>j totalwork=>8888888888 units=>loops endloop;end; 然后,从另一个会话来执行以下语句selectfromv$sesslon_ longopswheretlmere malnlng>0; 也可以用图形化工具TOAD 或OEM来查看 因此,采用本文说明的方法,Oracle 开发人员可以 比较方便的监控长 *** 作进程的进度信息,也可以自己 设置监控信息,来了解后台存储过程的运行效率甚 至,可以在存储过程或SQL 语句提交执行后马上观察 其执行进度,如果比较缓慢,则可以中断其执行,进行 调优,从而缩短调试周期,提高开发效率

以上就是关于如何实时监控mysql中的SQL语句的执行情况全部的内容,包括:如何实时监控mysql中的SQL语句的执行情况、如何实时监控mysql数据库思路、怎样实时监控sqlserver数据库内记录的变化等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: https://outofmemory.cn/sjk/9757348.html

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

发表评论

登录后才能评论

评论列表(0条)

保存