首页 > 解决方案 > 在 mrskew 中,我可以从 tim 计算人类可读的时间戳吗?

问题描述

我正在使用Method-R的mrskew来分析 Oracle SQL 跟踪文件。

我想列出类似于call.rc
输出的所有数据库调用, 但不是$tim的值,而是打印人类可读的日期格式。

原始数据(最少混淆):

*** 2020-11-26 10:06:01.867
*** SESSION ID:(1391.49878) 2020-11-26 10:06:01.867
*** CLIENT ID:() 2020-11-26 10:06:01.867
*** SERVICE NAME:(SYS$USERS) 2020-11-26 10:06:01.867
*** MODULE NAME:(JDBC Thin Client) 2020-11-26 10:06:01.867
*** CLIENT DRIVER:(jdbcthin : 12.2.0.1.0) 2020-11-26 10:06:01.867
*** ACTION NAME:() 2020-11-26 10:06:01.867
...
WAIT #0: nam='SQL*Net message from client' ela= 491 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=12568091328841
=====================
PARSING IN CURSOR #18446744071522016088 len=71 dep=0 uid=88 oct=7 lid=88 tim=12568091329190 hv=2304270232 ad='61e4d11e0' sqlid='5kpbj024phrws'
/*Begin.Work*/
SELECT ...
END OF STMT
PARSE #18446744071522016088:c=147,e=148,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=957996380,tim=12568091329190
...
EXEC #18446744071522016088:c=683,e=11406,p=0,cr=2,cu=11,mis=0,r=1,dep=0,og=1,plh=957996380,tim=12568091341788
CLOSE #18446744071522016088:c=27,e=27,dep=0,type=1,tim=12568091343665
XCTEND rlbk=0, rd_only=0, tim=12568091343769

电流输出(为便于阅读而压缩):

          END-TIM       LINE       SQL_ID CALL-NAME STATEMENT-TEXT
-----------------------------------------------------------------------------
  12568091.341788         36 5kpbj024phrws EXEC     /*Begin.Work*/ SELECT ...
  12568091.343769         42               XCTEND    

预期输出(请不要批评我不正确的亚秒计算):

                  END-TIME LINE        SQL_ID CALL-NAME STATEMENT-TEXT  
-----------------------------------------------------------------------
2020-11-26 10:06:01.341788   36 5kpbj024phrws EXEC     /*Begin.Work*/ SELECT ...
2020-11-26 10:06:01.343769   42               XCTEND      

我假设我可以使用POSIX:strftime正确格式化时间戳,但我需要一种方法来从跟踪文件开头的时间戳生成一个纪元时间戳

*** 2020-11-26 10:06:01.867

然后是每个$tim相对于此跟踪文件开头的偏移量。
我希望methodr工具集可以提供这个。我应该更容易解释什么时候(以人类可读的形式)哪个活动开始了。

标签: oracleperlinstrumentation

解决方案


从字符串日期生成纪元秒数非常简单。Time::Local具有执行此操作的功能。

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';

use Time::Local 'timelocal_posix';

my $date = '2020-11-26 10:06:01.867';

# Split the date apart
my ($yr, $mon, $day, $hr, $min, $sec, $micro) = split /[- :.]/, $date;

# Note necessary adjustments to month and year
say timelocal_posix($sec, $min, $hr, $day, $mon - 1, $yr - 1900);

推荐阅读