ORACLE 중간 HEADERBLOCK 예시 상세 분석

머리말
세그먼트(segment)는 데이터베이스 에서 물리 적 저장 공간 을 소모 하 는 모든 실체(한 세그먼트 는 여러 데이터 파일 에 존재 할 수 있 습 니 다.물리 적 데이터 파일 때 문 입 니 다.
논리 표 공간 을 구성 하 는 기본 물리 적 저장 단위)
최근 학습 세그먼트(segment),구간(extent)에서 세그먼트 에 대한 HEADERBLOCK 에 의문 이 있 습 니 다.본 고 는 탐구 의 실험 과정 과 관련 된 정 리 를 기록 하고 잘못된 부분 이 있 으 면 지적 해 주 십시오.SCOTT.EMP 표를 예 로 들 면(아래 테스트 환경 은 Oracle Database 10g Release 10.2.0.5.0-64bit Production):

SELECT FILE_ID, 
  BLOCK_ID, 
  BLOCKS 
FROM DBA_EXTENTS 
WHERE OWNER ='&OWNER'
  AND SEGMENT_NAME = '&TABLE_NAME'; 
 

SELECT HEADER_FILE
  , HEADER_BLOCK
  , BYTES
  , BLOCKS
  , EXTENTS 
FROM DBA_SEGMENTS 
WHERE OWNER='&OWNER' AND SEGMENT_NAME='&SEGMENT_NAME';

위 와 같이 DBASEGMENTS 의 HEADERBLOCK 와 DBAEXTENTS 의 BLOCKID 가 다 름(HEADERBLOCK:파일 ID 4 의 27 번 째 블록,구간 의 첫 번 째 블록 인 BLOCKID 는 25 번 째 블록 입 니 다)이 이 유 는 다음 과 같 습 니 다.
하나의 segment 의 첫 번 째 구역 의 첫 번 째 블록 은 FIRST LEVEL BITMAP BLOCK 이 고 두 번 째 블록 은 SECOND LEVEL BITMAP BLOCK 입 니 다.이 두 블록 은 free block 을 관리 하 는 데 사 용 됩 니 다.세 번 째 블록 은 PAGETABLE SEGMENT HEADER 입 니 다.이 블록 이 야 말로 segment 의 HEADER 입 니 다.BLOCK,그 다음 블록 은 데 이 터 를 기록 하 는 데 사 용 됩 니 다.그래서 25+2=27.이 책의 제5 장 을 상세 하 게 참고 할 수 있다.
다음 에 우 리 는 표를 만들어 서 이 규칙 인지 아 닌 지 를 테스트 합 니 다.다음 과 같 습 니 다.

SQL> CREATE TABLE TEST1.MMM 
 2 AS
 3 SELECT * FROM DBA_OBJECTS;
 
Table created.
 
SQL> COL SEGMENT_NAME FOR A32;
SQL> SELECT SEGMENT_NAME
 2   ,FILE_ID
 3   ,BLOCK_ID
 4   ,BLOCKS
 5 FROM DBA_EXTENTS 
 6 WHERE SEGMENT_NAME='MMM' AND OWNER='TEST1'
 7 ORDER BY BLOCK_ID ASC;
 
SEGMENT_NAME      FILE_ID BLOCK_ID  BLOCKS
-------------------------------- ---------- ---------- ----------
MMM          76   9   8
MMM          76   17   8
MMM          76   25   8
MMM          76   33   8
MMM          76   41   8
MMM          76   49   8
MMM          76   57   8
MMM          76   65   8
MMM          76   73   8
MMM          76   81   8
MMM          76   89   8
 
SEGMENT_NAME      FILE_ID BLOCK_ID  BLOCKS
-------------------------------- ---------- ---------- ----------
MMM          76   97   8
MMM          76  105   8
MMM          76  113   8
MMM          76  121   8
MMM          76  129   8
MMM          76  137  128
MMM          76  265  128
MMM          76  393  128
MMM          76  521  128
MMM          76  649  128
MMM          76  777  128
 
22 rows selected.
 
SQL> SELECT HEADER_FILE
 2  , HEADER_BLOCK
 3  , BYTES
 4  , BLOCKS
 5  , EXTENTS 
 6 FROM DBA_SEGMENTS 
 7 WHERE OWNER='TEST1' AND SEGMENT_NAME='MMM';
 
