이번 장에서는 Raw device 기반의 Oracle Real Application Cluster (이하 RAC)환경에서
어떻게 백업을 하고 장애가 발생했을 경우 어떻게 복구를 하는지 살펴 보도록 하겠습니다.
( RAC 의 Storage를 구현하는 방법이 앞에서 살펴본 바와 같이 Automatic Storage Management (이하 ASM) 방식과
Raw Device (로우 디바이스) 방식이 있는데 ASM 기반의 백업 및 복구는 저자의 다른 저서인
오라클 관리 실무 와 오라클 백업과 복구의 정석의 ASM 과 RMAN 부분을 참고 하시면 됩니다.)
그리고 RAC 구성에서의 장애 중에서 물리적인 하드웨어나 네트워크 관련 장애는 거의 발생하는 경우가 드물고
주로 사용자의 실수 등의 논리적 장애가 많이 발생하므로 이 책에서도 물리적 장애 유형은 간단히 살펴보고
논리적인 장애를 복구하는 방법에 대해 자세하게 설명하겠습니다.
이 장에서 살펴 볼 주요 내용들입니다.
1. OCR 개념 및 관리 와 백업 / 복구 하기
2. Vote Disk 개념 및 관리와 백업 / 복구 하기
3. RAC 환경에서의 Archive log mode 로 변경하기
4. Raw device Backup 수행 하기
4-1. Hot Backup (Begin Backup) 하기
4-2. Cold Backup (Close Backup) 하기
5. Raw Device 를 RMAN 으로 백업 수행하기
6. Archive log mode 에서의 장애복구
Case 1. Offline 되는 테이블 스페이스 장애 발생함 – 아카이브 로그 파일 필요 없을 경우
Case 2. Offline 되는 테이블 스페이스 장애 발생함 – 아카이브 로그 파일 필요 할 경우
Case 3. Offline 안 되는 데이터 파일 장애 발생
Case 4. 일부 컨트롤 파일 장애
Case 5. 모든 컨트롤 파일 장애 – 삭제 또는 old control file 발생으로 재 생성해서 해결하는 방법
Case 6. 대기중인 리두 로그 파일 그룹 장애 – 아카이빙 완료된 상태
Case 7. Current Redo log file 장애 – 한쪽 노드만 장애 발생
7-1. hot backup 파일로 복구 하기
7-2. cold backup 파일로 복구 하기
Case 8. Current Redo log 장애 – 양쪽 노드 모두 장애 발생
Case 9. Redo log file 전체 손상됨 – 한쪽 노드에서만 장애 발생
Case 10. Redo log file 전체 손상됨 – 양쪽 노드 모두에서 장애 발생함
10-1. Begin backup file 로 복구하기
10-2. Cold backup file 로 복구하기
10-3. 장애 발생 후 shutdown immediate 로 정상 종료 됨
Case 11. Redo log file 삭제 장애 후 백업파일 없는 경우 복구
11-1. Redo log file 이 Active 상태일 때 장애 –변경내역이 데이터파일에 저장 안된 경우
11-2. Redo log file 이 Inactive 상태일 때 장애
Case 12. Drop table 삭제 복구하기 – 모든 노드 무 정지 상태에서 복구하기
Case 13. 잘못된 DML 장애 복구하기 – 잘못된 update 후 commit 수행 복구하기
1. OCR 개념 및 관리
RAC 에서 RAC 자원의 상태와 각 노드들에 관한 중요 정보를 저장하고 있는 저장소는 OCR 이라는 곳과 Vote Disk 라는 두 가지 종류가 있습니다.
이 두 곳 중 한 곳이라도 장애가 발생하면 치명적 문제를 발생하게 되므로 RAC 를 설치 할 때 다중화를 하도록 권장합니다.
그러나 RAC 설치 당시에 다중화를 한다고 해도 장애가 발생할 수 있으므로 관리자가 수시로 백업을 수행해야 합니다.
이 장에서는 먼저 OCR 에 대해서 자세히 살펴 본 후 Vote disk 에 대해서 살펴보겠습니다.
1) OCR Disk 란?
- OCR (Oracle Cluster Repository) 의 약자로 Cluster 전체의 정보를 저장하고 있는 저장소입니다.
윈도와 비교하면 레지스트리 같은 역할을 하며 RAC 상의 모든 노드들에 대한 정보와 모든 자원들에 대한 정보가 저장되어 있기 때문에
이 곳이 장애가 나면 RAC 전체가 중단될 수 있습니다.
사람으로 비유하면 두뇌와 같은 역할을 하는 아주 중요한 곳입니다.
2) OCR Disk 주요 특징
- OCR 디스크의 소유자는 기본적으로 root 로 되어 있습니다.
하지만 경우에 따라서는 oracle 사용자가 될 수도 있습니다.
- 아래의 조건으로 자동 백업을 수행합니다.
4시간마다 / 매일마다 / 매주마다
3) OCR 관련 사항 확인하기
- OCR file은 $ORA_CRS_HOME/bin/ocrcheck 명령어를 이용하여 상태를 확인합니다.
( 아래 화면은 10g 버전에서 조회한 화면입니다)
$ cd $ORA_CRS_HOME/bin
$ pwd
$ ocr check
4) OCR 의 자동 백업 경로 확인
$ ocrconfig -showbackup
위에서 확인한 디렉터리로 가서 실제 파일을 확인 해 보겠습니다.
$ cd /home/oracle/product/10g/crs/cdata/crs
$ ls -lSh
5) OCR file 장애 및 복구하기 - ocrconfig 명령 사용
( 자동 백업파일을 이용한 복원과 수동 백업파일을 이용한 복원으로 구분해서 살펴봅니다 )
5.1 자동 백업 파일로부터의 OCR 복원하기
Step 1.현재 ocr 디스크 확인합니다
[root@rac1 ~]# ocrcheck
Step 2. 자동 백업 내역 확인
[root@rac1 ~]# ocrconfig -showbackup
rac1 2013/10/30 15:43:39 /home/oracle/product/10g/crs/cdata/crs
rac1 2013/10/22 06:35:35 /home/oracle/product/10g/crs/cdata/crs
rac1 2013/10/22 02:35:35 /home/oracle/product/10g/crs/cdata/crs
rac1 2013/10/30 15:43:39 /home/oracle/product/10g/crs/cdata/crs
rac1 2013/10/19 23:53:15 /home/oracle/product/10g/crs/cdata/crs
[root@rac1 ~]# cd /home/oracle/product/10g/crs/cdata/crs/
[root@rac1 crs]# ls -lSh
총용량 28M
-rw-r--r-- 1 root root 4.6M 10??30 15:43 backup00.ocr
-rw-r--r-- 1 root root 4.6M 10??22 06:35 backup01.ocr
-rw-r--r-- 1 root root 4.6M 10??22 02:35 backup02.ocr
-rw-r--r-- 1 root root 4.6M 10??30 15:43 day.ocr
-rw-r--r-- 1 root root 4.6M 10??30 15:43 week_.ocr
-rw-r--r-- 1 root root 4.1M 10??19 23:53 week.ocr
위 백업파일 중 가장 최신 파일인 backup00.ocr 을 복원에 사용할 예정입니다.
Step 3. dd 명령어로 ocr disk 를 초기화 시키는 장애를 발생시킵니다.
[root@rac1 ~]# dd if=/dev/zero of=/dev/raw/raw1 bs=8k <-- 장애를 발생시킵니다
dd: writing `/dev/raw/raw1': 장치에 남은 공간이 없음
38401+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
[root@rac1 ~]# dd if=/dev/zero of=/dev/raw/raw2 bs=8k <-- 장애를 발생시킵니다.
dd: writing `/dev/raw/raw2': 장치에 남은 공간이 없음
38401+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
[root@rac1 ~]# ocrcheck
PROT-602: Failed to retrieve data from the cluster registry <-- ocr 에 접근 할 수 없습니다.
[root@rac1 ~]# crsctl stop crs
OCR initialization failed with invalid format: PROC-22: The OCR backend has an invalid format
잠시 기다리면 OCR 디스크 장애로 RAC 전체가 중단됩니다
Step 4. 백업된 OCR 파일을 복원해서 해결하겠습니다.
[root@rac1 crs]# ocrconfig –restore /home/oracle/product/10g/crs/cdata/crs/backup00.ocr
[root@rac1 crs]# crsctl start crs
Attempting to start CRS stack
The CRS stack will be started shortly
[root@rac1 crs]# su - oracle
[oracle@rac1 crs]$ cluvfy comp ocr -n all <--- cluvfy 명령어를 이용하여 복구 확인하기
OCR 무결성 확인 중
OCR 무결성을 검사하는 중...
클러스터화되지 않은 구성이 없는지 검사하는 중...
모든 노드에 클러스터화되지 않은 로컬 전용 구성이 없습니다.
OCR 장치에 대한 고유성 검사를 성공했습니다.
OCR 버전을 검사하는 중...
올바른 OCR 버전 "2"이(가) 존재합니다.
OCR에 대한 데이터 무결성을 검사하는 중...
OCR에 대한 데이터 무결성 검사를 성공했습니다.
OCR 무결성 검사를 성공했습니다.
OCR 무결성 확인 작업을 성공했습니다.
[oracle@rac1 crs]$ ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 2
Total space (kbytes) : 307112
Used space (kbytes) : 4552
Available space (kbytes) : 302560
ID : 1705186177
Device/File Name : /dev/raw/raw1 <-- 정상적으로 복구완료되었습니다.
Device/File integrity check succeeded
Device/File Name : /dev/raw/raw2 <-- 정상적으로 복구완료되었습니다.
Device/File integrity check succeeded
Cluster registry integrity check succeeded
Step 5. 오라클 클러스터웨어(Oracle Clusterware)를 start
[root@rac1]# crsctl start crs
5.2 OCR file 수동 Backup 하기
자동 백업은 오라클이 정해 진 시간에 백업을 수행하는 것입니다. 그러나 RAC 의 OCR 디스크에 내용이 변경되었다면
(예를 들어 신규 노드가 추가되는 경우) 지금 즉시 백업을 수행해야 합니다.
이 때 아래와 같은 방법으로 수동 백업을 하면 됩니다.
Step 1. 전체 노드의 오라클 클러스터웨어(Oracle Clusterware)를 stop
[root@rac1]# crsctl stop crs
(주의) crs 가 start 상태에서 백업을 수행해도 수행됩니다.
그러나 백업 도중에 crs 정보가 변경될 수 있기 때문에 crs를 중지 시킨 후 백업을 수행하기를 권장합니다.
Step 2. ocrconfig –export 명령어를 이용하여 수동으로 OCR file을 해당 경로에 백업 수행
[root@rac1]# ocrconfig –export /home/oracle/ocrbackup
Step 3. 전체 노드의 오라클 클러스터웨어(Oracle Clusterware)를 start
[root@rac1]# crsctl start crs
5.3 수동 백업 파일을 사용하여 OCR file 복원하기
Step 1. dd 명령어로 ocr disk 장애 발생
[root@rac1]# crsctl stop crs
Step 2. 장애 발생 시킨 후 OCR file을 해당백업 경로에서 복원
[root@rac1]# ocrconfig –import /home/oracle/ocrbackup
Step 3. cluvfy 명령어를 이용하여 복원이 잘 되었나 확인
[root@rac1]# cluvfy comp ocr –n all
Step 4. 전체 노드의 오라클 클러스터웨어(Oracle Clusterware)를 start
[root@rac1]# crsctl start crs
6) vote disk 관리하기
6.1 Vote disk 조회하기
$ crsctl query css votedisk
6.2 Vote disk 백업 수행하기
[root@rac1 ~]# dd if=/dev/raw/raw3 of=/home/oracle/vote01_backup bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
[root@rac1 ~]# dd if=/dev/raw/raw4 of=/home/oracle/vote02_backup bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
[root@rac1 ~]# dd if=/dev/raw/raw5 of=/home/oracle/vote03_backup bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
6.3 Vote disk 장애 복구하기
Step 1. dd 명령으로 모든 Vote Disk 를 초기화 합니다.
[root@rac1 ~]# dd if=/dev/zero of=/dev/raw/raw3 bs=8k
vote disk 에 장애가 발생하면 RAC 노드가 재부팅 됩니다.
재부팅 후 나머지 Vote disk 도 위와 같이 전부 초기화합니다.
모든 Vote disk 가 장애가 발생하면 crs 가 시작되지 않습니다.
[root@rac1 ~]# dd if=/dev/zero of=/dev/raw/raw4 bs=8k
[root@rac1 ~]# dd if=/dev/zero of=/dev/raw/raw5 bs=8k
Step 2. dd 명령으로 백업 받아 둔 파일을 모두 복원합니다.
[root@rac1 ~]# dd if=/home/oracle/vote01_backup of=/dev/raw/raw3 bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
[root@rac1 ~]# dd if=/home/oracle/vote02_backup of=/dev/raw/raw4 bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
[root@rac1 ~]# dd if=/home/oracle/vote03_backup of=/dev/raw/raw5 bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
Step 3. crs 를 시작시켜서 확인합니다.
[root@rac1 ~]# crsctl start crs
Attempting to start CRS stack
The CRS stack will be started shortly
이상으로 RAC 에서 가장 중요한 부분 중 하나인 OCR disk 와 Vote disk 를 어떻게 백업하고 복구하는지 살펴보았습니다.
다음 장에서는 실제 데이터와 관련된 부분의 Backup 과 Recovery 를 알아보겠습니다.
2. RAC Backup and Recovery
이번 장에서는 RAC 2 node 환경에서 발생하는 다양한 장애를 대비하여 백업하는 방법과 각 장애 case별로 복구를 하는 방법을 알아보겠습니다.
크게 물리적인 장애와 논리적인 장애로 나눌 수 있는데 물리적인 장애는 대부분 Hardware 쪽 장애입니다.
이 경우는 Hardware 벤더(제조사)에 의뢰를 해야 하며 경우의 수가 너무 많으므로 이 장의 뒷부분에서 주요 유형을 언급하기로 하고
여기서는 논리적인 장애 (즉 사용자나 관리자의 실수로 명령어를 잘못 수행해서 발생하는 경우) 를 위주로 자세한 Case - by - Case 로 살펴보겠습니다.
기본 원리는 Single 에서 수행하는 원리와 동일하므로 이 장의 내용을 보다 잘 이해하려면 선수 학습으로 Single 에서 수행하는
오라클 백업과 복구의 원리와 다양한 경우의 장애를 먼저 공부하시는 것이 아주 도움이 크게 됩니다.
(선수학습에 대해서는 이 책의 범위를 벗어나는 것이므로 저자의 다른 저서인 "정석-오라클백업과 복구 / 생능출판사 출간 " 을 참고하세요)
그리고 No archive log mode 에서는 장애가 발생해도 거의 복구를 할 수 없는 경우가 많기 때문에
여기서는 간단한 몇 가지 경우만 살펴보고 Archive log mode 환경 위주로 복구 작업을 진행하겠습니다.
또한 앞에서 간단히 언급한 바와 같이 ASM 기반의 장애는 저자의 다른 저서인 '"오라클 관리실무" 책의 ASM 부분과 RMAN 부분에
아주 자세히 언급이 되어 있으므로 분량이나 내용의 중복 때문에 해당 책을 참고하시고
여기서는 Raw Device 기반 환경에서 백업하고 복구하는 방법을 위주로 진행하도록 하겠습니다.
1) Archive log mode 로 변경하기
1. 양쪽 노드 전부 shutdown immediate 수행합니다.
2. 한쪽 노드만 마운트 단계로 시작합니다.
3. Alter system set log_archive_dest_1=’location=/data/arc1’ ;
4. Alter system set log_archive_dest_2=’location=/data/arc2’ ;
5. Alter database archivelog;
6. Alter database open;
7. Archive log list 로 결과 확인 후 나머지 한쪽 노드에서도 위 단계 2,3,4 를 수행합니다
Step 1. 각 노드에 접속해서 shutdown immediate 로 종료합니다.
[oracle@rac1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on Fri
Copyright (c) 1982, 2005, Oracle. All rights res
Connected to:
Oracle Database 10g Enterprise Edition Release 10
With the Partitioning, Real Application Clusters,
SQL>select instance_name from v$instance;
INSTANCE_NAME
----------------
rac1
SYS>shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
Node 2 에서도 이와 같이 종료하세요.
위 화면처럼 양쪽 노드에서 모든 인스턴스와 서비스가 종료 된 것이 확인됩니다.
Step 2. 한쪽 노드만 마운트 단계로 시작합니다. ( rac1 부터 작업하겠습니다 )
SQL> startup mount;
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218968 bytes
Variable Size 218105448 bytes
Database Buffers 58720256 bytes
Redo Buffers 7168000 bytes
Database mounted.
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /home/oracle/product/10g/db/dbs/arch
Oldest online log sequence 26
Current log sequence 28
SQL> show parameter spfile ;
NAME TYPE VALUE
------------------------------------ ----------- -----------------------
spfile string /dev/raw/raw28
Step 4. Archive log file 을 저장할 경로를 지정한 후 archive log mode 로 변경합니다.
(아래의 아카이브 경로는 미리 만들어져 있다고 가정하고 진행합니다.
혹시 없으신 분들은 이 단계 진행 전에 미리 생성해도 되고 다른 경로 사용해도 됩니다)
SQL> alter system set log_archive_dest_1='location=/data/arc1'
System altered.
SQL> alter system set log_archive_dest_2='location=/data/arc2';
System altered.
SQL> alter database archivelog;
Database altered.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /data/arc2
Oldest online log sequence 26
Next log sequence to archive 28
Current log sequence 28
Step 5. 한쪽 노드만 open 합니다.
SQL> alter database open;
Database altered.
Step 6. 나머지 한쪽 노드에서 위 단계 2,3,4 를 수행합니다.
( 단 alter database archivelog 명령은 하지 마세요.
archive log mode 여부는 control file 에 저장되는데 이미 rac1 에서 control file 에 archive log mode 라고
설정을 했기 때문에 rac2 에서는 안 해도 됩니다.)
SQL> alter system set log_archive_dest_1='location=/data/arc1';
System altered.
SQL> alter system set log_archive_dest_2='location=/data/arc2';
System altered.
SQL> alter database open;
Database altered.
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /data/arc2
Oldest online log sequence 8
Next log sequence to archive 10
Current log sequence 10
Raw device 환경에서 archive log file 은 공유 스토리지에 저장하지 못하고 각 로컬 노드에 또로 따로 저장해야 합니다.
왜냐면 raw device 란 하나의 파일은 하나의 디스크처럼 취급되는데
Log switch 가 생길 때마다 Archive redo log file 이 생기게 되면 그 파일들을 일일이 raw device 를 생성해 줄 수 없기 때문입니다.
예를 들면 raw device 1 개가 USB 1 개라고 생각하면 됩니다.
그래서 Raw Device 환경의 RAC 의 최적의 구성은 아래와 같습니다. archive log 저장 경로 잘 보세요.
2) Raw device 백업하기
2.1 Hot backup 하기
1)해당 테이블스페이스를 begin backup 모드로 변경합니다.
2)dd 명령어로 복사합니다.
3)해당 테이블스페이스를 end backup 모드로 변경합니다.
SQL> col tablespace_name for a10
SQL> col file_name for a45
SQL> select tablespace_name,bytes/1024/1024 MB,file_name
2 from dba_data_files;
TABLESPACE MB FILE_NAME
------------------- --------- ---------------------------------------------
SYSTEM 590 /dev/raw/raw6
UNDOTBS1 295 /dev/raw/raw8
SYSAUX 290 /dev/raw/raw7
UNDOTBS2 290 /dev/raw/raw9
USERS 290 /dev/raw/raw10
SQL> save dd.sql
Created file dd.sql
SQL> alter tablespace system begin backup;
Tablespace altered.
SQL> !dd if=/dev/raw/raw6 of=/data/backup/open/system_raw6 bs=8k
76800+0개의 레코드를 입력하였습니다
76800+0개의 레코드를 출력하였습니다
SQL> alter tablespace system end backup;
Tablespace altered.
SQL> alter tablespace undotbs1 begin backup;
Tablespace altered.
SQL> !dd if=/dev/raw/raw8 of=/data/backup/open/undotbs1_raw8 bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
SQL> alter tablespace undotbs1 end backup;
Tablespace altered.
SQL> alter tablespace sysaux begin backup;
Tablespace altered.
SQL> !dd if=/dev/raw/raw7 of=/data/backup/open/sysaux_raw7 bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
SQL> alter tablespace sysaux end backup;
Tablespace altered.
SQL> alter tablespace undotbs2 begin backup;
Tablespace altered.
SQL> !dd if=/dev/raw/raw9 of=/data/backup/open/undotbs2_raw9 bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
SQL> alter tablespace undotbs2 end backup ;
Tablespace altered.
SQL> alter tablespace users begin backup;
Tablespace altered.
SQL> !dd if=/dev/raw/raw10 of=/data/backup/open/users_raw10 bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
SQL> alter tablespace users end backup ;
Tablespace altered.
SQL> alter system checkpoint; <- 체크포인트를 발생시켜 전체를 동기화 시켜줍니다
System altered
SQL> !ls -lSh /data/backup/open
합계 1.8G
-rw-r--r-- 1 oracle oinstall 600M 11월 1 15:34 system_raw6
-rw-r--r-- 1 oracle oinstall 300M 11월 1 15:37 sysaux_raw7
-rw-r--r-- 1 oracle oinstall 300M 11월 1 15:35 undotbs1_raw8
-rw-r--r-- 1 oracle oinstall 300M 11월 1 15:38 undotbs2_raw9
-rw-r--r-- 1 oracle oinstall 300M 11월 1 15:40 users_raw10
2.2 Cold backup 하기
Step 1. 백업 대상 데이터 파일을 확인합니다.
SQL> @dd
TABLESPACE MB FILE_NAME
------------------- ---------- ---------------------------------------------
SYSTEM 590 /dev/raw/raw6
UNDOTBS1 295 /dev/raw/raw8
SYSAUX 290 /dev/raw/raw7
UNDOTBS2 290 /dev/raw/raw9
USERS 290 /dev/raw/raw10
Step 2. 양쪽 노드 모드 종료합니다
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
Step 3. 백업 대상 파일을 dd 로 복사합니다.
[[oracle@rac1 ~]$ dd if=/dev/raw/raw6 of=/data/backup/close/raw6_system bs=8k
76800+0개의 레코드를 입력하였습니다
76800+0개의 레코드를 출력하였습니다
[oracle@rac1 ~]$ dd if=/dev/raw/raw7 of=/data/backup/close/raw7_sysaux bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
[oracle@rac1 ~]$ dd if=/dev/raw/raw8 of=/data/backup/close/raw8_undotbs1 bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
[oracle@rac1 ~]$ dd if=/dev/raw/raw9 of=/data/backup/close/raw9_undotbs2 bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
[oracle@rac1 ~]$ dd if=/dev/raw/raw10 of=/data/backup/close/raw10_users bs=8k
38400+0개의 레코드를 입력하였습니다
38400+0개의 레코드를 출력하였습니다
Step 4. 백업 파일을 확인합니다.
[oracle@rac1 ~]$ ls -lSh /data/backup/close/
합계 1.8G
-rw-r--r-- 1 oracle oinstall 600M 11월 1 15:51 raw6_system
-rw-r--r-- 1 oracle oinstall 300M 11월 1 15:56 raw10_users
-rw-r--r-- 1 oracle oinstall 300M 11월 1 15:54 raw7_sysaux
-rw-r--r-- 1 oracle oinstall 300M 11월 1 15:55 raw8_undotbs1
-rw-r--r-- 1 oracle oinstall 300M 11월 1 15:55 raw9_undotbs2
이상으로 RAC 환경에서 Raw device 를 백업 받는 방법을 알아 보았습니다.
기존 파일시스템과 원리는 모두 동일하고 사용 명령어만 다를 뿐입니다.
즉 기존 파일 시스템에서의 주의 사항이 여기에서도 동일하게 적용된다는 뜻입니다.
항상 백업에 주의하시기 바랍니다
3) 아카이브 모드에서의 장애 복구
Case 1. Offline 되는 테이블 스페이스 장애 발생함 – 복구내용이 온라인 리두 로그파일에 모두 있는 경우
Step 1. 장애 상황 설정
SQL> set sqlprompt "_USER>"
SYS>@dd
TABLESPACE MB FILE_NAME
----------------- ---------- ---------------------------------------------
SYSTEM 590 /dev/raw/raw6
UNDOTBS1 295 /dev/raw/raw8
SYSAUX 290 /dev/raw/raw7
UNDOTBS2 290 /dev/raw/raw9
USERS 290 /dev/raw/raw10
테스트용으로 test 라는 이름의 테이블 스페이스를 새로 생성하겠습니다.
해당 로우 디바이스를 확인하기 위해 root 계정에서 lvscan 을 실행합니다.
[oracle@rac1 ~]$ su -Password:
[root@rac1 ~]# lvscan
ACTIVE '/dev/rac/ocr1' [300.00 MB] inherit
ACTIVE '/dev/rac/ocr2' [300.00 MB] inherit
ACTIVE '/dev/rac/vote1' [300.00 MB] inherit
ACTIVE '/dev/rac/vote2' [300.00 MB] inherit
ACTIVE '/dev/rac/vote3' [300.00 MB] inherit
ACTIVE '/dev/rac/system' [600.00 MB] inherit
ACTIVE '/dev/rac/sysaux' [300.00 MB] inherit
ACTIVE '/dev/rac/undotbs1' [300.00 MB] inherit
ACTIVE '/dev/rac/undotbs2' [300.00 MB] inherit
ACTIVE '/dev/rac/users' [300.00 MB] inherit
ACTIVE '/dev/rac/example' [300.00 MB] inherit
ACTIVE '/dev/rac/temp' [300.00 MB] inherit
ACTIVE '/dev/rac/redo01_a' [100.00 MB] inherit
ACTIVE '/dev/rac/redo01_b' [100.00 MB] inherit
ACTIVE '/dev/rac/redo02_a' [100.00 MB] inherit
ACTIVE '/dev/rac/redo02_b' [100.00 MB] inherit
ACTIVE '/dev/rac/redo03_a' [100.00 MB] inherit
ACTIVE '/dev/rac/redo03_b' [100.00 MB] inherit
ACTIVE '/dev/rac/redo04_a' [100.00 MB] inherit
ACTIVE '/dev/rac/redo04_b' [100.00 MB] inherit
ACTIVE '/dev/rac/redo05_a' [100.00 MB] inherit
ACTIVE '/dev/rac/redo05_b' [100.00 MB] inherit
ACTIVE '/dev/rac/redo06_a' [100.00 MB] inherit
ACTIVE '/dev/rac/redo06_b' [100.00 MB] inherit
ACTIVE '/dev/rac/control01' [100.00 MB] inherit
ACTIVE '/dev/rac/control02' [100.00 MB] inherit
ACTIVE '/dev/rac/control03' [100.00 MB] inherit
ACTIVE '/dev/rac/spfile' [52.00 MB] inherit
ACTIVE '/dev/rac/data1' [100.00 MB] inherit
ACTIVE '/dev/rac/data2' [100.00 MB] inherit
ACTIVE '/dev/rac/data3' [100.00 MB] inherit
ACTIVE '/dev/rac/data4' [100.00 MB] inherit
가장 마지막에 있는 디바이스 4 개가 RAC 설치시에 여분으로 생성했던 장치입니다.
그 중에서 /dev/raw/data1 을 test tablespace 로 사용하겠습니다.
해당 디바이스를 확인하기 위해 /etc/sysconfig/rawdevices 파일을 확인합니다.
SYS>!
[oracle@rac1 ~]$ cat /etc/sysconfig/rawdevices
# This file and interface are deprecated.
# Applications needing raw device access should open regular
# block devices with O_DIRECT.
# raw device bindings
# format: <rawdev> <major> <minor>
# <rawdev> <blockdev>
# example: /dev/raw/raw1 /dev/sda1
# /dev/raw/raw2 8 5
/dev/raw/raw1 /dev/rac/ocr1
/dev/raw/raw2 /dev/rac/ocr2
/dev/raw/raw3 /dev/rac/vote1
/dev/raw/raw4 /dev/rac/vote2
/dev/raw/raw5 /dev/rac/vote3
/dev/raw/raw6 /dev/rac/system
/dev/raw/raw7 /dev/rac/sysaux
/dev/raw/raw8 /dev/rac/undotbs1
/dev/raw/raw9 /dev/rac/undotbs2
/dev/raw/raw10 /dev/rac/users
/dev/raw/raw11 /dev/rac/example
/dev/raw/raw12 /dev/rac/temp
/dev/raw/raw13 /dev/rac/redo01_a
/dev/raw/raw14 /dev/rac/redo01_b
/dev/raw/raw15 /dev/rac/redo02_a
/dev/raw/raw16 /dev/rac/redo02_b
/dev/raw/raw17 /dev/rac/redo03_a
/dev/raw/raw18 /dev/rac/redo03_b
/dev/raw/raw19 /dev/rac/redo04_a
/dev/raw/raw20 /dev/rac/redo04_b
/dev/raw/raw21 /dev/rac/redo05_a
/dev/raw/raw22 /dev/rac/redo05_b
/dev/raw/raw23 /dev/rac/redo06_a
/dev/raw/raw24 /dev/rac/redo06_b
/dev/raw/raw25 /dev/rac/control01
/dev/raw/raw26 /dev/rac/control02
/dev/raw/raw27 /dev/rac/control03
/dev/raw/raw28 /dev/rac/spfile
/dev/raw/raw29 /dev/rac/data1
/dev/raw/raw30 /dev/rac/data2
/dev/raw/raw31 /dev/rac/data3
/dev/raw/raw32 /dev/rac/data4
[oracle@rac1 ~]$ exit
exit
SYS>create tablespace test
2 datafile '/dev/raw/raw29' ;
Tablespace created.
SYS>@dd
TABLESPACE MB FILE_NAME
------------------ ---------- ---------------------------------------------
SYSTEM 590 /dev/raw/raw6
UNDOTBS1 295 /dev/raw/raw8
SYSAUX 290 /dev/raw/raw7
UNDOTBS2 290 /dev/raw/raw9
USERS 290 /dev/raw/raw10
TEST 99.9921875 /dev/raw/raw29
6 rows selected.
test tablespace 가 생성된 것을 확인 할 수 있습니다.
위 test tablespace 에 예제 데이터 저장용 테이블을 생성한 후 데이터를 입력합니다.
SYS>create table scott.tt100 (no number) tablespace test ;
Table created.
SYS>insert into scott.tt100 values (1);
1 row created.
SYS>commit;
Commit complete.
SYS>select * from scott.tt100 ;
NO
------------
1
SQL> alter tablespace ts_new offline immediate;
Tablespace altered.
dd 명령으로 해당 로우 디바이스를 초기화 합니다.
SYS>!dd if=/dev/zero of=/dev/raw/raw29 bs=8k
dd: writing `/dev/raw/raw29': 장치에 남은 공간이 없음
12801+0개의 레코드를 입력하였습니다
12800+0개의 레코드를 출력하였습니다
SYS>alter tablespace test offline immediate;
Tablespace altered.
SYS>alter tablespace test online;
alter tablespace test online
*
ERROR at line 1:
ORA-01122: database file 6 failed verification check
ORA-01110: data file 6: '/dev/raw/raw29'
ORA-01251: Unknown File Header Version read for file number 6
SYS>select * from scott.tt100 ;
select * from scott.tt100
*
ERROR at line 1:
ORA-00376: file 6 cannot be read at this time
ORA-01110: data file 6: '/dev/raw/raw29'
Step 2. 복구
SQL> recover tablespace ts_new; <- 파일복원 없이 그냥 복구 시도함. 실패확인
ORA-00283: recovery session canceled due to errors
ORA-01110: data file 6: '/dev/raw/raw28'
ORA-01122: database file 6 failed verification check
ORA-01110: data file 6: '/dev/raw/raw28'
ORA-01251: Unknown File Header Version read for file number 6
SQL> !dd if=/data/backup/close/raw28_ts_new of=/dev/raw/raw28 bs=8k
1536+0개의 레코드를 입력하였습니다
1536+0개의 레코드를 출력하였습니다
SQL> recover tablespace ts_new;
Media recovery complete.
SQL> alter tablespace ts_new online;
Tablespace altered.
SQL> select * from tt01;
NO
--------------
1 <- 복구 됨을 확인합니다.
위 장애는 장애를 복구할 수 있는 내역이 Online Redo log file 에 있었기 때문에 별도의 Archive Redo log file 이 필요 없었습니다.
Case 2. Offline 되는 테이블 스페이스 장애 발생함 – 아카이브 파일 필요 할 경우
Step 1. 장애상황 발생
SQL> create table tt02 (no number) tablespace ts_new;
Table created.
SQL> insert into tt02 values (1);
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL> insert into tt02 values (2);
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL> insert into tt02 values (3);
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL> alter system switch logfile;
System altered.
SQL> /
System altered.
SQL> /
System altered.
SQL> !dd if=/dev/zero of=/dev/raw/raw28 bs=8k
dd: writing `/dev/raw/raw28': 장치에 남은 공간이 없음
1537+0개의 레코드를 입력하였습니다
1536+0개의 레코드를 출력하였습니다
SQL> alter tablespace ts_new offline immediate;
Tablespace altered.
SQL> select * from tt02;
select * from tt02
*
ERROR at line 1:
ORA-00376: file 6 cannot be read at this time
ORA-01110: data file 6: '/dev/raw/raw28'
Step 2. 파일 복원 후 복구
SQL> !dd if=/data/backup/close/raw28_ts_new of=/dev/raw/raw28 bs=8k
1536+0개의 레코드를 입력하였습니다
1536+0개의 레코드를 출력하였습니다
SQL> recover tablespace ts_new;
ORA-00279: change 798466 generated at 10/06/2010 00:31:35 needed for thread 1
ORA-00289: suggestion : /data/arc2/1_23_730146831.dbf
ORA-00280: change 798466 for thread 1 is in sequence #23
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279: change 798466 generated at 10/06/2010 00:00:21 needed for thread 2
ORA-00289: suggestion : /data/arc2/2_12_730146831.dbf
ORA-00280: change 798466 for thread 2 is in sequence #12
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: cannot open archived log '/data/arc2/2_12_730146831.dbf' <- node 2 파일 필요
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
SQL> !scp racdb2:/data/arc2/2_* /data/arc2/ <- node 2 아카이브 파일 복사해 옴.
2_10_730146831.dbf 100% 9082KB 4.4MB/s 00:02
2_11_730146831.dbf 100% 199KB 199.0KB/s 00:00
2_12_730146831.dbf 100% 1384KB 1.4MB/s 00:00
2_13_730146831.dbf 100% 137KB 137.0KB/s 00:00
2_14_730146831.dbf 100% 3584 3.5KB/s 00:00
2_2_730146831.dbf 100% 239KB 238.5KB/s 00:00
2_3_730146831.dbf 100% 1024 1.0KB/s 00:00
2_4_730146831.dbf 100% 3072 3.0KB/s 00:00
2_5_730146831.dbf 100% 1024 1.0KB/s 00:00
2_6_730146831.dbf 100% 3584 3.5KB/s 00:00
2_7_730146831.dbf 100% 19MB 3.9MB/s 00:05
2_8_730146831.dbf 100% 78KB 77.5KB/s 00:00
2_9_730146831.dbf 100% 96MB 4.4MB/s 00:22
SQL> recover tablespace ts_new;
ORA-00279: change 798466 generated at 10/06/2010 00:31:35 needed for thread 1
ORA-00289: suggestion : /data/arc2/1_23_730146831.dbf
ORA-00280: change 798466 for thread 1 is in sequence #23
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 798466 generated at 10/06/2010 00:00:21 needed for thread 2
ORA-00289: suggestion : /data/arc2/2_12_730146831.dbf <- node 2 파일 사용
ORA-00280: change 798466 for thread 2 is in sequence #12
………………….(중간 생략)………………
ORA-00279: change 864650 generated at 10/07/2010 00:09:29 needed for thread 1
ORA-00289: suggestion : /data/arc2/1_28_730146831.dbf
ORA-00280: change 864650 for thread 1 is in sequence #28
ORA-00278: log file '/data/arc2/1_27_730146831.dbf' no longer needed for this recovery
Log applied.
Media recovery complete.
SQL> alter tablespace ts_new online;
Tablespace altered.
SQL> select * from tt02;
NO
----------------
1
2
3
RAC 는 모든 노드가 SCN을 따로 발생시키는 게 아니기 때문에 순서대로 복구하기 위해서는
다른 노드에 있는 아카이브 리두 로그 파일이 필요한 경우가 많이 있습니다.
그래서 복구를 할 때 다른 노드에 있는 아카이브 리두 로그 파일을 복구하는 노드로 복사해 두고 작업하셔야 합니다.
아카이브 로그 파일이 너무 많이 필요할 경우는 복사하는 시간이 너무 걸리기 때문에 아카이브 파일 설정을 하실 때
dest_1 은 local node 로 하시고 desc_2 는 공유 노드를 활용하시는 것도 한가지 방법이 될 수 있을 것 같습니다.
Case 3. Offline 안 되는 데이터 파일장애 발생
Step 1. 장애 상황 발생
SQL> create table tt03 (no number) tablespace system;
Table created.
SQL> insert into tt03 values (10);
1 row created.
SQL> insert into tt03 values (20);
1 row created.
SQL> insert into tt03 values (30);
1 row created.
SQL> commit;
Commit complete.
SQL> alter system switch logfile;
System altered.
SQL>/
System altered.
SQL> /
System altered.
SQL> @dd
TABLESPACE MB FILE_NAME
------------------ ---------- ------------------------------
SYSTEM 599 /dev/raw/raw6
UNDOTBS1 99 /dev/raw/raw8
SYSAUX 299 /dev/raw/raw7
UNDOTBS2 99 /dev/raw/raw9
USERS 99 /dev/raw/raw10
TS_NEW 12 /dev/raw/raw28
SQL> !dd if=/dev/zero of=/dev/raw/raw6 bs=8k <- system tablespace 장애 발생 시킴
dd: writing `/dev/raw/raw6': 장치에 남은 공간이 없음
76801+0개의 레코드를 입력하였습니다
76800+0개의 레코드를 출력하였습니다
Alert log 를 확인하면 에러가 나면서 강제로 종료됨을 확인할 수 있습니다.
………………………………………
ORA-00600: 내부 오류 코드, 인수 : [4193], [0], [57], [], [], [], [], []
Fatal internal error happened while SMON was doing instance transaction recovery.
Thu Oct 7 00:21:06 2010
Errors in file /home/oracle/admin/racdb/bdump/racdb1_smon_5882.trc:
ORA-00600: 내부 오류 코드, 인수 : [kclbr_9], [], [], [], [], [], [], []
ORA-00607: 데이터 블록 변경 중 내부 오류가 발생했습니다
ORA-00600: 내부 오류 코드, 인수 : [4193], [0], [57], [], [], [], [], []
SMON: terminating instance due to error 474
Thu Oct 7 00:21:06 2010
Errors in file /home/oracle/admin/racdb/bdump/racdb1_lms1_5865.trc:
ORA-00474: SMON 프로세스가 오류로 인해 종료되었습니다.
Thu Oct 7 00:21:06 2010
Errors in file /home/oracle/admin/racdb/bdump/racdb1_lmon_5857.trc:
ORA-00474: SMON 프로세스가 오류로 인해 종료되었습니다.
[oracle@racdb1 ~]$ crs_stat –t
Name Type Target State Host
--------------- -------------- ------------ ------------ -------
ora.racdb.db application OFFLINE OFFLINE
ora....b1.inst application ONLINE OFFLINE
ora....b2.inst application ONLINE OFFLINE
ora....B1.lsnr application ONLINE ONLINE racdb1
ora.racdb1.gsd application ONLINE ONLINE racdb1
ora.racdb1.ons application ONLINE ONLINE racdb1
ora.racdb1.vip application ONLINE ONLINE racdb1
ora....B2.lsnr application ONLINE ONLINE racdb2
ora.racdb2.gsd application ONLINE ONLINE racdb2
ora.racdb2.ons application ONLINE ONLINE racdb2
ora.racdb2.vip application ONLINE ONLINE racdb2
Step 2. 파일 복원 후 복구
SQL> shutdown immediate;
ORA-03135: connection lost contact
SQL> !scp racdb2:/data/arc2/2_* /data/arc2/ <- node 2 아카이브 파일 복사해 옴.
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
[oracle@racdb1 ~]$ sqlplus / as sysdba;
SQL*Plus: Release 10.2.0.4.0 - Production on Thu Oct 7 00:24:59 2010
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to an idle instance.
SQL>!dd if=/data/backup/open/raw6_system of=/dev/raw/raw6 bs=8k
76800+0개의 레코드를 입력하였습니다
76800+0개의 레코드를 출력하였습니다
SQL> startup mount;
ORACLE instance started.
Total System Global Area 281018368 bytes
Fixed Size 1267020 bytes
Variable Size 92277428 bytes
Database Buffers 180355072 bytes
Redo Buffers 7118848 bytes
Database mounted.
SQL> recover database;
ORA-00279: change 798299 generated at 10/06/2010 00:27:21 needed for thread 1
ORA-00289: suggestion : /data/arc2/1_23_730146831.dbf
ORA-00280: change 798299 for thread 1 is in sequence #23
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 798299 generated at 10/06/2010 00:00:21 needed for thread 2
ORA-00289: suggestion : /data/arc2/2_12_730146831.dbf
ORA-00280: change 798299 for thread 2 is in sequence #12
ORA-00279: change 840626 generated at 10/06/2010 12:18:19 needed for thread 2
ORA-00289: suggestion : /data/arc2/2_13_730146831.dbf
ORA-00280: change 840626 for thread 2 is in sequence #13
ORA-00278: log file '/data/arc2/2_12_730146831.dbf' no longer needed for this
recovery
-----( 중간 생략 ) -----Log applied.
Media recovery complete.
Step 3. 양쪽 노드 모두 startup 시킨 후 복구 확인
SQL> alter database open;
Database altered.
SQL> select * from tt03;
NO
---------------
10
20
30
Case 4. 백업 없는 데이터 파일 새로 생성해서 복구하기
상황 1 : 여분의 raw devicce 가 있을 경우
SYS>create tablespace test
2 datafile '/dev/raw/raw29' ;
Tablespace created.
SYS>@dd
TABLESPACE MB FILE_NAME
---------------- ---------- ---------------------------------------------
SYSTEM 590 /dev/raw/raw6
UNDOTBS1 295 /dev/raw/raw8
SYSAUX 290 /dev/raw/raw7
UNDOTBS2 290 /dev/raw/raw9
USERS 290 /dev/raw/raw10
TEST 99.9921875 /dev/raw/raw29
6 rows selected.
-- 테스트용 테이블을 생성합니다.
SYS>create table scott.tt100 (no number) tablespace test ;
Table created.
SYS>insert into scott.tt100 values (1);
1 row created.
SYS>commit;
Commit complete.
SYS>select * from scott.tt100 ;
NO
--------------
1
Step 2. 장애를 발생시킵니다.
SYS>!dd if=/dev/zero of=/dev/raw/raw29 bs=8k
dd: writing `/dev/raw/raw29': 장치에 남은 공간이 없음
12801+0개의 레코드를 입력하였습니다
12800+0개의 레코드를 출력하였습니다
SYS>alter tablespace test offline immediate;
Tablespace altered.
SYS>alter tablespace test online;
alter tablespace test online
*
ERROR at line 1:
ORA-01122: database file 6 failed verification check
ORA-01110: data file 6: '/dev/raw/raw29'
ORA-01251: Unknown File Header Version read for file number 6
SYS>select * from scott.tt100 ;
select * from scott.tt100
*
ERROR at line 1:
ORA-00376: file 6 cannot be read at this time
ORA-01110: data file 6: '/dev/raw/raw29'
복구해야 하는 데이터파일의 백업이 없으므로 싱글에서와 같이 신규로 생성합니다.
중요한 부분은 경로인데 파일 시스템에서와 raw device 에서 차이점이 있습니다.
바로 raw device 에서는 같은 경로를 쓰면 안 된다는 것입니다.
아래의 테스트로 확인 해 보겠습니다.
SYS>alter database create datafile '/dev/raw/raw29'
2 as '/dev/raw/raw29';
alter database create datafile '/dev/raw/raw29'
*
ERROR at line 1:
ORA-01119: error in creating database file '/dev/raw/raw29'
ORA-27086: unable to lock file - already in use
Linux Error: 11: Resource temporarily unavailable
Additional information: 8
Additional information: 29491
SYS>alter database create datafile '/dev/raw/raw29'
2 as '/dev/raw/raw30' ; <--- 다른 경로로 설정을 했습니다
Database altered.
SYS>recover tablespace test;
Media recovery complete.
SYS>alter tablespace test online;
Tablespace altered.
SYS>select * from scott.tt100 ;
NO
---------------1 <--- 복구 완료되었습니다.
싱글에서와 복구 방법은 동일하지만 파일을 생성할 때 경로를 다른 곳으로 해야 한다는 것을 꼭 기억하시기 바랍니다.
상황 2: 여분의 raw device 가 없을 경우 - 파일시스템 사용
만약 생성되어 있는 raw device 가 여분이 없을 경우에는 아래와 같이 우선 파일시스템에 생성해서 복구 한 후 추후 raw device 로 이전하면 됩니다.
아래 실습을 보세요.
Step 1. 장애 상황을 만듭니다.
SYS>create tablespace test2
2 datafile '/dev/raw/raw31' ;
Tablespace created.
SYS>@dd
TABLESPACE MB FILE_NAME
------------------ ---------- ---------------------------------------------
SYSTEM 590 /dev/raw/raw6
UNDOTBS1 295 /dev/raw/raw8
SYSAUX 290 /dev/raw/raw7
UNDOTBS2 290 /dev/raw/raw9
USERS 290 /dev/raw/raw10
TEST 99.9921875 /dev/raw/raw30
TEST2 99.9921875 /dev/raw/raw31
7 rows selected.
SYS>create table scott.tt200 (no number) tablespace test2;
Table created.
SYS>insert into scott.tt200 values (2);
1 row created.
SYS>commit;
Commit complete.
SYS>select * from scott.tt200 ;
NO
---------------2
SYS>!dd if=/dev/zero of=/dev/raw/raw31 bs=8k
dd: writing `/dev/raw/raw31': 장치에 남은 공간이 없음
12801+0개의 레코드를 입력하였습니다
12800+0개의 레코드를 출력하였습니다
SYS>alter tablespace test2 offline immediate;
Tablespace altered.
SYS>alter tablespace test2 online;
alter tablespace test2 online
*
ERROR at line 1:
ORA-01122: database file 7 failed verification check
ORA-01110: data file 7: '/dev/raw/raw31'
ORA-01251: Unknown File Header Version read for file number 7
SYS>select * from scott.tt200 ;
select * from scott.tt200
*
ERROR at line 1:
ORA-00376: file 7 cannot be read at this time
ORA-01110: data file 7: '/dev/raw/raw31'
Step 2. 복구를 합니다.
SYS>alter database create datafile '/dev/raw/raw31'
2 as '/data/backup/test01.dbf' ; <--- 파일 시스템에 응급 복구합니다.
Database altered.
SYS>recover tablespace test2;
Media recovery complete.
SYS>alter tablespace test2 online;
Tablespace altered.
SYS>select * from scott.tt200 ;
NO
---------------2
SYS>@dd
TABLESPACE MB FILE_NAME
---------- ---------- ---------------------------------------------
SYSTEM 590 /dev/raw/raw6
UNDOTBS1 295 /dev/raw/raw8
SYSAUX 290 /dev/raw/raw7
UNDOTBS2 290 /dev/raw/raw9
USERS 290 /dev/raw/raw10
TEST 99.9921875 /dev/raw/raw30
TEST2 99.9921875 /data/backup/test01.dbf <--- 파일시스템에 생성되었습니다.
7 rows selected.
향후에 raw device 가 증설되었다고 가정하고 현재 파일시스템에 생성된 데이터 파일을 raw device 로 이전하겠습니다.
SYS>alter tablespace test2 offline;
Tablespace altered.
SYS>alter database create datafile '/data/backup/test01.dbf'
2 as '/dev/raw/raw32' ; <--- raw device 이름을 지정합니다.
Database altered.
SYS>recover tablespace test2 ;
Media recovery complete.
SYS>alter tablespace test2 online;
Tablespace altered.
SYS>@dd
TABLESPACE MB FILE_NAME
-------------------- ---------- ---------------------------------------------
SYSTEM 590 /dev/raw/raw6
UNDOTBS1 295 /dev/raw/raw8
SYSAUX 290 /dev/raw/raw7
UNDOTBS2 290 /dev/raw/raw9
USERS 290 /dev/raw/raw10
TEST 99.9921875 /dev/raw/raw30
TEST2 99.9921875 /dev/raw/raw32
7 rows selected.
SYS>select * from scott.tt200;
NO
---------------
2 <--- 이전 완료되고 데이터도 이상 없이 조회됩니다.
이상으로 데이터 파일 관련된 물리적인 장애들을 모두 살펴보았습니다.
다음으로 데이터 파일 관련된 논리적 장애들을 살펴보겠습니다.