1. DBMS_REPAIR Package 를 이용한 Data Block Recovery
2. DBMS_REPAIR Package 를 이용한 Index Block Recovery

DBMS_REPAIR Package 를 이용한 Block Recovery

 

- DBMS_REPAIR Package? -

à 오라클 8i 버전부터 등장한 Block Corruption 을 발견하고 복구하는 패키지

이 패키지는 Table Block 과 Index Block 을 조사하여 문제가 있는 Block 을 수정해주는 Data corruption repair 패키지를 가지고 있으며 sys 계정으로 작업해야 합니다.

à Corrupted block 을 recover 해주는 것이 아닌 mark 작업만을 수행하여 해당 블록을 Access 하는 것을 막아 줌으로서 전체 Data file 을 사용가능 하게 해주는 것입니다.

 

- DBMS_REPAIR 의 제약 사항 및 한계점 -

à LOB 나 Cluster Index 는 지원하지 않습니다.

à DUMP_ORPHAN_KEYS 프로시저는 Bitmap Index, Function-Based Index 는 지원하지 않으며 3,950 bytes 이상은 지원하지 못합니다.

 

- DBMS_REPAIR 설정-

à Block Corruption 찾아내기

- 관련 패키지 (CHECK_OBJECT, FIX_CORRUPT_BLOCK)

- 위 패키지들을 사용하려면 ADMIN_TABLE 이 실행 되어야 합니다.

à REPAIR_TABLE 생성

SQL>conn / as sysdba;

Connected.

SQL> begin

2 dbms_repair.admin_tables(

3 table_name => 'REPAIR_TABLE',

4 table_type => dbms_repair.repair_table,

5 action => dbms_repair.create_action,

6 tablespace => 'USERS');

7 end;

8 /

 

PL/SQL procedure successfully completed.

 

- repair_table or dba_repair_table 모두 사용 가능합니다.

 

à Orphan-key-table 찾아내기

- 장애 난 테이블과 관련 있는 다른 Object 를 저장하는 Table : 관련 인덱스나 FK 등의 정보를 저장하는 곳.

- 테이블 검사를 하다가 관련있는 인덱스 등이 문제가 있을 수 있기 때문에 미리 생성해 둡니다.

SQL>

1 begin

2 dbms_repair.admin_tables(

3 table_name => 'ORPHAN_KEY_TABLE',

4 table_type => dbms_repair.orphan_table,

5 action => dbms_repair.create_action,

6 tablespace => 'USERS');

7* end;

PL/SQL procedure successfully completed.

 

à DB_Block_checking = true;

- 모든 블록을 체크하기 위한 파라미터

- Overhead 가 발생할 수 있음

- False 일 경우 System Tablespace 만 체크하고 나머지는 Skip 함

-alter system set dba_block_checking=true scope=spfile;

 

- DBMS_REPAIR 실행-

Step 1. db_blcok_checking=true 설정한 후 재 시작 수행

SQL>show parameter db_block_checking;

SQL>alter system set db_blcok_checking=true;

 

Step 2. Block Corruption 발생

- Test 용 Tablespace 생성

- Test1 을 생성합니다.

 

- test1 Tablespace 에 Table 생성 후 데이터를 입력 합니다.

 

- Raw Device 기반이기 때문에 offline 시킨 후 dd 명령어로 복사를 수행했습니다.

- 사용자 환경에 맞게 복사해 주세요

- WinSCP 란 어플리케이션을 이용하여 Windows 로 파일을 복사합니다.

- 이는 파일을 수정하기 위해 Windows 용 프로그램을 사용하기 위해서 그런 것 입니다. RHEL 용 프로그램으로 수정하셔도 상관 없습니다.

- 저는 Ultra Editor 를 사용하여 다음의 ASCII 코드를 찾아 다음의 16진수 메모리를 수정해 줬습니다.

 

 

- 그리곤 다시 원래 경로로 복사

 

- Test1 Tablespace 를 온라인 시키려 하니 복구가 필요하다고 나옵니다.

SQL>Recover tablespace test1;

SQL>alter tablespace test1 online;

