ORACLE 검사 에서 손 상 된 색인(Corrupt Indexes)을 찾 는 방법 에 대한 상세 한 설명

인덱스
색인 은 표 와 마찬가지 로 세그먼트(segment)의 일종 에 속한다.사용자 의 데 이 터 를 저장 하고 있 습 니 다.표 와 마찬가지 로 디스크 공간 을 차지 해 야 합 니 다.색인 은 데이터 시트 의 특정한 데이터 줄 에 직접 접근 할 수 있 는 트 리 구조 로 조회 효율 을 높이 기 위해 도입 되 며 표 에 독립 된 대상 으로 표 와 다른 표 공간 에 저장 할 수 있 습 니 다.색인 기록 에는 색인 키워드 와 지향 표 의 데이터 포인터(주소)가 저장 되 어 있 습 니 다.색인 에 대한 I/O 작업 은 표 에 대한 작업 보다 훨씬 적다.색인 이 만들어 지면 Oracle 시스템 에 의 해 자동 으로 유 지 됩 니 다.검색 어 에 서 는 어떤 색인 을 사용 할 지 지정 하지 않 아 도 됩 니 다.
물리 적 으로 색인 은 일반적으로 파 티 션 과 비 파 티 션 색인,일반적인 B 트 리 색인,비트 맵(bitmap)색인,반전(reverse)색인 등 으로 나 눌 수 있다.그 중에서 B 트 리 색인 은 가장 흔히 볼 수 있 는 색인 에 속한다.
머리말
본 고 는 주로 ORACLE 검사 에서 손 상 된 색인 찾기(Corrupt Indexes)에 관 한 내용 을 소개 하고 참고 학습 을 제공 합 니 다.다음은 더 이상 말씀 드 리 지 않 겠 습 니 다.상세 한 소 개 를 해 보 겠 습 니 다.
Oracle 데이터베이스 에서 손 상 된 색인 을 어떻게 찾 습 니까?다음은 색인 블록 을 손상 시 키 는 사례 를 만 들 기 위해 서 입 니 다.다음 사례 에서 보 듯 이:

SQL> create tablespace test_data 
2 datafile '/u01/app/oracle/oradata/gsp/test_data_01.dbf' 
3 size 200M autoextend off
4 logging
5 segment space management auto
6 extent management local;

Tablespace created.

SQL> create tablespace test_index 
2 datafile '/u01/app/oracle/oradata/gsp/test_idx_01.dbf' 
3 size 200M autoextend off
4 logging
5 segment space management auto
6 extent management local;

Tablespace created.


SQL> create user kerry
2 identified by 123456
3 default tablespace test_data;

User created.

SQL> grant connect to kerry;
SQL> grant resource to kerry;
위 스 크 립 트 는 테이블 공간 을 만 들 고 사용자 kerry 를 만 들 고 권한 을 부여 한 다음 에 kerry 계 정 으로 데이터베이스 에 로그 인하 여 테스트 데 이 터 를 구성 하고 TEST 표 에 색인 IX 를 만 드 는 것 입 니 다.TEST

SQL> show user;
USER is "KERRY"
SQL> 
SQL> CREATE TABLE TEST(ID NUMBER(10), NAME VARCHAR2(64));

Table created.

SQL> DECLARE I NUMBER;
2 BEGIN
3 FOR I IN 1..1000 LOOP
4 INSERT INTO TEST VALUES(I, LPAD('T', 60)); 
5 END LOOP;
6 COMMIT;
7 END;
8 /

PL/SQL procedure successfully completed.


SQL> CREATE INDEX IX_TEST ON KERRY.TEST(NAME) TABLESPACE TEST_INDEX;

Index created.
그리고 아래 스 크 립 트 를 사용 하여 색인 세그먼트 데이터베이스 파일 ID 와 색인 세그먼트 의 첫 번 째 블록 번 호 를 찾 습 니 다.

SQL> show user;
USER is "SYS"
SQL> col segment_name for a32; 
SQL> col header_file for 9999; 
SQL> col header_block for 9999; 
SQL> select segment_name 
2 ,header_file 
3 ,header_block 
4 ,blocks 
5 from dba_segments ds 
6 where ds.owner='KERRY' and ds.segment_name='IX_TEST'; 

SEGMENT_NAME HEADER_FILE HEADER_BLOCK BLOCKS
-------------------------------- ----------- ------------ ----------
IX_TEST 8 130 16

SQL>
나 쁜 블록 을 만 드 는 방법 은 적지 않다(예 를 들 어 BBED 등).여기 서 우 리 는 RMAN 아래 의 명령 clear 를 사용 하여 데이터 블록 을 손 상 된 블록 으로 표시 할 수 있 고 데이터 파일 8 중 130 번 데이터 블록 을 나 쁜 블록 으로 표시 할 수 있다.

[oracle@DB-Server ~]$ rman target /

Recovery Manager: Release 11.2.0.1.0 - Production on Thu Sep 13 17:41:05 2018

Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

connected to target database: GSP (DBID=644393201)

RMAN> recover datafile 8 block 130 clear;

Starting recover at 13-SEP-18
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=12 device type=DISK
Finished recover at 13-SEP-18

RMAN> 
그렇다면 그 방법 으로 색인 이 손상 되 었 는 지 확인 하고 가능 한 지 확인 해 보 자.
1:ANALYZE 를 사용 하여 색인 구 조 를 분석 하고 검증 합 니 다.

