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