- 그리곤 scott.tt910 테이블 데이터들을 조회하려고 하니 Block Corruption 이 발생했다고 나옵니다.

 

 

 

Step 3. DBMS_REPAIR 를 사용하여 에러를 찾습니다.

 

- 위 화면에서 장애 블록을 찾은 것을 확인 할 수 있습니다.

 

- 장애 블록에 대한 자세한 정보를 알아보기 위해서 다음과 같은 쿼리를 수행합니다.

 

 

Step 4. Corrupt 된 블록을 Fix 하겠습니다.

- 이 부분은 corrupt 된 블록을 찾아서 corrupt 되었다고 marking 하는 부분인데 check_object 부분에서 자동으로 해서 다시 안 하셔도 상관 없습니다.

SQL> set serveroutput on

SQL> declare n_fix int;

2 begin

3 n_fix:=0;

4 dbms_repair.fix_corrupt_blocks (

5 schema_name => 'SCOTT',

6 object_name => 'TT910',

7 object_type => dbms_repair.table_object,

8 repair_table_name => 'REPAIR_TABLE',

9 fix_count => n_fix);

10 dbms_output.put_line('fix_count:'||to_char(n_fix));

11 end;

12 /

fix_count:0 ß check_object 부분에서 해서 여기서는 0으로 나옵니다.

PL/SQL procedure successfully completed.

 

Fix 를 한다는 것은 해당 블록에 Corruption 이 발생하여 사용 못하니 더 이상 읽지도 쓰지도 말라는 표시를 한다는 뜻 입니다. 즉 블록 안에 있는 데이터를 복구하는 것이 아닌 Marking 작업만 수행한다는 뜻입니다.

Fix 를 하고 난 후에 해당 테이블에 Select 를 수행 하겠습니다.

- 여전히 해당 블록에 문제가 있다고 나오고 select 가 정상적으로 수행이 안됩니다. 이는 데이터 파일에 수많은 블록에 데이터가 들어있다고 가정 할 경우 1개의 block 에 corrupt 가 발생할 경우 전체 데이터를 읽어 오지 못하는 상황이 된다는 뜻입니다. 나머지 Data 를 살리기 위해서 다음의 작업을 수행 하시면 됩니다.

 

Step 5. Corrupt 된 Block 을 Skip 하도록 설정

1 begin

2 dbms_repair.skip_corrupt_blocks (

3 schema_name => 'SCOTT',

4 object_name => 'TT910',

5 object_type => dbms_repair.table_object,

6 flags => dbms_repair.skip_flag);

7* end;

PL/SQL procedure successfully completed.

SQL>

 

정상적으로 Select 가 수행 되는 것을 알 수 있지만 Block 에 존재했던 Data는 사라진 것을 알 수 있습니다.

- Skip corrupt 설정된 것을 확인하기 위해서는 아래의 쿼리를 수행하시면 됩니다.

DBVerify 실행하기

 

1. 특정 파일 검사하기

- Raw Device

$dbv file=/dev/raw/raw28

- ASM

$dbv file=/home/oracle/oradata/testdb/example.dbf

- 의미

Total Pages Examined : 6400

Total Pages Processed (Data) : 10

Total Pages Failing (Data) : 0

Total Pages Processed (Index): 0

Total Pages Failing (Index): 0

Total Pages Processed (Other): 14

Total Pages Processed (Seg) : 0

Total Pages Failing (Seg) : 0

Total Pages Empty : 6376

Total Pages Marked Corrupt : 0

Total Pages Influx : 0

 

Highest block SCN :

테스트 한 총 블록의 개수

테스트 한 총 테이블 블록 개수

문제가 있는 블록 개수

테이블이나 인덱스 블록 개수

문제가 있는 블록 개수

테이블이나 인덱스 외 다른 블록 개수

 

 

비어있는 블록 개수

문제가 있어서 Corrupt Marked 된 수

다른 사용자가 먼저 데이터 변경이 일어나 DBV를 하기위해 다시 읽은 블록 수

 

2. 특정 세그먼트만 검사하기

SQL> select sum(bytes)/1024/1024 as MB from dba_segments

2 where segment_name='TT70';

