문서유형ㅣ기술정보
분야ㅣ모니터링/점검
적용제품버전ㅣ 6FS07, 6FS07PS, 7FS02, 7FS02PS
문서번호ㅣTMOTI065
개요
DBA 값으로 Dump 필요 시 현장에서 사용한 방법 가이드
- 내용 : DBA 값은 32bit 길이의 정수 값이기 때문에 현장에서 dump 대상을 찾을 때 계산이 필요하며 현장에서 할 수 있는 비교적 간단한 방법에 대해 가이드합니다.
- 환경 : bash shell 환경 / 윈도우 계산시 사용 가능한 환경
방법
DBA의 구조
DBA는 32bit 길이의 숫자로 Data Block의 Address를 저장
- 상위 10bit : Datafile의 번호를 저장
- 하위 22bit : Datafile의 블럭을 저장
- 따라서 DBA를 보고 Datablock dump를 수행하려면 상위 10bit와 하위 22bit를 10진수로 바꾸는 과정 이 필요합니다.
사이트에서 가용한 DBA 계산 방법
DBA는 32bit 길이의 숫자로 Data Block의 Address를 저장
- 상위 10bit : Datafile의 번호를 저장
- 하위 22bit : Datafile의 블럭을 저장
DBA로 block dump 대상을 찾는 케이스 예시
- callstack이나 로그에서 dba 정보가 뭔치 찾고 싶은 경우입니다.
- 해당 케이스는 callstack 에 나온 shdrdba=2805990134 의 블럭 덤프를 얻고 싶은 경우입니다.
Thread 19 (Thread 0x2b5abe847700 (LWP 44731)):
#0 0x00000000018c99a8 in spin_lock_internal (lock=0x2aab4a6215b0, level_check=level_check@entry=SPIN_LEVEL_CHECK_MIN)
at /home/chef/workspace/Build_centos_7-2/tibero6/src/tbsvr/spinlock/spinlock.c:652
#1 0x00000000019a02c1 in tc_sgmtstat_local_add_stat_value (sgmt_id=4294967295, stat_type=stat_type@entry=TC_SGMTSTAT_LOGICALRD, inc_value=inc_value@entry=1)
at /home/chef/workspace/Build_centos_7-2/tibero6/src/tbsvr/tc/tc_stat.c:737
#2 0x0000000001c78d68 in txblk_get_cdba_lvl_splitcnt (buf=buf@entry=0x2abb3ed174e0, key=key@entry=0x2b5abe845dd0, lvl=lvl@entry=0x2b5abe845c00 "\003", splitcnt=splitcnt@entry=0x2b5abe845c10 "\004\210\251\215\002", prefetch_cnt=prefetch_cnt@entry=0x2b5abe845c40 "")
at /home/chef/workspace/Build_centos_7-2/tibero6/src/tbsvr/tx/tx_cr.c:492
#3 0x0000000001a7ebb4 in td_isgmt_get_buf_in_lvl_internal (ts_id=<optimized out>, shdrdba=2805990134, key=key@entry=0x2b5abe845dd0, lvl=lvl@entry=0 '\000', lock=lock@entry=BL_EXL, use=use@entry=BU_RB, sgmt_id=sgmt_id@entry=4294967295, bufpool=bufpool@entry=0 '\000', rio=rio@entry=0x0)
at /home/chef/workspace/Build_centos_7-2/tibero6/src/tbsvr/td/td_isgmt.c:400
계산 방법 - 개요
- bit shift 연산자를 이용하면 상위 10 bit의 10진수를 쉽게 얻을 수 있고 원래값에서 이 값을 빼면 하위
22bit(블럭 번호) 를 얻을 수 있다
- DBA >> 22 결과 : file#
- DBA - ( (DBA >> 22) << 22) : block number
계산 방법 - shell 이용
- 아래와 같이 shell 이용 (2805990134 예시로)
- file# 669 Block# 758 을 얻게 된다
#순서대로 수행 시
#1. 22 right shift로 하위 22 bit를 지우고 상위 10 bit만 남긴 10진수 획득. file #을 얻을수 있다
tibero@TDB:/home/tibero$ echo $((2805990134 >> 22))
669
#2. #1에서 얻은 값을 다시 22 left shift 해서 22 bit를 0으 채운 10 진수 획득
tibero@TDB:/home/tibero$ echo $((669 << 22))
2805989376
#3. 원래 값에서 #2에서 얻은 값을 빼면 하위 22bit의 10진수만 남게 되며 block number이다
tibero@TDB:/home/tibero$ echo $((2805990134 - 2805989376))
758
# file#=669 , block number=758 이 나오게 된다
#아래와 같이 한번에 수행도 가능
tibero@TDB:/mnt/e$ export DBA=2805990134
tibero@TDB:/mnt/e$ echo $(($DBA >> 22))
669
tibero@TDB:/mnt/e$ echo $(($DBA - (($DBA >> 22) << 22)))
758계산 방법 - 윈도우 계산기 사용
- 윈도우 계산기의 프로그래머 모드 사용 시 연산이 가능합니다.
- 메뉴에서 프로그래머 모드 변경
- DBA 값을 입력 하고 >> 키 입력 후 22 입력 시 파일 번호를 얻을 수 있습니다.
- file#을 메모장 등에 별도 저장 후 << 22 를 재수행합니다.
- 위의 값에서 - 수행 후 원래 DBA 값을 입력하면 - 블럭번호를 얻을 수 있습니다.
- 해당 방식으로 file# 669 Block# 758 을 얻게 됩니다.
계산 값으로 block dump 수행
block dump 명령어는 두가지 형태로 수행이 가능하며, 둘이 차이가 있음에 유의합니다.
- ALTER SYSTEM DUMP DATAFILE <file_name> BLOCK <block number>
filename을 select file_name from v$datafile where file#=<file#> 으로 찾아야 합니다.
- ALTER SYSTEM DUMP DATAFILE <file#> BLOCK <block number>
캐시에 올라온 블록을 기준으로 덤프 수행 할 수도 있어서 위와 다른 결과가 나올 수 있습니다.