본문 바로가기

Oracle

Oracle BBED Utility 사용기

Oracle에는 BBED 유틸리티 (블록 브라우저 및 편집기)라는 유틸리티가 있습니다. 
Oracle7에서 Oracle10g까지 Oracle DB 버전에서 사용되던 유틸리티로 Oracle 11g에서 바이너리 파일이 엔진상 제거되었지만... 
make명령어를 통해 BBED를 사용할 수 있습니다.

 

사용될 make파일은 ins_rdbms.mk로 $ORACLE_HOME/rdbms/lib 디렉토리에 있는데요.
명령어는 아래와 같이 실행하면 됩니다.

 

make -f ins_rdbms.mk BBED=$ORACLE_HOME/bin/BBED $ORACLE_HOME/bin/BBED

internal하게 사용되는 BBED 유틸리티는 Oracle 기술 지원시 데이터 블록 손상 문제를 검색, 진단 (및 복구)하는 데 사용하는데 쓰여왔는데...
솔직히 자주 사용되는 유틸리티는 아니었습니다.
(올해로 12년 넘게 DB엔지니어, DBA, 프로젝트DBA, 운영DBA로 일해왔지만 12년동안 딱 2번 사용했네요.)

첫번째 케이스에서는 Oracle 10g상에서 BBED 유틸리티로 강제로 블록 손상을 시킬 때였습니다.
장애 복구 테스트시에 강제 장애유발시 사용한 셈이죠...
기술세미나 자료를 만들면서 장애 시나리오를 위해 블록 손상을 했었습니다. 

두번째 케이스 역시 기술세미나 준비였는데 
DELETE, TRUNCATE, DROP TABLE을 하고 나서 block상에 존재하는 데이터를 조회하는 테스트였습니다.

쨋든...거의 사용되지 않는 유틸리티지만 그만큼 언급이 잘 안되기 때문에 한번 정도 다뤄보고자 합니다.

테스트를 한 내용을 공유하기에 앞서... 한가지 말씀드립니다.
BBED를 사용할 때는 항상 BROWSE 모드로 사용이 필요합니다.
한번 block이 손상되면 복구가 거의 어렵습니다. 물론 백업이 있다면 손쉽게 복구할 수 있겠지만...사서 고생할 필요는 없으니까요. 
정확하게 데이터와 데이터 작업에 대해 알고 있는 경우에만 BBED EDIT 모드로 사용하세요.

전체적인 순서는 다음과 같습니다.

1. 테스트 전, DB를 종료하고 콜드 백업 수행

2. bbed 커맨드로 유틸 시작(관련 데이터 파일 포함)

3. 데이터 블록 주소 찾기

4. ANALYST 문자열이 시작되는 오프셋을 찾고 데이터와 위치를 확인

5. 데이터 변경

6. 데이터 변경 확인

7. 변경 사항 적용

8. 데이터베이스를 재시작하고 변경 사항을 찾기

 

테스트에 앞서 BBED 유틸리티 사전세팅을 먼저 확인해볼까요?

저는 11g DB엔진상에서 BBED를 사용하기 위해 10g 설치파일을 사용하였습니다.

 

1. 사전작업
1-1. bbed 유틸리티 설치

A. 설치파일에서 필요한 라이브러리 압축파일 확보 및 서버 업로드

unzip -j p8202632_10205_Linux-x86-64.zip \

oracle.rdbms/10.2.0.5.0/1/DataFiles/filegroup48.1.1.jar -d /tmp

 

unzip -j p8202632_10205_Linux-x86-64.zip \

oracle.rdbms.util/10.2.0.5.0/1/DataFiles/filegroup6.1.1.jar -d /tmp

 

unzip -j /tmp/filegroup48.1.1.jar  sbbdpt.o ssbbded.o -d /tmp

unzip -j /tmp/filegroup6.1.1.jar bbedus.ms* -d /tmp

cp /tmp/s*bd*.o $ORACLE_HOME/rdbms/lib

cp /tmp/bbedus.ms* $ORACLE_HOME/rdbms/mesg

->11g에서 사용하기 위해서는 아래 경로에 파일들이 위치해 있어야 함.

$ORACLE_HOME/rdbms/lib/sbbdpt.o 

$ORACLE_HOME/rdbms/lib/ssbbded.o 

$ORACLE_HOME/rdbms/mesg/bbedus.msb

$ORACLE_HOME/rdbms/mesg/bbedus.msg

 

B. bbed 유틸리티 컴파일

make -f $ORACLE_HOME/rdbms/lib/ins_rdbms.mk \   
    BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed

1-2. 신규 테이블스페이스 생성

SQL> CREATE TABLESPACE TT DATAFILE '/data/NEODB/DATA/ttLq01.dbf' SIZE 1024M AUTOEXTEND OFF;

 

1-3. 테스트테이블 생성

SQL> CREATE TABLE NEO.TB_USERLOG(
  USERNAME VARCHAR2(30),
  USERID VARCHAR2(500),
  USERDEPT VARCHAR2(500)
)TABLESPACE TT;

 

1-4. 테스트데이터 입력

SQL> INSERT INTO NEO.TB_USERLOG VALUES ('HONG','DEL1','SU');
SQL> INSERT INTO NEO.TB_USERLOG VALUES ('KIM','DEL2','JB');
SQL> INSERT INTO NEO.TB_USERLOG VALUES ('LEE','DEL3','FI');
SQL> COMMIT;

 

