ORACLE 중간 HEADERBLOCK 예시 상세 분석
10505 단어 Oacle세그먼트header block
세그먼트(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 의 블록 은 첫 번 째 구간 의 첫 번 째 블록 이 아니다.이것 도 내 가 실험 에서 오랫동안 고민 한 곳 이다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바 작업 은 Clob 또는 NClob 데이터 형식의 저장 프로 세 스 인 스 턴 스 를 포함 합 니 다.텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.