BBED (Block Browser and Editor) 를 활용한

Block Recovery

 

1. BBED 를 통한 Delete 장애 복구

- 데이터가 변경된 block 을 찾아서 수정하는 실습

 

Step 1. 실습용 테이블 생성

No

Name

Price

01

APPLE

100

02

ORANGE

200

 

SQL> create table fruit(no number, name varchar2(10),price varchar2(10))

2 tablespace test1;

 

Table created.

 

SQL> select rowid,no,name,price

2 from fruit;

 

ROWID NO NAME PRICE

------------------ ---------- -------------------- ------------------------

AAACkzAAHAAAAGQAAA 1 APPLE 100

AAACkzAAHAAAAGQAAB 2 ORANGE 200

 

Step 2. Rowed 로 위 데이터가 들어있는 블록 주소 찾기

 

SQL> select dbms_rowid.rowid_block_number('AAACkzAAHAAAAGQAAA')

2 from fruit;

 

DBMS_ROWID.ROWID_BLOCK_NUMBER('AAACKZAAHAAAAGQAAA')

-----------------------------------------------------------------------------

400

400

 

- 두 건의 데이터 모두 400번 블록에 들어가 있다는 것이 조회 됩니다.

 

- 이제 BBED 로 400번 블록을 확인해 보겠습니다.

BBED> set dba 7,400

DBA 0x01c00190 (29360528 7,400)

 

BBED> show

FILE# 7

BLOCK# 400

OFFSET 342

DBA 0x01c00190 (29360528 7,400)

FILENAME /dev/raw/raw30

BIFILE bifile.bbd

LISTFILE /home/oracle/filelist.log

BLOCKSIZE 8192

MODE Edit

EDIT Unrecoverable

IBASE Dec

OBASE Dec

WIDTH 100

COUNT 50

LOGFILE log.bbd

SPOOL No

 

BBED> find /c APPLE

File: /dev/raw/raw30 (7)

Block: 400 Offsets: 8179 to 8191 Dba:0x01c00190

------------------------------------------------------------------------

4150504c 45033130 300106b0 5e

 

<32 bytes per line>

BBED>

- 이제 ORANGE 도 겁색해 보겠습니다.

BBED> set offset 0

OFFSET 0

BBED> set dba 7.400

BBED-00205: illegal or out of range DBA (File 0, Block 7)

 

BBED> set offset 0

OFFSET 0

 

BBED> set dba 7,400

DBA 0x01c00190 (29360528 7,400)

 

BBED> find /c ORANGE

File: /dev/raw/raw30 (7)

Block: 400 Offsets: 8162 to 8191 Dba:0x01c00190

------------------------------------------------------------------------

4f52414e 47450332 30302c01 0302c102 05415050 4c450331 30300106 b05e

 

<32 bytes per line>

 

BBED> dump /v dba 7,400 offset 8162

File: /dev/raw/raw30 (7)

Block: 400 Offsets: 8162 to 8191 Dba:0x01c00190

-------------------------------------------------------

4f52414e 47450332 30302c01 0302c102 l ORANGE.200,.....

05415050 4c450331 30300106 b05e l .APPLE.100...^

 

<16 bytes per line>

- 위 내용을 보면 offset 8162 에 ORANGE, 8179에 APPLE 이 저장되어 있습니다.

- 또한 find 를 한 후 다시 찾기 위해서는 파일 포인터를 위로 올려주기 위해 set offset 0 으로 포인터를 옮겨 줘야 합니다.(파일시스템을 이해하신다면 무슨 말씀이신지 알 거라고 생각해요)

Step 3. APPLE 를 delete 한 후 commit 수행한 후 block 내용 다시 조회

- 터미널 1 작업 -

SQL> select * from fruit;

 

NO NAME PRICE

---------- -------------------- --------------------

1 APPLE 100

2 ORANGE 200

 

SQL> delete from fruit where no=1;

 

1 row deleted.

 

SQL> commit;

 

Commit complete.

 

SQL> select * from fruit;

 

NO NAME PRICE

---------- -------------------- --------------------

2 ORANGE 200

 

- 터미널 2 작업 -

- 위 작업을 수행 한 후 다른 터미널에서 BBED 를 실행해서 블록을 살펴 봅니다.

BBED> set offset 0

OFFSET 0

 

BBED> find /c APPLE

File: /dev/raw/raw30 (7)

Block: 400 Offsets: 8179 to 8191 Dba:0x01c00190

------------------------------------------------------------------------

4150504c 45033130 300106b0 5e

 

<32 bytes per line>

 

- 다음과 같이 아직 BLOCK 에는 APPLE 데이터가 삭제되지 않고 남아있는 것을 알 수 있습니다.

- 이유 ?

à DML 을 수행하면 오라클은 해당 블록에서 직접 데이터를 지우지 않고 해당 ROW 에 사용하지 않는다는 표시만 수행하기 때문이며 FREESPACE 에는 빈 곳으로 표시 됩니다.

à 이렇게 해당 데이터가 DELETE 되었다는 표시는 해당 ROW 의 Header 부분에 표시됩니다.

Row Header 는 Row flag, lock byte(ITL entry), Column Count 로 구성되는데 제일 먼저 있는 Row flag 부분은 해당 row 의 상태를 표시하는 1byte 로 구성이 됩니다.

 

 

Cluster

Key

Cluster

Table

Member

Head of

Row

Piece

Deleted

First data

piece

Last

Data

Piece

1st

Column

Las

Column

128

64

32

16

8

4

2

1

 

- 위 표의 값들을 계싼해서 Row Header 정보를 분석하면 해당 row 가 어떤 상태인지 알 수 있습니다.

- 일반 테이블에서 특정 row 가 삭제된다면 32 + 16 + 8 + 4 = 60 이 되어 16 진수로 0x3c 값이 됩니다.

- 위 결과를 통해 APPLE 는 offset 8179 에 있었는데 row header 8172 임을 알 수 있으며 row header 의 값이 0x3c 로 delete 된 것을 알 수 있습니다.

- 또 ORANGE 는 OFFSET 8162 에 있으며 ROW HEADER 는 8155 임을 알수 있으며 값이 0x2c로 데이터가 존재한다는 것도 알 수 있습니다.

 

Step 4. BBED 로 복구한 후 조회하기

- 터미널 1 작업 -

- 복구 원리는 8172의 0x3c 값을 0x2c 값으로 변경하고 저장하면 됩니다.

 

BBED> sum dba 7,400

Check value for File 7, Block 400:

current = 0x08d7, required = 0x08c7

 

BBED> sum dba 7,400 apply

Check value for File 7, Block 400:

current = 0x08c7, required = 0x08c7

 

BBED> p *kdbr[0]

rowdata[17]

-----------

ub1 rowdata[17] @8172 0x2c

- 터미널 2 작업 -

 

- 아직 복구 전 값이 나옵니다.

 

SQL> alter tablespace test1 offline;

 

Tablespace altered.

 

SQL> alter tablespace test1 online;

 

Tablespace altered.

 

SQL>

 

 

+ Recent posts