1-5. 각 데이터 로우의 ROWID와 BLOCK_ID 확보

SQL> SELECT USERNAME,ROWID FROM NEO.TB_USERLOG;

USERNAME        ROWID           BLOCK_ID
HONG   AAAweIAARAAAACbAAA        155
KIM     AAAweIAARAAAACbAAB        155
LEE     AAAweIAARAAAACbAAC        155

 

1-6. USERNAME이 'LEE'인 데이터에 대해 DELETE 수행

SQL> DELETE FROM NEO.TB_USERLOG WHERE USERNAME='LEE';
SQL> COMMIT;

 

2. BBED 실행(초기 패스워드: blockedit)

TESTDBSERVER:NEODB-/oracle/bbed] bbed
Password:

BBED: Release 2.0.0.0.0 - Limited Production on Tue Jul 9 11:11:48 2019
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED>

 

2-1. bbed 세팅

BBED> set list fileunix.log'
        LISTFILE        fileunix.log

BBED> info
 File#  Name                                                     Size(blks)
 -----  ----                                                        ----------
     1  /data/NEODB/SYSTEM/system01.dbf               262144
     2  /data/NEODB/SYSTEM/sysaux01.dbf                76800
...

BBED> set dba 17,155
        DBA             0x0440009b (71303323 17,155)

BBED> set filename '/data/NEODB/DATA/tt01.dbf'
        FILENAME        /data/NEODB/DATA/tt01.dbf

BBED> show all
        FILE#           17
        BLOCK#          155
        OFFSET          0
        DBA             0x0440009b (71303323 17,155)
        FILENAME        /data/NEODB/DATA/tt01.dbf
        BIFILE          bifile.bbd
        LISTFILE        fileunix.log
        BLOCKSIZE       8192
        MODE            Browse
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No

2-2. map 커맨드를 활용하여 rowdata의 offset값 확보 (테스트시에는 8142)

BBED> map 
File: /data/NEODB/DATA/tt01.dbf (17)
 Block: 155                                   Dba:0x0440009b
------------------------------------------------------------
 KTB Data Block (Table/Cluster)

 struct kcbh, 20 bytes                      @0

 struct ktbbh, 72 bytes                     @20

 struct kdbh, 14 bytes                      @100

 struct kdbt[1], 4 bytes                    @114

 sb2 kdbr[3]                                @118

 ub1 freespace[8018]                        @124

 ub1 rowdata[46]                            @8142

 ub4 tailchk                                @8188

 

2-3. file_id, block_id, offset 값을 이용하여 dump (deleted data 추출)

BBED> dump /v dba 17,155 offset 8142 count 64
 File: /data/NEODB/DATA/tt01.dbf (17)
 Block: 155     Offsets: 8142 to 8191  Dba:0x0440009b
-------------------------------------------------------
 3c020303 4c454504 44454c33 0246492c l ...LEE.DEL3.FI,
 0003034b 494d0444 454c3202 4a422c00 l ...KIM.DEL2.JB,.
 0304484f 4e470444 454c3102 53550206 l ..HONG.DEL1.SU..
 39d0                                l 9.
 <16 bytes per line>

-> 삭제한 LEE 데이터로우의 헥사코드값이 3c로 공부한 논문에서 나온 헥사값으로 추출되어 나옴.

 

2-4. TABLESPACE MOVE

  SQL> ALTER TABLE NEO.TB_USERLOG MOVE TABLESPACE NEO_DAT;

 

2-5. TABLESPACE MOVE를 하였으나, 해당 데이터 블록에는 여전히 deleted data가 추출되어 나옴.

BBED> dump /v dba 17,155 offset 8142 count 64
 File: /data/NEODB/DATA/tt01.dbf (17)
 Block: 155     Offsets: 8142 to 8191  Dba:0x0440009b
-------------------------------------------------------
 3c020303 4c454504 44454c33 0246492c l <...LEE.DEL3.FI,
 0003034b 494d0444 454c3202 4a422c00 l ...KIM.DEL2.JB,.
 0304484f 4e470444 454c3102 53550206 l ..HONG.DEL1.SU..
 39d0                                l 9.
 <16 bytes per line>

 

3. 초기에 테이블이 저장된 테이블스페이스 삭제

SQL> DROP TABLESPACE TT INCLUDING CONTENTS AND DATAFILES;

 

4. 초기 테이블이 저장된 테이블스페이스를 데이터파일까지 삭제한 후에 확인

BBED> set dba 17,155
BBED-00303: unable to open file '/data/NEODB/DATA/tt01.dbf'

 

테스트를 해본 결과, 

delete를 하거나 REORG 작업(delete 후 move tablespace)를 하여도, 데이터파일이 존재하는 한 BBED 유틸리티로 데이터를 확인하는 것이 가능하였다.

참 잘 만들어진 오라클 DBMS이지만 왠지 11g부터 BBED 바이너리를 연결시키지 않은 이유를 알 것 같기도 하다.

블록 편집과 검색이 가능하지만 잘못 악용되면 해커들에게 좋은 툴이 될 수도 있겠다는...? 그런 이유 말이다.

 

다음에는 또 어떤 테스트를 해볼까..