HEADER_FILE HEADER_BLOCK  BYTES  BLOCKS EXTENTS
----------- ------------ ---------- ---------- ----------
   76   11 7340032  896   22
위 와 같이 세그먼트 대상 TEST 1.MMM 의 headerblock 은 11 이 고 대응 하 는 구간 의 첫 번 째 블록 대상 ID 는 9 이 며 9+2=11 입 니 다.그 렇 군요.그러면 DUMP 데이터 블록 을 살 펴 보 겠 습 니 다.다음 과 같 습 니 다.

SQL> alter system dump datafile 76 block 9;
 
System altered.
 
SQL> alter system dump datafile 76 block 10;
 
System altered.
 
SQL> alter system dump datafile 76 block 11;
 
System altered.
 
SQL> select user_dump.value 
 2   || '/' 
 3   || lower(instance.value) 
 4   || '_ora_' 
 5   || v$process.spid 
 6   || nvl2(v$process.traceid, '_' 
 7         || v$process.traceid, null) 
 8   || '.trc'"trace file" 
 9 from v$parameter user_dump 
 10   cross join v$parameter instance 
 11   cross join v$process 
 12   join v$session 
 13   on v$process.addr = v$session.paddr 
 14 where user_dump.name = 'user_dump_dest' 
 15   and instance.name = 'instance_name' 
 16   and v$session.audsid = sys_context('userenv', 'sessionid'); 
 
trace file
--------------------------------------------------------------------------------
/u01/app/oracle/admin/SCM2/udump/scm2_ora_22642.trc
첫 번 째 구역 의 첫 번 째 블록(Blockid=9)는 FIRST LEVEL BITMAP BLOCK,두 번 째 블록(Blockid=10)는 SECOND LEVEL BITMAP BLOCK 입 니 다.이 두 블록 은 free block 을 관리 하 는 데 사용 되 고 세 번 째 블록(blockid=11)는 PAGETABLE SEGMENT HEADER 입 니 다.이 블록 이 야 말로 segment 의 HEADER 입 니 다.BLOCK,뒤에 있 는 블록 은 데 이 터 를 기록 하 는 데 쓰 인 다.



그런데 이상 한 현상 이 있 습 니 다.SCOTT.EMP 의 데이터 블록 에 dump 를 한 결과 25,26,27 데이터 블록 의 type 은 모두 trans data 이 고 0x 06 이 표시 하 는 Block Type 은 Table/luster/index segment data block 입 니 다.SCOTT.EMP 대상 이 USERS 표 공간 에 있어 서 그런 지 모 르 겠 습 니 다.하지만 USER 표 공간 도 ASSM 에서 관리 하고 있 습 니 다.구체 적 인 상황 은 아직 명확 하지 않 습 니까?

SQL> SELECT TABLESPACE_NAME
 2  , SEGMENT_SPACE_MANAGEMENT
 3  , ALLOCATION_TYPE
 4  , EXTENT_MANAGEMENT
 5 FROM DBA_TABLESPACES
 6 WHERE TABLESPACE_NAME='USERS';
 
TABLESPACE_NAME    SEGMEN ALLOCATIO EXTENT_MAN
------------------------------ ------ --------- ----------
USERS       AUTO SYSTEM LOCAL
그럼 모든 HEADERBLOCK 이 세 번 째 블록 인 데?세그먼트 공간 관리 방식 과 도 관련 이 있 습 니까?우 리 는 다음 과 같은 실험 을 통 해 수공 공간 관리(Manual Segment Space Management)의 표 공간 을 만 듭 니 다.

SQL> CREATE TABLESPACE TBS_TEST_DATA
 2 DATAFILE '/u03/oradata/gsp/tbs_test_data_001.dbf'
 3 SIZE 20M 
 4 EXTENT MANAGEMENT LOCAL AUTOALLOCATE
 5 SEGMENT SPACE MANAGEMENT MANUAL ONLINE;
 
Tablespace created.
 
 
SQL> create user test identified by test123456
 2 default tablespace tbs_test_data;
 
User created.
 
SQL> grant connect, resource to test;
 
Grant succeeded.
 
SQL> CREATE TABLE TEST.KKK 
 2 AS
 3 SELECT * FROM DBA_OBJECTS;
 
Table created.
 