[oracle@DB-Server ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Thu Sep 13 17:42:03 2018

Copyright (c) 1982, 2009, Oracle. All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> analyze index kerry.ix_test validate structure;
analyze index kerry.ix_test validate structure
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 8, block # 130)
ORA-01110: data file 8: '/u01/app/oracle/oradata/gsp/test_idx_01.dbf'

위의 캡 처 에서 보 듯 이 색인 이 손상 되면(Corrupt Index)analyze index vaidate structure 를 사용 하면 오류 가 발생 합 니 다.전체 데이터베이스 의 모든 손 상 된 색인(Corrupt Indexes)을 검사 하려 면 다음 스 크 립 트 를 사용 할 수 있 습 니 다.

spool analy_index.sql
SET PAGESIZE 50000;
SELECT
'ANALYZE INDEX ' || OWNER || '.' || INDEX_NAME|| ' VALIDATE STRUCTURE;' FROM DBA_INDEXES;

spool off;

@analy_index.sql
2:시스템 보기 v$database 사용block_손 상 된 색인 보기
다음 과 같이,우 리 는 이 스 크 립 트 를 사용 하여 나 쁜 블록 이 나타 난 색인 을 보 았 는데,이 스 크 립 트 는 나 쁜 블록 색인 을 찾 을 수 없 음 을 발견 하 였 다.

set pagesize 50 linesize 170
col segment_name format a30
col partition_name format a30
SELECT DISTINCT file#, 
segment_name, 
segment_type, 
tablespace_name, 
partition_name 
FROM dba_extents a, 
v$database_block_corruption b 
WHERE a.file_id = b.file# 
AND a.block_id <= b.block# 
AND a.block_id + a.blocks >= b.block#; 

원인 분석 은 다음 과 같 습 니 다.보기 v$databaseblock_corruption 에 나 쁜 블록 기록 이 있 지만 색인 세그먼트 의 첫 번 째 블록 을 나 쁜 블록 으로 표시 한 후 dbaextents 에 이 색인 세그먼트 의 기록 이 없습니다.따라서 이 경우 색인 이 손상 되 어 이 SQL 문 구 는 나 쁜 색인 을 찾 을 수 없습니다.

SQL> SELECT file_id, 
2 segment_name, 
3 segment_type 
4 FROM dba_extents 
5 WHERE file_id = 8 ;

no rows selected

SQL> SELECT file_id, 
2 segment_name, 
3 segment_type 
4 FROM dba_extents 
5 WHERE owner = 'KERRY';

FILE_ID SEGMENT_NAME SEGMENT_TYPE
---------- -------------------------------- ------------------
7 TEST TABLE
7 TEST TABLE

SQL> 
한 단락 의 첫 번 째 구역 의 첫 번 째 블록 은 FIRST LEVEL BITMAP BLOCK 이 고 두 번 째 블록 은 SECOND LEVEL BITMAP BLOCK 이기 때문에 이 두 블록 은 free block 을 관리 하 는 데 쓰 이 고 세 번 째 블록 은 PAGETABLE SEGMENT HEADER 입 니 다.이 블록 이 야 말로 segment 의 HEADER 입 니 다.BLOCK,그 다음 블록 은 데 이 터 를 기록 하 는 데 사 용 됩 니 다.이 지식 에 관 해 서 는 제 블 로그 ORACLE 의 단락 에 관 한 HEADER_BLOCK 에 대한 간단 한 분석 입 니 다. 을 참고 하 실 수 있 습 니 다.우리 의 가장 위의 예 는 첫 번 째 블록 을 나 쁜 블록 으로 구성 하 는 것 이기 때문에 위의 SQL 을 찾 을 수 없습니다.우 리 는 색인 세그먼트 의 데이터 블록 구 조 를 나 쁜 블록 으로 재 구성 합 니 다.예 를 들 어 아래 에 블록 번호 148 명 을 나 쁜 블록 으로 만 듭 니 다.그럼 이 스 크 립 트 는 고장 난 색인 을 찾 을 수 있 습 니 다.따라서 상기 실험 을 종합해 보면 이 스 크 립 트 가 나 쁜 블록 색인 을 찾 는 데 조건 이 있 음 을 알 수 있 습 니 다.색인 세그먼트 가 손 상 된 블록 이 어떤 유형 인지 봐 야 합 니 다.

SQL> SELECT FILE_ID, 
2 BLOCK_ID, 
3 BLOCKS 
FROM DBA_EXTENTS 
4 5 WHERE OWNER ='&OWNER'
6 AND SEGMENT_NAME = '&TABLE_NAME'; 
Enter value for owner: KERRY
old 5: WHERE OWNER ='&OWNER'
new 5: WHERE OWNER ='KERRY'
Enter value for table_name: IX_TEST
old 6: AND SEGMENT_NAME = '&TABLE_NAME'
new 6: AND SEGMENT_NAME = 'IX_TEST'

FILE_ID BLOCK_ID BLOCKS
---------- ---------- ----------
8 144 8
8 152 8

SQL> SELECT HEADER_FILE
2 , HEADER_BLOCK
3 , BYTES
4 , BLOCKS
5 , EXTENTS 
FROM DBA_SEGMENTS 
6 7 WHERE OWNER='&OWNER' AND SEGMENT_NAME='&SEGMENT_NAME';
Enter value for owner: KERRY
Enter value for segment_name: IX_TEST
old 7: WHERE OWNER='&OWNER' AND SEGMENT_NAME='&SEGMENT_NAME'
new 7: WHERE OWNER='KERRY' AND SEGMENT_NAME='IX_TEST'

HEADER_FILE HEADER_BLOCK BYTES BLOCKS EXTENTS
----------- ------------ ---------- ---------- ----------
8 146 131072 16 2

SQL> 

RMAN> recover datafile 8 block 148 clear;

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

좋은 웹페이지 즐겨찾기