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
파일에는 "tim="이 포함된 28756줄이 포함되어 있습니다. 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/오라클 도구...
감사해요.
감사합니다,
세브
답변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 명령에서 얻은 결과와 똑같습니다.