컴퓨터활용/티맥스

xa_NULL trc 파일

멜번초이 2021. 3. 24. 17:20

티맥스가 DBMS 와 거래할 때의 로그가 보관되는 곳이 xa_NULL 파일이다. 엄밀히 말하면 오라클의 클라이언트 모듈이 남기는 파일이다. (티맥스나 턱시도 같은 미들웨어가 남기는 것이 아님) 모든 거래의 로그를 남기게 되므로 용량이 무지막지하게 크기도 하지만 장애가 났을 때는 중요한 근거 자료가 된다.

xa_NULL 파일은 다음과 같이 생겼다.

102946.40932.0:
xaocommit: xid=0x1-02c00000038a7126-0000001, rmid=0, flags=0x0

102946.40932.0:
xaocommit: rtn 0

보통 파일명은 xa_NULL03252021.tr c 와 같이 중간에 일자가 들어간다. 이 파일구성은 거래시각, 처리 프로세스의 ID가 먼저 나오고 그 다음 라인에 처리결과가 나온다. 파일을 grep 등으로 분석할 때 두 라인으로 나눠져 있어 가늠하기 불편하다. 시각과 pid, 처리결과가 한 라인에 나온다면 보기 편할 것이다.
쉘을 작성하여 두 라인을 한 라인으로 합쳐보기로 했다.
라인 끝에 있는 줄바꿈문자(\n)를 없애주기 위해서 sed 를 사용한다. N; 를 주면 그 다음라인까지를 하나의 라인으로 인식하여 처리될 수 있기 때문에 첫번째 라인 끝에 있는 \n 문자는 문장의 가운데로 들어가게 되므로 치환이 가능해 지게 된다. 0: 뒤에 있는 \n 만 제거하는 게 목적이다.
처음 시작할 때 글자가 없는 라인은 제거한다.
문제는 규칙적으로 두 라인으로 구성되어야 하는데 중간에 다른 라인이 하나씩 들어가기도 해서 규칙이 어긋날 수가 있게 된다. 그렇기 때문에 결과파일에 한줄씩 삽입하여 밀어내리면서 재반복 처리를 돌린다. 숫자(시각)으로 시작되지 않는 라인이 하나도 없을 때까지 반복해서 돌리는 개념이다.

#!/usr/bin/ksh

if [ $# -eq 0 ];then
echo "xa_NULL 파일명을 입력하세요"
exit
fi

egrep "0:$|^xa|^ORA" $1 | egrep -v Oracle_XA | sed -e '{N;s/0:\n/0: /}' > $1.refine
CNT=`grep ^[a-Z] $1.refine | wc -l`
loop_cnt=1
while (true)
do
echo "try $loop_cnt with $CNT"
((loop_cnt=$loop_cnt+1))
echo " deletethisline" >$1.tmp # 임시라인 추가
cat $1.refine >>$1.tmp
sed -e '{N;s/0:\n/0: /}' $1.tmp >$1.refine
CNT=`grep ^[a-Z] $1.refine | wc -l`
if [ $CNT -eq 0 ];then
egrep -v " deletethisline" $1.refine > $1.tmp # 임시라인제거
mv $1.tmp $1.refine
fi
done

그럼 이제 결과가 아래와 같이 이쁘게 나온다.