반응형
/********************************************************************************************
-- Title : [8i] 오라클 DB의 완전 복구(OLN)
-- Reference : OLN
-- Key word :
********************************************************************************************/
/****************************************************************************************
-- 온라인 리두 로그 파일 손상 체크
****************************************************************************************/
-- 온라인 리두 로그 파일에 필요한 리두 로그가 모두 존재하는지 확인.
SQL> SELECT *
2 > FROM v$recover_file;
-- Title : [8i] 오라클 DB의 완전 복구(OLN)
-- Reference : OLN
-- Key word :
********************************************************************************************/
/****************************************************************************************
-- 온라인 리두 로그 파일 손상 체크
****************************************************************************************/
-- 온라인 리두 로그 파일에 필요한 리두 로그가 모두 존재하는지 확인.
SQL> SELECT *
2 > FROM v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME
----- -------- -------- ---------- ----------
2 OFFLINE 56744 09-MAR-01
-- 복구에 필요한 리두 로그 데이터가 온라인 리두 로그 파일에 존재하는지 확인.
SQL> SELECT group#, sequence#, first_change#, status
2 FROM v$log;
----- -------- -------- ---------- ----------
2 OFFLINE 56744 09-MAR-01
-- 복구에 필요한 리두 로그 데이터가 온라인 리두 로그 파일에 존재하는지 확인.
SQL> SELECT group#, sequence#, first_change#, status
2 FROM v$log;
GROUP# SEQUENCE# FIRST_CHANGE# STATUS
---------- ---------- ------------- ----------------
1 478 49288 CURRENT
2 476 49183 INACTIVE
3 477 49225 INACTIVE
---------- ---------- ------------- ----------------
1 478 49288 CURRENT
2 476 49183 INACTIVE
3 477 49225 INACTIVE
/****************************************************************************************
-- 복구를 위해 필요한 파일
****************************************************************************************/
ㅇv$recover_file : 복구가 필요한 데이터 파일 찾기
ㅇv$archive_log : 데이터베이스의 모든 아카이브 로그 리스트 알기
ㅇv$recovery_log : 복구 위해 필요한 모든 아카이브 로그 리스트 알기
-- 복구가 필요한 데이터파일 찾기
SVRMGR> select * from v$recover_file:
SVRMGR> select * from v$recover_file:
FILE# ONLINE ERROR CHANGE# TIME
----- ------- ----- ------- ---------
2 OFFLINE 288772 02-DEC-97
----- ------- ----- ------- ---------
2 OFFLINE 288772 02-DEC-97
-- 적용할 아키이브 로그 찾기
SVRMGR> select * from v$recovery_log;
SVRMGR> select * from v$recovery_log;
THREAD# SEQUENCE# TIME ARCHIVE_NAME
------- --------- --------- --------------------------
1 34 02-DEC-97 /disk1/archive/arch_34.rdo
...
1 43 04-DEC-97 /disk1/archive/arch_43.rdo
1 44 04-DEC-97 /disk1/archive/arch_44.rdo
------- --------- --------- --------------------------
1 34 02-DEC-97 /disk1/archive/arch_34.rdo
...
1 43 04-DEC-97 /disk1/archive/arch_43.rdo
1 44 04-DEC-97 /disk1/archive/arch_44.rdo
SVRMGR> recover datafile 2;
ORA-00279 : change 288772...12/02/97 15:32:29 needed for thread 1
ORA-00289 : suggestion : /disk1/archive/arch_34.rdo
ORA-00280 : change 288772 for thread 1 is in sequence #34
Specify log : {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00279 : change 288772...12/02/97 15:32:29 needed for thread 1
ORA-00289 : suggestion : /disk1/archive/arch_34.rdo
ORA-00280 : change 288772 for thread 1 is in sequence #34
Specify log : {<RET>=suggested | filename | AUTO | CANCEL}
/****************************************************************************************
-- 복구 정보 검색
****************************************************************************************/
-- 복구 상태 정보 뷰 : 이 뷰들에 대한 정보는 "alter database recover"명령 수행시
서버 프로세스의 PGA에 존재한다. 따라서 다른 세션에서 볼 수 없다.
ㅇv$recovery_status : 전반적인 데이터베이스 복구 정보를 갖고 있음.
ㅇv$recovery_file_status : 복구가 필요한 각 데이터파일에 대한 정보 소유.
-- 복구 상태 예(샘플)
SVRMGR> alter database recover datafile 2;
alter database recover datafile 2
*
ORA-00279: change 148448...11/29/97/ 17:04:20 needed for thread 1
ORA-00289: suggestion : /disk1/archive/arch_6.rdo
ORA-00280: change 148448 for thread 1 is in sequence #6
SVRMGR> alter database recover datafile 2;
alter database recover datafile 2
*
ORA-00279: change 148448...11/29/97/ 17:04:20 needed for thread 1
ORA-00289: suggestion : /disk1/archive/arch_6.rdo
ORA-00280: change 148448 for thread 1 is in sequence #6
SVRMGR> select * from v$recovery_status;
RECOVERY THREAD SEQ_NEEDED SCN_NEEDED TIME_NEED PREV_LOG
--------- ------ ---------- ---------- --------- --------
29-NOV-97 1 6 0 29-NOV-97 NONE
1 row selected.
RECOVERY THREAD SEQ_NEEDED SCN_NEEDED TIME_NEED PREV_LOG
--------- ------ ---------- ---------- --------- --------
29-NOV-97 1 6 0 29-NOV-97 NONE
1 row selected.
SVRMGR> select * from v$recovery_file_status;
FILENUM FILENAME STATUS
------- --------------------- ---------------
6 /disk1/data/df2.dbf IN RECOVERY
1 row selected.
FILENUM FILENAME STATUS
------- --------------------- ---------------
6 /disk1/data/df2.dbf IN RECOVERY
1 row selected.
/****************************************************************************************
-- 다른 위치로 복원
****************************************************************************************/
-- data/system01.dbf 파일을 data2폴더로 카피
$ cp ./data/system01.dbf ./data2/
$ sqlplus internal
SQL*Plus: Release 8.1.7.0.0 - Production on Wed Sep 1 08:18:40 2004
(c) Copyright 2000 Oracle Corporation. All rights reserved.
Connected to an idle instance.
SQL> STARTUP MOUNT
ORACLE instance started.
Total System Global Area 25419936 bytes
Fixed Size 73888 bytes
Variable Size 24449024 bytes
Database Buffers 819200 bytes
Redo Buffers 77824 bytes
Fixed Size 73888 bytes
Variable Size 24449024 bytes
Database Buffers 819200 bytes
Redo Buffers 77824 bytes
Database mounted.
SQL> ALTER DATABASE RENAME FILE
2 '/export/home/oracle8i/iORCL/data/system01.dbf'
3 TO '/export/home/oracle8i/iORCL/data2/system01.dbf';
2 '/export/home/oracle8i/iORCL/data/system01.dbf'
3 TO '/export/home/oracle8i/iORCL/data2/system01.dbf';
Database altered.
SQL> ALTER DATABASE OPEN;
Database altered.
/****************************************************************************************
-- 완전 복구 방법
****************************************************************************************/
ㅇ방법 1. 닫힌 데이터베이스 복구
- 24시간 운영하는 데이터베이스가 아닌 경우
- 복구되는 파일이 시스템 또는 롤백 세그먼트 테이블스페이스에 속할 경우
- 전체 데이터베이스 또는 배부분의 데이터 파일 복구가 필요한 경우
ㅇ방법 2. 초기에 오픈 상태로 오픈 데이터베이스 복구
- 파일 손상, 우발적 파일 손실, 미디어 장애가 발생하여 데이터베이스가 종료되지 않은 상황
- 24시간 운영되는 데이터베이스로 down-time을 최소한으로 유지해야 하는 경우
- 복구된 파일들이 시스템이나 롤백 테이블 스페이스에 속하지 않는 경우
ㅇ방법 3. 초기에 닫힌 상태로 오픈 데이터베이스 복구
- 미디어 또는 하드웨어 장애로 시스템이 다운 되었을 때
- 24시간 운영되는 데이터베이스로 down-time을 최소한으로 유지해야 하는 경우
- 복구된 파일들이 시스템이나 롤백 테이블 스페이스에 속하지 않는 경우
ㅇ방법 4. 백업없이 데이터파일 복구
- 미디어 또는 사용자 장애로 인해 전혀 백업 받지 않은 데이터파일의 손실을 초래한 경우
- 파일이 생성된 이후로 모든 아카이브 로그가 존재하는 경우
- 저장되는 파일들이 시스템이나 롤백 테이블스페이스에 속하지 않는 경우
/****************************************************************************************
-- RECOVER 구문
****************************************************************************************/
-- 닫힌 데이터베이스 복구 예
SQL> recover database;
SQL> recover datafile '/disk1/data/df2.dbf'
SQL> alter database recover database;
-- 열린 데이터베이스 복구 예
SQL> recover tablespace USER_DATA;
SQL> recover datafile 2:
SQL> alter database recover datafile 2;
SQL> recover tablespace USER_DATA;
SQL> recover datafile 2:
SQL> alter database recover datafile 2;
/****************************************************************************************
-- 아카이브를 다른 위치에 복원
****************************************************************************************/
-- "recover" 프롬프트에서 위치 및 이름 명시
specify log: {<RET>=suggested | filename | AUTO | CANCEL}
-- "alter system archive" 명령 사용
SQL> alter system archive log start to <new location>;
SQL> alter system archive log start to <new location>;
-- "recover from <location>" 명령 사용
SQL > recover from '<new location>' database;
SQL > recover from '<new location>' database;
/****************************************************************************************
-- 자동적으로 리두로그 파일 적용
****************************************************************************************/
-- 1. 미디어 복구 시작 전에 명령문 사용
SVRMGR > set autorecovery on
-- 2. 리두로그 파일 요청 프롬프트시 auto 입력
SVRMGR > recover datafile 4;
ORA-00279: change 308810...12/02/97/ 17:00:14 needed for thread 1
ORA-00289: suggestion : /disk1/archive/arch_35.rdo
ORA-00280: change 308810 for thread 1 is in sequence #35
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
AUTO
Log applied.
...
-- 3. 복구 명령에서 "automatic" 옵션 사용
SVRMGR > recover automatic datafile 4;
Media recovery complete.
SVRMGR > recover datafile 4;
ORA-00279: change 308810...12/02/97/ 17:00:14 needed for thread 1
ORA-00289: suggestion : /disk1/archive/arch_35.rdo
ORA-00280: change 308810 for thread 1 is in sequence #35
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
AUTO
Log applied.
...
-- 3. 복구 명령에서 "automatic" 옵션 사용
SVRMGR > recover automatic datafile 4;
Media recovery complete.
/****************************************************************************************
-- 완전 복구 : 방법 1 (Closed Databse)
****************************************************************************************/
-- 1. 임의 에러 생성(shutdown후 system01.dbf를 과거 파일로 대체)
-- 2. 에러 확인(다시 startup시 에러 발생)
SQL> STARTUP
...
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '/export/home/oracle8i/iORCL/data2/system01.dbf'
-- 완전 복구 : 방법 1 (Closed Databse)
****************************************************************************************/
-- 1. 임의 에러 생성(shutdown후 system01.dbf를 과거 파일로 대체)
-- 2. 에러 확인(다시 startup시 에러 발생)
SQL> STARTUP
...
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '/export/home/oracle8i/iORCL/data2/system01.dbf'
-- 3. 전체 shutdown
SQL> SHUTDOWN
SQL> SHUTDOWN
Database closed.
Database dismounted.
ORACLE instance shut down.
Database dismounted.
ORACLE instance shut down.
-- 4. 백업으로부터 파일 복원(이용 가능할 시 가장 최근 것)
$ cp /backup/systemp01.dbf ../../iORCL/systs/
$ cp /backup/systemp01.dbf ../../iORCL/systs/
-- 5. mount 모드로 인스턴스 기동
SQL> STARTUP MOUNT PFILE=$ORACLE_HOME/iORCL/init/initORCL.ora
SQL> STARTUP MOUNT PFILE=$ORACLE_HOME/iORCL/init/initORCL.ora
ORACLE instance started.
-- 6. 데이터 파일 복구
SQL> RECOVER DATAFILE '/export/home/oracle8i/iORCL/systs/system01.dbf';
SQL> RECOVER DATAFILE '/export/home/oracle8i/iORCL/systs/system01.dbf';
Media recovery complete.
-- 7. 데이터베이스 오픈
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE OPEN;
Database altered.
-- 8. 장애 발생 시점으로 데이터파일 복원에 필요한 아카이브 로그 및 리두로그 적용 확인.
-- 9. 추후, 사용자에게 데이터베이스가 이용가능하며 시스템 장애 전의 커밋 안된 데이터는
재입력해야 한다고 공지.
재입력해야 한다고 공지.
-- 주. ㅇ적용할 많은 아카이브 로그 존재시 "recover"명령의 "automatic"기능을 사용하거나
다음 Server Manager 명령을 사용.
svrmgr> set autorecovery on
svrmgr> recover database;
ㅇ이용 가능한 스페이스가 존재 시 log_archive_dest에 명시된 위치로 필요한 아카이브
리두 로그 파일을 저장한다.
다음 Server Manager 명령을 사용.
svrmgr> set autorecovery on
svrmgr> recover database;
ㅇ이용 가능한 스페이스가 존재 시 log_archive_dest에 명시된 위치로 필요한 아카이브
리두 로그 파일을 저장한다.
/****************************************************************************************
-- 완전 복구 : 방법 2 (Open Database, Initially Opened)
****************************************************************************************/
-- 1. 데이터파일과 테이블스페이스 확인
SQL> SELECT file_id f#, file_name, tablespace_name tablespace, status
2 FROM dba_data_files;
-- 완전 복구 : 방법 2 (Open Database, Initially Opened)
****************************************************************************************/
-- 1. 데이터파일과 테이블스페이스 확인
SQL> SELECT file_id f#, file_name, tablespace_name tablespace, status
2 FROM dba_data_files;
F# FILE_NAME TABLESPACE STATUS
------- ----------------------------------------------- ----------- ----------
1 /export/home/oracle8i/iORCL/data2/system01.dbf SYSTEM AVAILABLE
2 /export/home/oracle8i/iORCL/systs/tools01.dbf TOOLS AVAILABLE
3 /export/home/oracle8i/iORCL/systs/rbs01.dbf RBS AVAILABLE
4 /export/home/oracle8i/iORCL/systs/temp01.dbf TEMP AVAILABLE
5 /export/home/oracle8i/iORCL/systs/users01.dbf USERS AVAILABLE
6 /export/home/oracle8i/iORCL/systs/indx01.dbf INDX AVAILABLE
------- ----------------------------------------------- ----------- ----------
1 /export/home/oracle8i/iORCL/data2/system01.dbf SYSTEM AVAILABLE
2 /export/home/oracle8i/iORCL/systs/tools01.dbf TOOLS AVAILABLE
3 /export/home/oracle8i/iORCL/systs/rbs01.dbf RBS AVAILABLE
4 /export/home/oracle8i/iORCL/systs/temp01.dbf TEMP AVAILABLE
5 /export/home/oracle8i/iORCL/systs/users01.dbf USERS AVAILABLE
6 /export/home/oracle8i/iORCL/systs/indx01.dbf INDX AVAILABLE
-- 2. 데이터파일을 오프라인으로 할 필요가 있는지 결정한다.
SQL> SELECT d.file# f#, d.name, d.status, h.status
2 FROM v$datafile d, v$datafile_header h
3 WHERE d.file# = h.file#;
F# NAME STATUS STATUS
------- ----------------------------------------------- ------- -------
1 /export/home/oracle8i/iORCL/data/system01.dbf SYSTEM ONLINE
2 /export/home/oracle8i/iORCL/systs/tools01.dbf ONLINE ONLINE
3 /export/home/oracle8i/iORCL/systs/rbs01.dbf ONLINE ONLINE
4 /export/home/oracle8i/iORCL/systs/temp01.dbf ONLINE ONLINE
5 /export/home/oracle8i/iORCL/systs/users01.dbf RECIVER OFFLINE
6 /export/home/oracle8i/iORCL/systs/indx01.dbf ONLINE ONLINE
SQL> SELECT d.file# f#, d.name, d.status, h.status
2 FROM v$datafile d, v$datafile_header h
3 WHERE d.file# = h.file#;
F# NAME STATUS STATUS
------- ----------------------------------------------- ------- -------
1 /export/home/oracle8i/iORCL/data/system01.dbf SYSTEM ONLINE
2 /export/home/oracle8i/iORCL/systs/tools01.dbf ONLINE ONLINE
3 /export/home/oracle8i/iORCL/systs/rbs01.dbf ONLINE ONLINE
4 /export/home/oracle8i/iORCL/systs/temp01.dbf ONLINE ONLINE
5 /export/home/oracle8i/iORCL/systs/users01.dbf RECIVER OFFLINE
6 /export/home/oracle8i/iORCL/systs/indx01.dbf ONLINE ONLINE
-- 3. 이 파일이 오프라인 상태기에 복원 가능. 백업된 해당 파일을 카피
SQL이 실행중인 창은 그대로 두고 다른 창을 띄어 카피한다.
오라클은 계속 online중. users TS만 offline.
$ cp /backup/users01.dbf ../../iORCL/systs/
SQL이 실행중인 창은 그대로 두고 다른 창을 띄어 카피한다.
오라클은 계속 online중. users TS만 offline.
$ cp /backup/users01.dbf ../../iORCL/systs/
-- 4. 복원된 데이터파일에 아카이브와 리두로그 적용
SQL> RECOVER DATAFILE '/export/home/oracle8i/iORCL/systs/users01.dbf'
Media recovery complete.
또는
SQL> RECOVER TABLESPACE USERS;
SQL> RECOVER DATAFILE '/export/home/oracle8i/iORCL/systs/users01.dbf'
Media recovery complete.
또는
SQL> RECOVER TABLESPACE USERS;
-- 5. 온라인 상태로 만든다.
SQL> ALTER TABLESPACE USERS online;
Tablespace altered.
또는
SQL> ALTER DATABSE DATAFILE
2 '/export/home/oracle8i/iORCL/systs/users01.dbf' online;
SQL> ALTER TABLESPACE USERS online;
Tablespace altered.
또는
SQL> ALTER DATABSE DATAFILE
2 '/export/home/oracle8i/iORCL/systs/users01.dbf' online;
-- 주. ㅇ오라클은 가끔씩 파일 문제를 발견하여 해당 파일을 오프라인 상태로 만든다. 복구 전
어떤 에러가 있는지 조사하기 위해 alert log를 항상 검사하고 또한 파일의 상태를
점검해야 한다. offline 파일 자체도 복구가 요구될 수 있다.
ㅇ테이블스페이스가 오프라인 상태일 때 해당 데이터파일 내부에 포함되어 있는 데이터만
액세스될 수 없다. 해당 테이블 스페이스는 여전히 이용 가능한 상태로 남아있다.
어떤 에러가 있는지 조사하기 위해 alert log를 항상 검사하고 또한 파일의 상태를
점검해야 한다. offline 파일 자체도 복구가 요구될 수 있다.
ㅇ테이블스페이스가 오프라인 상태일 때 해당 데이터파일 내부에 포함되어 있는 데이터만
액세스될 수 없다. 해당 테이블 스페이스는 여전히 이용 가능한 상태로 남아있다.
/****************************************************************************************
-- 완전 복구 : 방법 3 (Open Database, Initially Closed)
****************************************************************************************/
-- 1. 조사시 미디어 오류로 가정.
$ORACLE_HOME/iORCL/systs/users01.dbf를 $ORACLE_HOME/iORCL/data/users01.dbf로 옮기고
새로운 미디어를 사용한다고 가정함.
-- 완전 복구 : 방법 3 (Open Database, Initially Closed)
****************************************************************************************/
-- 1. 조사시 미디어 오류로 가정.
$ORACLE_HOME/iORCL/systs/users01.dbf를 $ORACLE_HOME/iORCL/data/users01.dbf로 옮기고
새로운 미디어를 사용한다고 가정함.
-- 2. 데이터베이스를 마운트하고 user01.dbf가 오픈되지 않는다고 가정한다.
만약 users01.dbf가 어느 테이블스페이스에 속하는지 모른다면 두번째 쿼리를 사용한다.
SQL> STARTUP MOUNT PFILE=$ORACLE_HOME/iORCL/init/initORCL.ora
만약 users01.dbf가 어느 테이블스페이스에 속하는지 모른다면 두번째 쿼리를 사용한다.
SQL> STARTUP MOUNT PFILE=$ORACLE_HOME/iORCL/init/initORCL.ora
Database Mounted.
SQL> SELECT d.file#, d.ts#, h.tablespace_name ts_name, d.name, h.error
2 FROM v$datafile d, v$datafile_header h
3 WHERE d.file# = h.file#;
SQL> SELECT d.file#, d.ts#, h.tablespace_name ts_name, d.name, h.error
2 FROM v$datafile d, v$datafile_header h
3 WHERE d.file# = h.file#;
FILE# TS# TS_NAME NAME ERROR
------- ------- ------- ---------------------------------------------- ---------------
1 0 SYSTEM /export/home/oracle8i/iORCL/data/system01.dbf
2 1 TOOLS /export/home/oracle8i/iORCL/systs/tools01.dbf
3 2 RBS /export/home/oracle8i/iORCL/systs/rbs01.dbf
4 3 TEMP /export/home/oracle8i/iORCL/systs/temp01.dbf
5 4 USERS /export/home/oracle8i/iORCL/systs/users01.dbf FILE NOT FOUND
6 5 INDX /export/home/oracle8i/iORCL/systs/indx01.dbf
------- ------- ------- ---------------------------------------------- ---------------
1 0 SYSTEM /export/home/oracle8i/iORCL/data/system01.dbf
2 1 TOOLS /export/home/oracle8i/iORCL/systs/tools01.dbf
3 2 RBS /export/home/oracle8i/iORCL/systs/rbs01.dbf
4 3 TEMP /export/home/oracle8i/iORCL/systs/temp01.dbf
5 4 USERS /export/home/oracle8i/iORCL/systs/users01.dbf FILE NOT FOUND
6 5 INDX /export/home/oracle8i/iORCL/systs/indx01.dbf
-- 3. 데이터파일이 오프라인이 아니라면 데이터베이스는 오픈되지 않는다. 따라서 오프라인을
다음 명령으로 실행한다.
다음 명령으로 실행한다.
SQL> ALTER DATABASE DATAFILE
2 '/export/home/oracle8i/iORCL/systs/users01.dbf' OFFLINE;
2 '/export/home/oracle8i/iORCL/systs/users01.dbf' OFFLINE;
Database altered.
-- 4. 데이터베이스가 이제 오픈될 수 있다.
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE OPEN;
Database altered.
-- 5. 백업 디바이스로 부터 새로운 미디어에 users01.dbf 파일 카피
$ cp /backup/users01.dbf $ORACLE_HOME/iORCL/data/
$ cp /backup/users01.dbf $ORACLE_HOME/iORCL/data/
-- 6. 새로운 위치의 파일을 오라클에 통보한다. 데이터베이스가 오픈되고 테이블스페이스 복구가
요구될 때 이 데이터파일을 소유하고 있는 테이블스페이스 이름을 알기 위해 두번 째 명령을
사용한다.
SQL> ALTER DATABASE RENAME FILE
2 '/export/home/oracle8i/iORCL/systs/users01.dbf'
3 TO '/export/home/oracle8i/iORCL/data/users01.dbf';
요구될 때 이 데이터파일을 소유하고 있는 테이블스페이스 이름을 알기 위해 두번 째 명령을
사용한다.
SQL> ALTER DATABASE RENAME FILE
2 '/export/home/oracle8i/iORCL/systs/users01.dbf'
3 TO '/export/home/oracle8i/iORCL/data/users01.dbf';
Database altered.
SQL> SELECT file_id f#, file_name, tablespace_name ts_name, status
2 FROM dba_data_files;
2 FROM dba_data_files;
F# FILE_NAME TS_NAME STATUS
------- ----------------------------------------------- ------- ---------
1 /export/home/oracle8i/iORCL/data/system01.dbf SYSTEM AVAILABLE
2 /export/home/oracle8i/iORCL/systs/tools01.dbf TOOLS AVAILABLE
3 /export/home/oracle8i/iORCL/systs/rbs01.dbf RBS AVAILABLE
4 /export/home/oracle8i/iORCL/systs/temp01.dbf TEMP AVAILABLE
5 /export/home/oracle8i/iORCL/data/users01.dbf USERS AVAILABLE
6 /export/home/oracle8i/iORCL/systs/indx01.dbf INDX AVAILABLE
------- ----------------------------------------------- ------- ---------
1 /export/home/oracle8i/iORCL/data/system01.dbf SYSTEM AVAILABLE
2 /export/home/oracle8i/iORCL/systs/tools01.dbf TOOLS AVAILABLE
3 /export/home/oracle8i/iORCL/systs/rbs01.dbf RBS AVAILABLE
4 /export/home/oracle8i/iORCL/systs/temp01.dbf TEMP AVAILABLE
5 /export/home/oracle8i/iORCL/data/users01.dbf USERS AVAILABLE
6 /export/home/oracle8i/iORCL/systs/indx01.dbf INDX AVAILABLE
-- 7. 복원된 데이터파일에 아카이브 및 리두 로그 적용을 개시한다.
SQL> RECOVER TABLESPACE users;
Media recovery complete.
또는
SQL> RECOVER DATAFILE '/export/home/oracle8i/iORCL/data/users01.dbf';
SQL> RECOVER TABLESPACE users;
Media recovery complete.
또는
SQL> RECOVER DATAFILE '/export/home/oracle8i/iORCL/data/users01.dbf';
-- 8. 복구가 완료되었을 때 모든 데이터파일은 동기화된다. 테이터 파일을 온라인시킨다.
SQL> ALTER TABLESPACE users online;
Tablespace altered.
또는
SQL> ALTER DATABASE DATAFILE '/export/home/oracle8i/iORCL/data/users01.dbf' ONLINE;
SQL> ALTER TABLESPACE users online;
Tablespace altered.
또는
SQL> ALTER DATABASE DATAFILE '/export/home/oracle8i/iORCL/data/users01.dbf' ONLINE;
-- 9. 사용자들에게 데이터베이스가 이용가능하고 시프템 장애 전의 커밋이 안된 데이터는
재입력하라는 통보를 내린다.
재입력하라는 통보를 내린다.
/****************************************************************************************
-- 완전 복구 : 방법 4 (백업없는 데이터파일의 손실)
에러 발생. 차후 재확인 요.
****************************************************************************************/
-- 1. 데이터파일이 손실되었는데 백업본이 없다. 시스템이나 롤백세그먼트 파일이 아니고 과거
동안의 모든 아카이브 로그를 갖고 있음을 가정으로 한다.
-- 2. 데이터베이스가 close되었다면 마운트하고 데이터파일(백업 없음)을 오프라인으로 한 다음
open시킨다. 이렇게 해서 다른 테이블스페이스 사용자의 작업을 계속 진행시킬 수 있다.
데이터베이스가 open되어 있다면 데이터파일만 offline시킨다.
주. 존재하지 않는 파일에 쓰기를 시도하는 체크포인트를 피하기 위해 immediate 옵션 포함.
SQL> ALTER TABLESPACE users OFFLINE IMMEDIATE;
open시킨다. 이렇게 해서 다른 테이블스페이스 사용자의 작업을 계속 진행시킬 수 있다.
데이터베이스가 open되어 있다면 데이터파일만 offline시킨다.
주. 존재하지 않는 파일에 쓰기를 시도하는 체크포인트를 피하기 위해 immediate 옵션 포함.
SQL> ALTER TABLESPACE users OFFLINE IMMEDIATE;
Tablespace altered.
-- 3. 백업 상태를 점검하기 위해 v$recover_file을 검색하여 복구 상태를 확인한다.
SQL> select * from v$recover_file;
SQL> select * from v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME
----- ------- -------------- ------- -----
7 OFFLINE FILE NOT FOUND 0
----- ------- -------------- ------- -----
7 OFFLINE FILE NOT FOUND 0
-- 4. 손실된 데이터파일(백업 없음)을 재생성한다.
SQL> ALTER DATABASE CREATE DATAFILE
2 '/export/home/oracle8i/iORCL/data/users01.dbf' -- 기존 파일
3 AS '/export/home/oracle8i/iORCL/data2/users01.db'; -- 새로운 파일
SQL> ALTER DATABASE CREATE DATAFILE
2 '/export/home/oracle8i/iORCL/data/users01.dbf' -- 기존 파일
3 AS '/export/home/oracle8i/iORCL/data2/users01.db'; -- 새로운 파일
Database altered.
SQL> SELECT * FROM v$recover_file;
FILE# ONLINE ERROR CHANGE# TIME
---------- ------- ------ -------- ----------
5 OFFLINE 22649 04-SEP-04
-- 5. 재생성된 데이터파일에 아카이브와 리두로그를 적용한다.
그러나, 자꾸 이상한 에러가 생겨서 확인 못하고 넘어갔다..ㅡ.ㅜ
SQL> RECOVER TABLESPACE users;
ORA-00279: change 22649 generated at 09/04/2004 11:52:16 needed for thread 1
ORA-00289: suggestion : /export/home/oracle8i/iORCL/arch/arch_1_82.arc
ORA-00280: change 22649 for thread 1 is in sequence #82
---------- ------- ------ -------- ----------
5 OFFLINE 22649 04-SEP-04
-- 5. 재생성된 데이터파일에 아카이브와 리두로그를 적용한다.
그러나, 자꾸 이상한 에러가 생겨서 확인 못하고 넘어갔다..ㅡ.ㅜ
SQL> RECOVER TABLESPACE users;
ORA-00279: change 22649 generated at 09/04/2004 11:52:16 needed for thread 1
ORA-00289: suggestion : /export/home/oracle8i/iORCL/arch/arch_1_82.arc
ORA-00280: change 22649 for thread 1 is in sequence #82
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
ORA-00308: cannot open archived log '/export/home/oracle8i/iORCL/arch/arch_1_82.arc'
ORA-27037: unable to obtain file status
Intel SVR4 UNIX Error: 2: No such file or directory
Additional information: 3
ORA-27037: unable to obtain file status
Intel SVR4 UNIX Error: 2: No such file or directory
Additional information: 3
-- 6. 테이블스페이스를 온라인 시킨다.
SQL> ALTER TABLESPACE users ONLINE;
SQL> ALTER TABLESPACE users ONLINE;
-- 7. 복구 완료가 되었으면 백업 전략에 이 파일을 포함 시키고 해당 테이블 스페이스가 다시
사용 가능한 상태가 되었다고 통보한다.
사용 가능한 상태가 되었다고 통보한다.
/****************************************************************************************
-- 백업 모드에서의 파일 복구(no test)
****************************************************************************************/
-- 백업모드에서의 데이터파일 복구 방법
1. 위에 언급된 완전복구 방법을 사용한 복구
2. 파일을 동기화 시키기 위한 다른 하나의 방법 모색
-- 문제점
1. "alter tablsapce"명령은 데이터베이스가 오픈될 때까지 사용될 수 없으면 데이터베이스
파일들이 동기화되어 오프라인 될 때까지 오픈될 수 없다.
2. 파일들을 오프라인으로 하는 것은 소용이 없는데 이는 "alter tablespace end backup"이
오프라인 상태인 데이터파일에 대해 수행될 수 없기 때문이다.
1. "alter tablsapce"명령은 데이터베이스가 오픈될 때까지 사용될 수 없으면 데이터베이스
파일들이 동기화되어 오프라인 될 때까지 오픈될 수 없다.
2. 파일들을 오프라인으로 하는 것은 소용이 없는데 이는 "alter tablespace end backup"이
오프라인 상태인 데이터파일에 대해 수행될 수 없기 때문이다.
-- 해답(테스트 없이 정리만)
1. 어떤 파일이 복구될 필요가 있는지 확인 할 수 없거나 또한 파일이 "hot backup"모드에
있다면 v$backup뷰를 조회.
SQL> SELECT * FROM v$backup;
FILE# STATUS CHANGE# TIME
----- ---------- ------- ---------
1 NOT ACTIVE 0
2 ACTIVE 228596 30-NOV-97 -- 2번 파일이 핫백업 모드임을 의미
3 NOT ACTIVE 0
4 NOT ACTIVE 0
1. 어떤 파일이 복구될 필요가 있는지 확인 할 수 없거나 또한 파일이 "hot backup"모드에
있다면 v$backup뷰를 조회.
SQL> SELECT * FROM v$backup;
FILE# STATUS CHANGE# TIME
----- ---------- ------- ---------
1 NOT ACTIVE 0
2 ACTIVE 228596 30-NOV-97 -- 2번 파일이 핫백업 모드임을 의미
3 NOT ACTIVE 0
4 NOT ACTIVE 0
2. 파일 2의 헤더를 풀기 위해 다음 명령 사용
SQL> ALTER DATABASE DATAFILE 2 END BACKUP;
Statement processed.
SQL> SELECT * FROM v$backup;
FILE# STATUS CHANGE# TIME
----- ---------- ------- ---------
1 NOT ACTIVE 0
2 NOT ACTIVE 228596 30-NOV-97 -- ACTIVE -> NOT ACTIVE로
3 NOT ACTIVE 0
4 NOT ACTIVE 0
SQL> ALTER DATABASE DATAFILE 2 END BACKUP;
Statement processed.
SQL> SELECT * FROM v$backup;
FILE# STATUS CHANGE# TIME
----- ---------- ------- ---------
1 NOT ACTIVE 0
2 NOT ACTIVE 228596 30-NOV-97 -- ACTIVE -> NOT ACTIVE로
3 NOT ACTIVE 0
4 NOT ACTIVE 0
3. 이제 사용자를 위해 데이터베이스를 오픈한다.
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE OPEN;
/****************************************************************************************
-- 리두 로그 파일 제거(no test)
****************************************************************************************/
-- 손상된 리두 로그 제거에 "unarchived" 옵션 사용
SQL> ALTER DATABASE CLEAR UNARCHIVED
2 logfile group 1;
ㅇ"Alter database clear unarchived logfile"은 다음 두 경우를 극복해 준다.
1. 오직 2개의 로그 그룹이 존재하는 경우
2. 손상된 리두 로그 파일이 현재 그룹에 속할 때
ㅇ주.
1. 이 명령은 조심스럽게 사용해야 한다. 아무런 아카이브 로그가 생성되어 있지 않다면
완전 복구는 불가능하다. 이 명령 완료 후에 백업을 수행해야 한다.
2. 복구를 위해 현재 요구되는 로그 파일은 제거 될 수 없다.
1. 오직 2개의 로그 그룹이 존재하는 경우
2. 손상된 리두 로그 파일이 현재 그룹에 속할 때
ㅇ주.
1. 이 명령은 조심스럽게 사용해야 한다. 아무런 아카이브 로그가 생성되어 있지 않다면
완전 복구는 불가능하다. 이 명령 완료 후에 백업을 수행해야 한다.
2. 복구를 위해 현재 요구되는 로그 파일은 제거 될 수 없다.
-- 오프라인 데이터파일에 의해 요구되는 로그 제거
SQL> ALTER DATABASE CLEAR UNARCHIVED
2 logfile group 1
3 UNRECOVERABLE datafile;
SQL> ALTER DATABASE CLEAR UNARCHIVED
2 logfile group 1
3 UNRECOVERABLE datafile;
ㅇ"Alter database clear logfile ... unrecoverable datafile"은 두 가지 접근 방식이 있다.
1. 로그 파일을 제거하기 전에 모든 데이터파일을 복원하고 불완젆나 복구를 수행한다.
2. 복구 불가능한 데이터파일을 포함하고 있는 테이블스페이스를 삭제한다.
ㅇ주.
1. 이 로그가 필욯나 오프라인 데이터파일은 이 명령 후에 사용할 수 없게 된다.
2. 아카이브 로그는 제거된 로그 파일에 대해 아마도 존재하지 않을 것이다.
3. 이 명령 수행 후에 즉각 백업 받는 것을 고려해야 한다.
1. 로그 파일을 제거하기 전에 모든 데이터파일을 복원하고 불완젆나 복구를 수행한다.
2. 복구 불가능한 데이터파일을 포함하고 있는 테이블스페이스를 삭제한다.
ㅇ주.
1. 이 로그가 필욯나 오프라인 데이터파일은 이 명령 후에 사용할 수 없게 된다.
2. 아카이브 로그는 제거된 로그 파일에 대해 아마도 존재하지 않을 것이다.
3. 이 명령 수행 후에 즉각 백업 받는 것을 고려해야 한다.
/****************************************************************************************
-- 비활성화 리두 로그의 손실
****************************************************************************************/
-- 1. 로그 파일 및 그룹 확인
일단 문제는 없지만 그룹1이 있다고 가정.
SQL> SELECT a.group#, a.member, b.bytes, b.status
2 FROM v$logfile a, v$log b
3 WHERE a.group# = b.group#;
-- 비활성화 리두 로그의 손실
****************************************************************************************/
-- 1. 로그 파일 및 그룹 확인
일단 문제는 없지만 그룹1이 있다고 가정.
SQL> SELECT a.group#, a.member, b.bytes, b.status
2 FROM v$logfile a, v$log b
3 WHERE a.group# = b.group#;
GROUP# MEMBER BYTES STATUS
---------- --------------------------------------------- ---------- ----------------
1 /export/home/oracle8i/iORCL/data/redo01.log 512000 INACTIVE
2 /export/home/oracle8i/iORCL/data/redo02.log 512000 INACTIVE
3 /export/home/oracle8i/iORCL/data/redo03.log 512000 CURRENT
---------- --------------------------------------------- ---------- ----------------
1 /export/home/oracle8i/iORCL/data/redo01.log 512000 INACTIVE
2 /export/home/oracle8i/iORCL/data/redo02.log 512000 INACTIVE
3 /export/home/oracle8i/iORCL/data/redo03.log 512000 CURRENT
-- 2. 그룹이 최소 2개여야 하는데 3개라서 그룹 1 삭제 가능.
그러나 그냥 그룹 1 삭제후 새로 생성함.
그룹이 2개인 경우 새로운 그룹 생성 후 그룹 1을 삭제해야 함.
SQL> ALTER DATABASE DROP LOGFILE GROUP 1;
그러나 그냥 그룹 1 삭제후 새로 생성함.
그룹이 2개인 경우 새로운 그룹 생성 후 그룹 1을 삭제해야 함.
SQL> ALTER DATABASE DROP LOGFILE GROUP 1;
Database altered.
-- 3. 그룹 1 생성
SQL> ALTER DATABASE ADD LOGFILE GROUP 1
2 '/export/home/oracle8i/iORCL/log/log01.log' size 150K;
SQL> ALTER DATABASE ADD LOGFILE GROUP 1
2 '/export/home/oracle8i/iORCL/log/log01.log' size 150K;
Database altered.
-- 4. 로그 파일 물리적 제거
$ rm -rf redo01.log
$ rm -rf redo01.log
-- 5. 필요시 데이터베이스 오픈
SQL> ALTER DATABASE OPEN;
SQL> ALTER DATABASE OPEN;
-- 주. 다른 리두 그룹에서 파일 크기가 같을 경우(이캐도 가능)
SQL> !cp /disk1/DATA/log2a.rdo /disk1/DATA/log1a.rdo
SQL> alter database clear logfile `/disk1/DATA/log1a.rdo`;
SQL> !cp /disk1/DATA/log2a.rdo /disk1/DATA/log1a.rdo
SQL> alter database clear logfile `/disk1/DATA/log1a.rdo`;
반응형