SQL> select t.ts#,s.header_file,s.header_block

2 from v$tablespace t,dba_segments s

3 where s.segment_name='TT70'

4 and t.name=s.tablespace_name;

SQL> !dbv userid=system/oracle segment_id=5.5.11

- 이를 이용하면 특정 Table 만 점검 할 수 있어 시간을 절약할 수 있습니다.

 

3. DML 도중 강제 OFFLINE 된 DATA FILE 점검하기

- session 1 à 특정 테이블을 업데이트 수행

- session 2 à 업데이트 수행중인 테이블 스페이스를 강제로 offline 시킴

- 해당 데이터파일과 해당 Segment 를 DBV 로 검사하기

 

 

 

 

터미널 1

 

터미널2

 

 

 

- Offline 된 것을 확인 할 수 있습니다.

 

- DBV 로 파일을 검사하면 이상이 없다고 나옵니다.

 

- 특정 세그먼트를 검사하려 하지만 offline 이기 때문에 오류가 발생하는 것을 확인 할 수 있습니다.

 

 

테이블스페이스를 복구 한 후 온라인 시킵니다.

- 다음을 통해서 알 수 있는 것은 분명히 Data file 에 문제가 발생하여 복구가 필요한 경우 였지만 DBV 로는 확인을 할 수 없었던 점 입니다. DBV 는 Block 에 직접적인 문제가 없는 경우에는 문제점을 찾지 못하는 경우도 발생 합니다.

RAC 복구 (Redo log file 전체 손상)

 

Case :

- Redo log file 전체 손상

- Archive log mode

- Begin Backup 존재

 

작업 순서

  1. 모든 노드에서 DB 정상 종료 후 Begin Backup 수행
  2. DB Open 후 Test 용 데이터 생성
  3. 장애 발생 후 Shutdown immediate 로 정상 종료
  4. Backup File 복원
  5. Archive file 복사
  6. 복구 수 resetlogs 로 DB open

 

Step 1. Begin Backup 수행

SQL> alter tablespace system begin backup;

SQL> !dd if=/dev/raw/raw6 of=/data/backup/open/raw6_system bs=8k

SQL> alter tablespace system end backup;

 

Step 2. DB Open 후 Test용 데이터 생성

- 데이터 삽입 후 commit 그리고 Switch 발생

 

-다시 데어터 삽입 후 commit 하지만 Switch 를 발생 안시킵니다.

 

 

Step 3 이제 redo log file 에 장애를 발생 시키겠습니다.

그리곤 정상 종료

SQL>shutdown immediate;

- 강제 종료 됩니다.

Stet 4. 백업 Data 파일 복원(open/close 상관 없음)

 

Step 5. Archive File 복사

- Archive 파일이 대단히 많아야 정상이지만 Backup 을 받은 후 Archive 파일을 정리 해준 것 같다.

 

Step 6. 복구 후 resetlogs 로 Open

 

- 3 을 제외한 나머지는 복구 완료 되었습니다.

- 당연한 얘기지만 log switch 가 발생되지 못했고 shutdown immediate 를 하여 정상 종료를 시도 했지만 terminated 되었기 때문에 archive log 파일이 생성되지 못했던 데이터에 대해서는 복구가 되질 않았습니다.

 

RAC (Archive mode 에서 장애 복구)

 

Case :

- Offline 안되는 테이블 스페이스 장애 발생 (Archive 파일이 필요한 경우) – system tablespace

- Backup 파일 존재

 

- 장애 발생 상황

- tt03 테이블을 system 테이블스페이스에 생성 후 Data를 입력 합니다.

- 데이터를 insert 한 후 log switch 를 발생 시킵니다.

- /dev/zero 파일로 덮어 씌웁니다.

- 잠시 후 인스턴스가 강제 종료되는 것을 alert log 를 통해 확인 할 수 있습니다.

- 복구

1. 클러스터를 확인하면 오류로 인해 강제 종룔 된 것을 확인 할 수 있습니다.

$crs_stat -t.

2. 노드 2 에서 아카이브 파일을 복사해 옵니다.

3. 복구를 수행합니다.

