oracle - 在 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工具集可以提供这个。我应该更容易解释什么时候(以人类可读的形式)哪个活动开始了。
解决方案
从字符串日期生成纪元秒数非常简单。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);
推荐阅读
- javascript - 将这个对象数组转换为另一个对象的最佳方法是什么?
- php - 从自定义包中的控制器获取配置参数
- redux - 使用 redux-toolkit 创建简单的选择器函数
- google-cloud-platform - 数据流项目中的stackdriver监控api
- java - 导入的数据仅显示在 JTable (Java) 的第一列中
- python-3.x - 如何从 Python Selenium 中的类中提取所有 href?
- python - 在破折号中加载带有预选值(例如boxSelect)的绘图模式栏
- python - 在 Python 中从 PDF 文件中提取文本
- android - Kotlin,Android Studio 中的自定义 .svg 谷歌地图标记
- python - 一次运行 10 个循环