添加迄今为止的微秒,显示精确到秒(来自 Oracle 跟踪文件...)

添加迄今为止的微秒,显示精确到秒(来自 Oracle 跟踪文件...)

Oracle 10046 跟踪文件包含以下数据

*** SESSION ID:(501.50681) 2022-08-08T13:27:08.567565+02:00
*** CLIENT ID:() 2022-08-08T13:27:08.567584+02:00
...
WAIT #0: nam='SQL*Net message to client' ela= 1 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=10287043490743
...
PARSE #140428862194944:c=204,e=203,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=422997890,tim=10287043504707
EXEC #140428862194944:c=103,e=103,p=0,cr=0,cu=0,mis=0,r=0,dep=0,og=1,plh=422997890,tim=10287043504953
WAIT #140428862194944: nam='SQL*Net message to client' ela= 2 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=10287043505039
...

我知道我的问题几乎已经解决了从纪元毫秒转换/替换时间... 但就我而言,我不想从“纪元”开始,而是从上面显示的日期开始,比如“*** CLIENT ID:... 2022-08-08T13:27:08...” 。

那么 - 知道“tim=10287043490743”大约等于 8 月 8 日 13:27:08,我如何将所有进一步出现的微秒字符串“tim=.....”转换为清晰的日期和时间格式?

有关 Oracle 10046 跟踪文件结构的更多信息,我们以 INST2_ora_7504.trc 文件为例:

[oracle@machine sql]$ ls -l $tf  
-rw-r----- 1 oracle asmadmin 2996974 Aug  8 13:39 /opt/.../rdbms/dbuniq_nam/INST2/trace/INST2_ora_7504.trc

正如你所看到的,它是在 8 月 8 日 13:39 写完的。
检索开始写入的时间戳:

[oracle@machine sql]$ grep "CLIENT ID"  $tf
*** CLIENT ID:() 2022-08-08T13:27:08.567584+02:00

第一次出现计时信息:

[oracle@machine sql]$ grep "tim="  $tf|head -1
WAIT #0: nam='SQL*Net message to client' ela= 1 driver id=1413697536 #bytes=1 p3=0 obj#=-1 tim=10287043490743  

最后一个:

[oracle@machine sql]$  grep "tim="  $tf|tail -1
CLOSE #140428862208536:c=8,e=9,dep=0,type=0,tim=10287767781596

该文件包含 28756 行带有“tim=”的行。在 Oracle 下,很容易在 SQL 中计算我想要的内容:

[oracle@machine sql]$ sqlplus / as sysdba

SQL> select to_date('2022-08-08 13:27:08','YYYY-MM-DD HH24:MI:SS')+((10287767781596/24/60/60/1000000) - 
   2 (10287043490743/24/60/60/1000000)) from dual;

TO_DATE('2022-08-08
-------------------
08/08/2022_13:39:12

看 ?获取最后一个“tim=”值,将其添加到文件头中包含的时间戳,并减去其以微秒为单位的等效值,这样您就可以验证该文件是否确实在 13:39 写入(如上面显示的“ls -l”) 。

但我想这样做外部SQL/Oracle 工具...

谢谢。
问候,
塞布

答案1

我不知道 Linux 下的“date”命令可以这么容易处理:

[oracle@machine sql]$ echo "(10287767781596/1000000)-(10287043490743/1000000)"|bc
724

[oracle@machine sql]$ date '+%Y-%m-%dT%T' --date="2022-08-08 13:27:08 CEST + 724 seconds"
2022-08-08T13:39:12

这与我在上面的 SQL 命令中得到的结果完全相同。

相关内容