SQL> COL SEGMENT_NAME FOR A32;
SQL> SELECT SEGMENT_NAME
 2  ,FILE_ID
 3  ,BLOCK_ID
 4  ,BLOCKS
 5 FROM DBA_EXTENTS 
 6 WHERE SEGMENT_NAME='KKK' AND OWNER='TEST'
 7 ORDER BY BLOCK_ID ASC;
 
SEGMENT_NAME      FILE_ID BLOCK_ID  BLOCKS
-------------------------------- ---------- ---------- ----------
KKK          39  427785  128
KKK          43  435249   8
KKK          43  435257   8
KKK          43  435265   8
KKK          43  435273   8
KKK          43  435281   8
KKK          43  435289   8
KKK          43  435297   8
KKK          43  435305   8
KKK          43  435313   8
KKK          43  435321   8
 
SEGMENT_NAME      FILE_ID BLOCK_ID  BLOCKS
-------------------------------- ---------- ---------- ----------
KKK          43  435329   8
KKK          48  436745   8
KKK          48  436753   8
KKK          48  436761   8
KKK          48  436769   8
KKK          48  436777   8
KKK          48  436873  128
KKK          40  444297  128
KKK          43  447241  128
KKK          52  449545  128
KKK          2  458249  128
 
22 rows selected.
 
SQL> SELECT HEADER_FILE
 2  , HEADER_BLOCK
 3  , BYTES
 4  , BLOCKS
 5  , EXTENTS 
 6 FROM DBA_SEGMENTS 
 7 WHERE OWNER='TEST' AND SEGMENT_NAME='KKK';
 
HEADER_FILE HEADER_BLOCK  BYTES  BLOCKS EXTENTS
----------- ------------ ---------- ---------- ----------
   43  435249 7340032  896   22
 
SQL> 
 

SQL> alter system dump datafile 43 block 435249;
 
System altered.
 
SQL> select user_dump.value 
 2   || '/' 
 3   || lower(instance.value) 
 4   || '_ora_' 
 5   || v$process.spid 
 6   || nvl2(v$process.traceid, '_' 
 7         || v$process.traceid, null) 
 8   || '.trc'"trace file" 
 9 from v$parameter user_dump 
 10   cross join v$parameter instance 
 11   cross join v$process 
 12   join v$session 
 13   on v$process.addr = v$session.paddr 
 14 where user_dump.name = 'user_dump_dest' 
 15   and instance.name = 'instance_name' 
 16   and v$session.audsid = sys_context('userenv', 'sessionid'); 
 
trace file
--------------------------------------------------------------------
/u01/app/oracle/admin/SCM2/udump/scm2_ora_27792.trc
다음 과 같이 블록 유형 은 DATA SEGEMENT HEADER-UNLIMITED,rdba:(segment header 의 블록 주 소 는)0x0Ac6a 431 입 니 다.사실 이것 은 첫 번 째 블록(Block 이 아 닙 니 다.id 크기 로 볼 때)수 동 세그먼트 공간 관리 로 인해 이러한 기술 의 구체 적 인 실현 방식 은 세그먼트 헤드(Segment Header)에서 자유 목록(freelist)을 분배 하여 Block 의 사용 을 관리 하 는 것 입 니 다.간단하게 자유 목록 을 데이터 구조의 링크 와 같은 데이터 구조 로 상상 할 수 있 습 니 다.ORACLE 는 일련의 알고리즘 을 통 해 자유 목록(freelist)에 Block 을 추가 하거나 이동 하여 세그먼트 관 리 를 실현 할 수 있 습 니 다.

Segment Header 는 Segment 의 첫 번 째 extent 의 머리 조각(첫 번 째 조각)입 니 다.FLM 이 관리 하 는 Segment 에서 header block 은 항상 segment 의 첫 번 째 블록 입 니 다.아래 와 같이 Extent Map 에서 첫 번 째 구간 의 주 소 는 0 x0 ac6a 432 이 고 마침 segment header 의 블록 주소 0 x0 ac6a 431 과 차이 가 1 이다.이것 은 뒤의 분 배 는 segment header 에 바짝 붙 어 있 는 블록 주소 임 을 의미한다.그래서 수 동 공간 관리(Manual Segment Space Management)의 표 공간 에 서 는 Blockid 의 크기 순 서 는 구간 분배 순 서 를 봅 니 다.그 러 니까 FILEID=39 BLOCK_ID=427785 의 블록 은 첫 번 째 구간 의 첫 번 째 블록 이 아니다.이것 도 내 가 실험 에서 오랫동안 고민 한 곳 이다.

총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기