SQL>recover database;

- auto

SQL>alter database open;

- 양 쪽 노드 모두 Open 시킨 후 확인 합니다.

'Oracle > Backup&Recover' 카테고리의 다른 글

DBVerify 실행하기  (0) 2011.10.19
RAC 복구 (Redo log file 전체 손상)  (0) 2011.10.19
RAC (Archive mode 에서 장애 복구 2)  (0) 2011.10.18
RAC (Archive mode 에서 장애 복구 1)  (0) 2011.10.18
Raw Device 백업(Cold backup)  (0) 2011.10.18

RAC (Archive mode 에서 장애 복구 2)

 

Case :

- Offline 되는 테이블 스페이스 장애 발생 (Archive 파일이 필요한 경우)

- Backup 파일 존재

 

- 장애 발생 상황

- tt02 테이블을 ts_new 테이블스페이스에 생성 후 Data를 입력 합니다.

- 데이터를 insert 한 후 log switch 를 발생 시킵니다.

- /dev/zero 파일로 덮어 씌웁니다.

- alter tablespace ts_new offline immediate; 시킨 후 복구를 수행 합니다.

 

- 복구

1. 파일을 백업 파일로부터 복원 합니다.

2. 복구를 시도 하지만 실패 하는 것을 확인 할 수 있습니다.

3. 복구를 수행합니다.

SQL>recover tablespace ts_new;

- auto

SQL>alter tablespace ts_new online;

 

4. 만약 3번 과정에서 archive log 파일이 필요하다는 Message 가 나올 수 있다.

ORA-00308: cannot open archived log '/경로/xx.dbf' ß 이 Message 는 현재 노드에 Archive log 파일이 존재 하지 않기 때문에 발생하는 것으로 해당 노드에서 Archive log 파일을 현재 복구작업을 하는 노드의 log_archive_dest_x 경로로 복사해 와야 한다.

RAC (Archive mode 에서 장애 복구 1)

 

Case :

- Offline 되는 테이블 스페이스 장애 발생 (Archive 파일이 필요 없는 경우)

- Backup 파일 존재

 

- 장애 발생 상황

- tt01 테이블을 ts_new 테이블스페이스에 생성 후 Data를 입력 합니다.

- ts_new tablespace offline 시킨 후 /dev/zero 파일로 덮어 씌웁니다.

- online 이 되지 않고 장애가 발생 한 것을 확인 할 수 있습니다.

- 복구

1. 복구를 시도 하지만 실패 하는 것을 확인 할 수 있습니다.

2. backup file 을 /dev/raw/raw28 로 복사합니다.

SQL>dd if=/data/backup/close/raw28_ts_new of=/dev/raw/raw28 bs=8k

3. 복구를 수행합니다.

SQL>recover tablespace ts_new;

SQL>alter tablespace ts_new online;

Raw Device 백업(Cold backup)

 

- Cold backup (닫힌 백업)

1. 양쪽 노드 모드 종료

2. dd 명령어로 복사

 

- Tablespace 정보 확인 (dba_data_files)

Select tablespace_name, bytes/1024/1024 MB,file_name

From dba_data_files;

 

- 양쪽 노드 모드 종료 수행

- dd 명령어로 백업 수행

SQL>!dd if=/dev/raw/raw6 of=/data/backup/open/raw6_system bs=8k

 

Raw Device 백업(Hot backup)

 

- Hot backup

1. 해당 테이블 스페이스를 begin backup 모드로 변경

2. dd 명령어로 복사

3. 해당 테이블 스페이스를 end backup 모드로 변경

 

- Tablespace 정보 확인 (dba_data_files)

Select tablespace_name, bytes/1024/1024 MB,file_name

From dba_data_files;

 

- Hot Backup 수행

SQL>Alter tablespace system begin backup;

SQL>!dd if=/dev/raw/raw6 of=/data/backup/open/raw6_system bs=8k

SQL>alter tablespace system end backup;

 

 

- Hot Backup을 수행 한 다음 체크 포인트를 발생시켜 전체를 동기화 시켜 줍니다.

SQL>alter system checkpoint;

System altered.

+ Recent posts