데이터베이스 백업과 복구전략 (2) - 오라클의 데이터베이스 복구
2. DATABASE 복구
2.1 개념
데이터베이스에 이상이 생겨 시스템의 정상작동이 불가능할 경우 백업한 자료를 이용하여 장애발생시점까지의 데이터를 복구하거나, 일정 시간을 기준으로 하여 데이터베이스의 운용시점을 돌려놓으려 하는 작업을 데이터베이스 복구라 한다. 데이터베이스 복구를 위해서는 아래와 같은 환경이 마련되어 있어야 한다.
2.2 복구를 위한 주변 환경
데이터베이스를 복구하기 위해서는 아래와 같은 주변환경이 마련되어 있어야 한다.
가. 장애의 원인은 무엇인지 알 수 있는 환경
- 장애의 원인은 보통 trace file이나 오라클의 alertSID.log파일에 기록되는데 이 파일을 근거로 하여 장애의 원인을 파악할 수 있는 환경이 되어야 한다.
나. 복구를 위해 기존에 백업된 자료가 있는가?
- 장애 유형별로 복구방법이 다르고 복구하고자 하는 시점까지 정확하게 복구가 가능하기 위한 필요한 파일들이 백업이 되어 있어야 한다.
다. 시스템의 가동을 중단할 수 있는가?
- 장애 유형별로 시스템을 가동하지 못하고 사용자의 접속통제가 불가피한 경우 접근통제는 장애진단 후 즉각적으로 처리 될 수 있어야 한다.
라. 복구를 위한 해당 프로덕트 엔지니어에게 기술지원을 받을 준비는 되어 있는가?
- 데이터베이스 전문가와 상의하여야 할 경우는 없는지, 만약 데이터베이스 전문가와의 연락 혹은 방문지원이 필요한 경우 Down Time에 대한 대책은 마련되어 있는가?
2.3 장애 유형별 복구절차
2.3.1 데이터파일 손상 시 복구 절차
System Tablespace가 아닌 Tablespace의 데이터파일 손상이 발생하여 복구를 수행하여야 할 경우에는 에러메세지가 달리 return될 경우가 있다. 이 경웨 에러메세지에 따라 1-1 ~1-4까지 해당되는 부분을 참조하여 복구하도록 한다.
1-1. SYSTEM Tablespace Datafile이 아닌 Datafile의 Recovery
ORA-1116, ORA-1110, ORA-736 8을 Return하는 경우에는 아래의 Recovery 수행 방법을 통해 Recovery한다.
oerr ora 1116
01116, 00000, "error in opening database file %s"
*Cause: Usually the file is not accessible.
*Action: Restore the database file.
oerr ora 1110
01110, 00000, "data file %s: '%s'"
*Cause: Reporting file name for details of another error
*Action: See associated error message
oerr ora 7368
07368, 00000, "sfofi: open error, unable to open database file."
*Cause: Open system call returned an error.
*Action: Check errno. Verify existence, and permissions on database files.
현상 및 Error 내용
SQL> insert into bonus
values('EEEE','EEEE',99999,999);
insert into bonus
ERROR at line 1:
ORA-01116: error in opening database file 5
ORA-01110: data file 5: '/u02/ORACLE/BACKUP/usrBACKUP.dbf'
ORA-07368: sfofi: open error, unable to open database file.
IBM AIX RISC System/6000 Error: 2: No such file or directory
위와 같은 Error가 Return 될 것이다. 그러나 위와 같이 Datafile 이 손상을 입었음에도 Error를 바로 Return하지 않고 정상적으 로 DML이나 DDL을 사용할 수 있을 지도 모른다. 왜냐하면 아직 SGA의 Database buffer안에 Object들이 존재하는 경우는 DBWR가 Datafile에 Database buffer의 내용을 write하기 전까지 는 Error 없이 정상적으로 작업을 수행할 것이며 Datafile에 write하려는 순간에야 비로서 Error를 Return 할 것이다.
Recovery 수행 방법
1. V$DATAFILE에서 Datafile을 Check한다.
SVRMGR> select FILE#,STATUS,ENABLED,BYTES,NAME
2> from v$Datafile;
FILE# STATUS ENABLED BYTES NAME
----- ------- --------- ------- --------------
1 SYSTEM READ WRITE 20971520 /u02/ORACLE/BACKUP/systBACKUP.dbf
2 ONLINE READ WRITE 41943040 /u02/ORACLE/BACKUP/rbsBACKUP.dbf
3 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/tempBACKUP.dbf
4 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/toolBACKUP.dbf
5 ONLINE READ WRITE 0 /u02/ORACLE/BACKUP/usrBACKUP.dbf
5 rows selected.
2. Physical한 storage directory를 Check해본다.
$ ls
ctrl1BACKUP.ctl log1BACKUP.dbf log2_m_BACKUP.dbf tempBACKUP.dbf
ctrl2BACKUP.ctl log1_m_BACKUP.dbf rbsBACKUP.dbf toolBACKUP.dbf
ctrl3BACKUP.ctl log2BACKUP.dbf systBACKUP.dbf
3. ABORT Option으로 SHUTDOWN 한다.
SVRMGR> shutdown ABORT
ORACLE instance shut down.
4. Datafile이 손상되었음을 확인했으면 Online으로 Backup받은 해당 Datafile을 host command로 COPY한다.
$ cp /admhome/oracle/product/stage/backup/hot/ usrBACKUP.dbf /u02/ORACLE/BACKUP
$ ls -l
-rw-r----- 1 oracle dba 10489856 Oct 17 15:48 usrBACKUP.dbf
5. STARTUP MOUNT한다. Database를 Open까지 하려하면 ORA-1113 Error를 Return할 것이다.
SVRMGR> startup
ORACLE instance started.
Database mounted.
ORA-01113: file 5 needs media recovery
ORA-01110: data file 5: '/u02/ORACLE/BACKUP/usrBACKUP.dbf'
6. V$DATAFILE에서 Datafile이 ONLINE 상태인지 확인한다. 만약 OFFLINE이라면 ALTER DATABASE DATAFILE '/u02/ORACLE/BACKUP/usrBACKUP.dbf' ONLINE ; 을 수행한다.
SVRMGR> select FILE#,STATUS,ENABLED,BYTES,NAME
2> from v$Datafile;
FILE# STATUS ENABLED BYTES NAME
------- ------- ---------- --------- ---------
1 SYSTEM READ WRITE 20971520 /u02/ORACLE/BACKUP/systBACKUP.dbf
2 ONLINE READ WRITE 41943040 /u02/ORACLE/BACKUP/rbsBACKUP.dbf
3 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/tempBACKUP.dbf
4 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/toolBACKUP.dbf
5 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/usrBACKUP.dbf
5 rows selected.
7. 손상된 Datafile을 RECOVER DATAFILE Command로 Recovery한다.
SVRMGR> recover Datafile '/u02/ORACLE/BACKUP/usrBACKUP.dbf';
ORA-00279: Change 6716 generated at 10/15/96 15:58:38 needed for thread 1
ORA-00289: Suggestion : /admhome/oracle/admin/BACKUP/arch/arch_49.arc
ORA-00280: Change 6716 for thread 1 is in sequence #49
Specify log: {=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Physical directory에 Restore된 Datafile을 Archive log를 적용하여 Error가 발생했던 시점까지 Recovery 한다. 이때 Archive log를 적용함에 있어서 AUTO라고 명시적으로 기술해주면 자동으로 Recovery에 필요한 모든 Archive log를 적용한다.
8. Database를 OPEN한다.
SVRMGR> alter database open;
Statement processed.
9. V$DATAFILE에서 Datafile의 상태를 Check한다.
SVRMGR> select FILE#,STATUS,ENABLED,BYTES,NAME
2> from v$Datafile;
FILE# STATUS ENABLED BYTES NAME
-------- ------- ---------- ---------- -------
1 SYSTEM READ WRITE 20971520 /u02/ORACLE/BACKUP/systBACKUP.dbf
2 ONLINE READ WRITE 41943040 /u02/ORACLE/BACKUP/rbsBACKUP.dbf
3 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/tempBACKUP.dbf
4 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/toolBACKUP.dbf
5 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/usrBACKUP.dbf
5 rows selected.
10. 마지막으로 SQLPLUS로 들어가 data가 복구되었는지 확인한다.
1-2. SYSTEM Tablespace Datafile이 아닌 Datafile의 Recovery 2
ORA-1578, ORA-1110을 Return하는 경우에는 아래의 Recovery 수행 방법을 통해 Recovery한다.
oerr ora 1578
01578, 00000, "ORACLE data block corrupted (file # %s, block # %s)"
*Cause: The data block indicated was corrupted mostly due to software errors.
*Action: Try to restore the segment containing the block indicated. This may involve dropping the segment and recreating it. If there is a trace file, report the errors in it to your ORACLE representative.
oerr ora 1110
01110, 00000, "data file %s: '%s'"
*Cause: Reporting file name for details of another error
*Action: See associated error message
현상 및 Error 내용
SQL> select * from bonus;
ERROR:
ORA-01578:ORACLE data block corrupted(file #5, block # 13)
ORA-01110:data file 5: '/u02/ORACLE/BACKUP/usrBACKUP.dbf'
no rows selected
위에서 알 수 있듯이 Datafile의 1개 Block이 손상되었다. 이 경우에도 Datafile이 손상을 입었음에도 Error(ORA-1578)를 바로 Return하지 않고 정상적으로 DML이나 DDL을 사용할 수 있을 지도 모른다. 아직 SGA안에 있는 Object들이 있기 때문이다. 그러나 손상된 Block(Blocksize=4096)에 있는 Data에 대해 Access 하려하면 위와 같은 Error를 Return 할 것이다.
Recovery 수행 방법
1. 일단 V$DATAFILE을 확인해본다.
SVRMGR> select FILE#,STATUS,ENABLED,BYTES,NAME
2> from v$Datafile;
FILE# STATUS ENABLED BYTES NAME
------- ------- -------- -------- --------
1 SYSTEM READ WRITE 20971520 /u02/ORACLE/BACKUP/systBACKUP.dbf
2 ONLINE READ WRITE 41943040 /u02/ORACLE/BACKUP/rbsBACKUP.dbf
3 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/tempBACKUP.dbf
4 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/toolBACKUP.dbf
5 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/usrBACKUP.dbf
5 rows selected.
2. Physical한 storage directory를 Check해본다.
$ ls -l
rw-r----- 1 oracle dba 52432896 Oct 17 17:53 usrBACKUP.dbf
확인해 보면 Datafile은 그대로 존재한다.
3. ABORT Option으로 Shutdown 한다.
SVRMGR> shutdown ABORT
ORACLE instance shut down.
이 경우에 NORMAL이나 IMMEDIATE로 Shutdown하려하면 다음과 같은 Error가 발생할 것이다.
ORA-01122: database file 5 failed verification check
ORA-01110: data file 5: '/u02/ORACLE/BACKUP/usrBACKUP.dbf'
ORA-01208: data file is an old version - not accessing current version
SVRMGR> !oerr ora 1122
01122, 00000, "database file %s failed verification check"
*Cause: The information in this file is inconsistent with information from the control file. See accompanying message for reason.
*Action: Make certain that the db files and control files are the correct files for this database.
4. Datafile이 손상되었음을 확인했으면 Online으로 Backup받은 해당 Datafile을 host command로 COPY한다.
$ cp /admhome/oracle/product/stage/backup/hot/ usrBACKUP.dbf /u02/ORACLE/BACKUP
$ ls -l
-rw-r----- 1 oracle dba 10489856 Oct 17 15:48 usrBACKUP.dbf
5. STARTUP MOUNT한다. Database를 Open까지 하려하면 ORA-1113 Error를 Return할 것이다.
SVRMGR> startup
ORACLE instance started.
Database mounted.
ORA-01113: file 5 needs media recovery
ORA-01110: data file 5: '/u02/ORACLE/BACKUP/usrBACKUP.dbf'
6. V$DATAFILE에서 Datafile이 ONLINE 상태인지 확인한다. 만약 OFFLINE이라면 ALTER DATABASE DATAFILE '/u02/ORACLE/BACKUP/usrBACKUP.dbf' ONLINE ; 을 수행한다.
SVRMGR> select FILE#,STATUS,ENABLED,BYTES,NAME
2> from v$Datafile;
FILE# STATUS ENABLED BYTES NAME
------ ------- -------- ----------- ---------
1 SYSTEM READ WRITE 20971520 /u02/ORACLE/BACKUP/systBACKUP.dbf
2 ONLINE READ WRITE 41943040 /u02/ORACLE/BACKUP/rbsBACKUP.dbf
3 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/tempBACKUP.dbf
4 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/toolBACKUP.dbf
5 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/usrBACKUP.dbf
5 rows selected.
7. 손상된 Datafile을 RECOVER DATAFILE command로 Recovery한다.
SVRMGR> recover Datafile '/u02/ORACLE/BACKUP/usrBACKUP.dbf';
ORA-00279: Change 6890 generated at 10/17/96 16:25:37 needed for thread 1
ORA-00289: Suggestion : /admhome/oracle/admin/BACKUP/arch/arch_76.arc
ORA-00280: Change 6890 for thread 1 is in sequence #76
ORA-00278: Logfile '/admhome/oracle/admin/BACKUP/arch/arch_75.arc' no longer needed fy
Log applied.
Media recovery complete.
8. Database를 OPEN한다.
SVRMGR> alter database open;
Statement processed.
9. V$DATAFILE에서 Datafile의 상태를 Check한다.
SVRMGR> select FILE#,STATUS,ENABLED,BYTES,NAME
2> from v$Datafile;
FILE# STATUS ENABLED BYTES NAME
---------- ------------- --------------------
1 SYSTEM READ WRITE 20971520 /u02/ORACLE/BACKUP/systBACKUP.dbf
2 ONLINE READ WRITE 41943040 /u02/ORACLE/BACKUP/rbsBACKUP.dbf
3 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/tempBACKUP.dbf
4 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/toolBACKUP.dbf
5 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/usrBACKUP.dbf
5 rows selected.
10. 마지막으로 SQL*PLUS로 들어가 data가 복구되었는지 확인한다.
1-3. SYSTEM Tablespace Datafile이 아닌 Datafile의 Recovery 3
ORA-376, ORA-1110을 Return 하는 경우에는 아래의 Recovery 절차를 통해 수행한다.
oerr ora 376
00376, 00000, "file %s cannot be read at this time"
*Cause: attempting to read from a file that is not readable. Most likely the file is offline.
*Action: Check the state of the file. Bring it online
oerr ora 1110
01110, 00000, "data file %s: '%s'"
*Cause: Reporting file name for details of another error
*Action: See associated error message
현상 및 Error 내용
SQL> insert into bonus
2 values ('MMMMMM','JJJJJJ',999999,888888);
1 row created.
SQL> /
insert into bonus
*
ERROR at line 1:
ORA-00376: file 5 cannot be read at this time
ORA-01110: data file 5: '/u02/ORACLE/BACKUP/usrBACKUP.dbf'
위 Error를 보면 Datafile이 손상되었음을 알 수 있다. 현재 이 Datafile은 알 수 없는 손상으로 인해 ORACLE에 의해 내부적으로 Offline되었고 V$DATAFILE에서 Datafile의 Status를 보면 RECOVER로 나타남을 보게 될 것이다. 이처럼 ORA-376같은 Error가 발생하면 다음과 같이 복구한다.
Recovery 수행 방법
1. V$DATAFILE을 확인해 본다.
SVRMGR> select FILE#,STATUS,ENABLED,BYTES,NAME
2> from v$Datafile;
FILE# STATUS ENABLED BYTES NAME
------ ------- ----------- -------- --------
1 SYSTEM READ WRITE 20971520 /u02/ORACLE/BACKUP/systBACKUP.dbf
2 ONLINE READ WRITE 41943040 /u02/ORACLE/BACKUP/rbsBACKUP.dbf
3 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/tempBACKUP.dbf
4 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/toolBACKUP.dbf
5 RECOVER READ WRITE 10485760 /u02/ORACLE/BACKUP/usrBACKUP.dbf
5 rows selected.
2. 정상적인 Datafile을 Restore한다.
$ cp /admhome/oracle/product/stage/backup/hot/ usr* /u02/ORACLE/BACKUP
$ ls -l
-rw-r----- 1 oracle dba 10489856 Oct 17 19:21 usrBACKUP.dbf
Recovery 하기 전에 다른 Datafile의 복구 과정처럼 Shutdown을 하지 않고 OPEN 상태에서 Recovery가 가능하다.
SVRMGR>Recover Tablespace users;
또는 Recover Datafile ‘/u02/ORACLE/BACKUP;
ORA-00279: Change 6716 generated at 10/15/96 15:58:38 needed for thread 1
ORA-00289: Suggestion : /admhome/oracle/admin/BACKUP/arch/arch_49.arc
ORA-00280: Change 6716 for thread 1 is in sequence #49
Specify log: {=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Media recovery complete.
3. Datafile의 상태를 확인한다.
SVRMGR> select FILE#,STATUS,ENABLED,BYTES,NAME
2> from v$Datafile;
FILE# STATUS ENABLED BYTES NAME
------ ------- -------- --------- ---------
1 SYSTEM READ WRITE 20971520 /u02/ORACLE/BACKUP/systBACKUP.dbf
2 ONLINE READ WRITE 41943040 /u02/ORACLE/BACKUP/rbsBACKUP.dbf
3 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/tempBACKUP.dbf
4 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/toolBACKUP.dbf
5 OFFLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/usrBACKUP.dbf
5 rows selected.
위에서와 같이 Recovery가 성공적으로 끝난 Datafile은 Status가 OFFLINE으로 나타난다. 고로 이 상태에서 Table에 대해 access 하려하면 맨 처음 Datafile이 손상되었을 때에 나타난 Error와 똑같은 Error가 Return될 것이다. 그렇다고 Recovery가 실패한 것은 절대 아니다. 이러한 Error가 나타나는 것은 V$DATAFILE 에서 보듯이 Recovery된 Datafile이 OFFLINE 되어 있기 때문이 다. 그러므로 ALTER DATABASE DATAFILE filename ONLINE command를 사용하여 Tablespace를 ONLINE으로 변경시켜야 Table에 대한 access가 가능할 것이다.
SQL> select * from bonus;
ERROR:
ORA-00376: file 5 cannot be read at this time
ORA-01110: data file 5: '/u02/ORACLE/BACKUP/usrBACKUP.dbf'
5. Tablespace를 ONLINE으로 변경한다.
SVRMGR> alter database Datafile '/u02/ORACLE/BACKUP/usrBACKUP.dbf' online;
Statement processed.
1-4. SYSTEM Tablespace Datafile의 Recovery
SYSTEM Tablespace의 Datafile이 손상을 입었을 경우에는 Error 가 2가지 Type으로 나타난다. ORA-604, ORA-1116, ORA-7368을 Return하는 경우와 ORA-1092가 나타나는 경우이다. 아래의 Recovery 수행 방법을 통해 Recovery한다.
oerr ora 604
00604, 00000, "error occurred at recursive SQL level %s"
*Cause: An error occurred while processing a recursive SQL statement(a statement applying to internal dictionary tables).
*Action: If the situation described in the next error on the stack can be corrected, do so; otherwise contact Oracle Support.
oerr ora 1116
01116, 00000, "error in opening database file %s"
*Cause: Usually the file is not accessible.
*Action: Restore the database file.
oerr ora 1092
01092, 00000, "ORACLE instance terminated. Disconnection forced"
*Cause: The instance this process was connected to was terminated abnormally, probably via a shutdown abort. This process
was forced to disconnect from the instance.
*Action: When instance has been restarted, retry action.
현상 및 Error 내용
SQL> insert into bonus
2 values('EEEE','EEEE',99999,999);
1 row created.
SQL> /
insert into bonus
*
ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-01116: error in opening database file 1
ORA-01110: data file 1: '/u02/ORACLE/BACKUP/systBACKUP.dbf'
ORA-07368: sfofi: open error, unable to open database file.
IBM AIX RISC System/6000 Error: 2: No such file or directory
위와 같은 Error가 Return 될 것이다. 그러나 위와 같이 SYSTEM Tablespace의 Datafile이 손상을 입었음에도 Error를 바로 Return하지 않고 정상적으로 DML을 사용할 수 있을 지도 모른다. 기본적으로 ORACLE은 Data를 Block단위로 access하 여 SGA의 Database Buffer에 올려 놓고 Data에 대한 변화를 작 업 한다. 현재 Recovery test를 위한 Instance인 BACKUP은 ‘BLOCK_SIZE = 4096’으로 설정되어 Creation 되어 있으므로 하 나의 Table을 Select했을지라도 그 Table이 있는 Block과 그 Table이 참조하는 Data Dictionary를 같이 Database Buffer와 Data Dictionary Cache에 올린다. 그러므로 현재 SGA안에 올려 진 Data Dictionary를 Access하려하면 System Tablespace Datafile이 없음에도 Dictionary를 볼 수 있지만 만약 아직 SGA 의 Dictionary Cache에 올라와 있지 않은 Dictionary를 Access 하려하거나 특정 시점(Dictionary Cache의 것을 SYSTEM Tablespace Datafile에 Write하려 할 때)에 도달하면 위와 같은 Error를 Return 할 것이다. Error Message가 다음과 같이 Return 되더라도 다음의 Action에 따라 Recovery를 수행한다.
SQL> insert into bonus
2 values('EEEEEEE','EEEEEE',888888,8888888);
insert into bonus
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01578: ORACLE data block corrupted (file # 1, block # 259)
ORA-01110: data file 1: '/u02/ORACLE/BACKUP/systBACKUP.dbf'
또는
SQL> /
insert into bonus
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
Recovery 수행 방법
1. V$DATAFILE에서 Datafile을 Check한다.
SVRMGR> select FILE#,STATUS,ENABLED,BYTES,NAME
2> from v$Datafile;
FILE# STATUS ENABLED BYTES NAME
----- ------- --------- ------------ ---------
1 SYSTEM READ WRITE 20971520 /u02/ORACLE/BACKUP/systBACKUP.dbf
2 ONLINE READ WRITE 41943040 /u02/ORACLE/BACKUP/rbsBACKUP.dbf
3 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/tempBACKUP.dbf
4 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/toolBACKUP.dbf
5 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/usrBACKUP.dbf
5 rows selected.
2. Physical한 Storage directory를 Check해본다.
$ ls /u02/ORACLE/BACKUP
ctrl1BACKUP.ctl log1BACKUP.dbf log2_m_BACKUP.dbf tempBACKUP.dbf
ctrl2BACKUP.ctl log1_m_BACKUP.dbf rbsBACKUP.dbf toolBACKUP.dbf
ctrl3BACKUP.ctl log2BACKUP.dbf
3. ABORT Option으로 Shutdown 한다.
SVRMGR> shutdown
ORACLE instance shut down.
이 경우에 NORMAL이나 IMMEDIATE로 SHUTDOWN하려하면 다음과 같은 Error가 발생할 것이다.
ORA-01122: database file 5 failed verification check
ORA-01110: data file 5: '/u02/ORACLE/BACKUP/usrBACKUP.dbf'
ORA-01208: data file is an old version - not accessing current version
SVRMGR> !oerr ora 1122
01122, 00000, "database file %s failed verification check"
*Cause: The information in this file is inconsistent with informationfrom the control file. See accompanying message for reason.
*Action: Make certain that the db files and control files are the correct files for this database.
4. Datafile이 손상되었음을 확인했으면 Online으로 Backup받은 해당 Datafile을 host command로 COPY한다.
$ cp /admhome/oracle/product/stage/backup/hot/ systBACKUP.dbf /u02/ORACLE/BACKUP
$ ls -l
-rw-r----- 1 oracle dba 20971520 Oct 17 15:48 systBACKUP.dbf
5. STARTUP MOUNT한다. Database를 Open까지 하려하면 ORA-1113 Error를 Return할 것이다.
SVRMGR> startup
ORACLE instance started.
Database mounted.
ORA-01113: file 5 needs media recovery
ORA-01110: data file 5: '/u02/ORACLE/BACKUP/usrBACKUP.dbf'
6. 손상된 Datafile을 RECOVER DATAFILE command로 Recovery한다.
SVRMGR> recover Datafile '/u02/ORACLE/BACKUP/systBACKUP.dbf';
ORA-00279: Change 6716 generated at 10/15/96 15:58:38 needed for thread 1
ORA-00289: Suggestion : /admhome/oracle/admin/BACKUP/arch/arch_49.arc
ORA-00280: Change 6716 for thread 1 is in sequence #49
Specify log: {=suggested | filename | AUTO | CANCEL}
auto
Log applied.
7. Database를 OPEN한다.
SVRMGR> alter database open;
Statement processed.
8. V$DATAFILE에서 Datafile의 상태를 Check한다.
SVRMGR> select FILE#,STATUS,ENABLED,BYTES,NAME
2> from v$Datafile;
FILE# STATUS ENABLED BYTES NAME
------ ------- ---------- --------- ---------
1 SYSTEM READ WRITE 20971520 /u02/ORACLE/BACKUP/systBACKUP.dbf
2 ONLINE READ WRITE 41943040 /u02/ORACLE/BACKUP/rbsBACKUP.dbf
3 ONLINE READ WRITE 52428800 /u02/ORACLE/BACKUP/tempBACKUP.dbf
4 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/toolBACKUP.dbf
5 ONLINE READ WRITE 10485760 /u02/ORACLE/BACKUP/usrBACKUP.dbf
5 rows selected.
9. 마지막으로 SQLPLUS로 들어가 data가 복구되었는지 확인한다.
2.3.2 제어파일 손상 시 복구절차
1. Mirrored 되는Control file 전부가 손상된 경우의 Recovery
oerr ora 210
00210, 00000, "cannot open control file '%s'"
*Cause: Cannot open the control file
*Action: Check to make sure the control file is there and not locked by some other program
현상 및 Error 내용
SQL> alter tablespace users add Datafile '/u02/ORACLE/BACKUP/usr2BACKUP.dbf';
alter tablespace users add Datafile '/u02/ORACLE/BACKUP/usr2BACKUP.dbf'
*
ERROR at line 1:
ORA-00210: cannot open control file '/u02/ORACLE/BACKUP/ctrl1BACKUP.ctl'
ORA-07368: sfofi: open error, unable to open database file.
IBM AIX RISC System/6000 Error: 2: No such file or directory
“Mirroring이 되고 있든 아니든 간에 Control file이 손상을 입었다면 Database는 Background process가 Control file에 처음으로 access 하는 시점까지는 정상적으로 운영된다. 그러나 이 시점( Database의 물리적인 구조를 변경시키는 작업, 즉 Database file을 추가하거나 삭제하는 작업을 하려하는 시점)에 도달하면 ORACLE은 Database와 Instance를 강제로 terminate 시킨다.
일단 Oracle에 의해 강제로 terminated 된 후에는 Control file이 Recovery되기 전까지는 Database를 OPEN 할 수 없으며 MOUNT할 수도 없다. ”라고 ORACLE 7.3 Manual Admin Guide 24-53에는 기술되어 있지만 실제 Test한 바로는 Oracle은 terminate 되지 않았고 단지 아래와 같은 Error만을 Return할 뿐이었다. 참고로 아래의 Recovery 과정은 Test한 결과를 바탕으로 기술한 것이다.
Control file은 Database의 물리적인 구조에 관한 정보를 가지고 있다. 만약 Database의 물리적인 구성요소인 Database Datafile , 즉 Datafile이나 redo log file이 추가될 경우 Database의 변화를 반영하기 위해 ORACLE은 Control file에 Database의 변경된 사항을 기록한다.
그러므로 이 Control file이 손상을 입었을 경우에 특정 Tablespace에 Datafile을 추가하려 하면 ORACLE은 Control file 을 변경하려고 시도하지만 Control file이 사라졌기 때문에 Database 의 변경 사항을 기록할 수 없고 Error(ORA-210)를 Return 할 것 이다.
Recovery 수행 방법
1. 위의 Error(ORA-210)에서와 같이 Control file에 손상이 가해졌음을 알 수 있듯이 실제 Physical한 Storage directory에서 Control file의 변화를 확인해본다.
$ls /u02/ORACLE/BACKUP
log1_m_BACKUP.dbf rbsBACKUP.dbf toolBACKUP.dbf
log2BACKUP.dbf systBACKUP.dbf usrBACKUP.dbf
log1BACKUP.dbf log2_m_BACKUP.dbf tempBACKUP.dbf
2. Control file이 전부 분실된 경우에는 새로 Control file을 Creation 해야 한다. 이 경우에는 vi editor를 열어 아래와 같이 Control file을 Creation하는 script를 작성한 후에 Control file을 새로 Creation하고 Recovery해야 한다.
STARTUP NOMOUNT
CREATE CONTROL FILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 30
MAXINSTANCES 8
MAXLOGHISTORY 800
LOGFILE
GROUP 1 (
'/u02/ORACLE/BACKUP/log1BACKUP.dbf',
'/u02/ORACLE/BACKUP/log1_m_BACKUP.dbf'
) SIZE 10K,
GROUP 2 (
'/u02/ORACLE/BACKUP/log2BACKUP.dbf',
'/u02/ORACLE/BACKUP/log2_m_BACKUP.dbf'
) SIZE 10K
DATAFILE
'/u02/ORACLE/BACKUP/systBACKUP.dbf',
'/u02/ORACLE/BACKUP/rbsBACKUP.dbf',
'/u02/ORACLE/BACKUP/tempBACKUP.dbf',
'/u02/ORACLE/BACKUP/toolBACKUP.dbf',
'/u02/ORACLE/BACKUP/usrBACKUP.dbf' ;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
3. 위의 script를 작성한 후 실행시키기 위해서는 현재 OPEN 되어있는 Database를 NOMOUNT 상태로 만들어야 한다. 현재 Open 되어 있는 Database를 NORMAL이나 IMMEDIATE Option으로 SHUTDOWN하려하면 Error(ORA-1122)가 Return 될 것이다. 왜냐하면 Oracle은 Control file이 가지고 있는 Database Structure에 관한 정보와 실제 Database Structure의 구조를 비교 하여 일치할 경우에만 Database를 SHUTDOWN, STARTUP 할 수 있다. 그러나 현재 Control file이 (Mirroring 되고 있는 Control file까지) 전부 손상되어 있으므로 손상된 Control file이 가지고 있는 손상된 정보와 실제 Database Structure는 일치하지 않으므로 SHUTDOWN을 ABORT 해야 Database는 Shutdown될 것이다. 그러나 이 상태에서 Control file을 다시 Creation할 때 Control file은 생성되지만 Recovery는 수행되지 않고 Database는 OPEN된다. 그러므로 ABORT Option으로 SHUTDOWN 해야 Recovery까지 수행할 수 있다.
만약 Control file이 손상되기 이전에 Backup받아 놓은 Control file이 있고 Backup을 받은 후에도 Database의 물리적인 구조가 변경되지 않았다면 ALTER DATABASE BACKUP CONTROL FILE TO TRACE ; command를 사용하면 Control file을 Creation하는 script를 보다 쉽게 작성할 수 있게 해준다. ALTER DATABASE BACKUP CONTROL FILE TO TRACE ; command를 사용하기 위해선 Backup받은 Control file 모두를 Physical directory로 Copy해야 한다.
왜냐하면 이 Command는 Physical한 Control file을 user_dump_dest(config.ora file에서 정의)인/admhome/ oracle/admin/BACKUP/udump로 ORA_xxxxx.trc라는 trace file을 생성하며 이 trace file에는 Physical한 Control file이 가지고 있는 Database의 Structure에 관한 정보를 토대로 Control file을 Creation하는 Script가 만들어진다.
설령 Control file을 Backup받은 후에 Database의 물리적인 구조가 변경되었다면 Backup받은 Control file을 Copy하고 ALTER DATABASE BACKUP CONTROL FILE TO TRACE ; 를 실 행한 후 /admhome/oracle/admin/BACKUP/udump밑에 생성된 Trace file에 Database의 변경된 부분을 추가 혹은 삭제하여 SHUTDOWN ABORT한 후에 실행시키면 Recovery가 수행될 것이다.
SVRMGR> shutdown abort
ORACLE instance shut down.
4. 위에서 작성한 script를 실행시켜 Control file을 Creation하고 Recovery를 수행해야 한다.
SVRMGR> @create_contolfile.sql
Statement processed.
Media recovery complete.
Statement processed.
Statement processed.
5. Control file이 Creation되었는지 physical directory에서 확인해본다.
$ ls -l /u02/ORACLE/BACKUP
-rw-r----- 1 oracle dba 111104 Oct 18 11:34 ctrl1BACKUP.ctl
-rw-r----- 1 oracle dba 111104 Oct 18 11:34 ctrl2BACKUP.ctl
-rw-r----- 1 oracle dba 111104 Oct 18 11:34 ctrl3BACKUP.ctl
6. Datafile을 추가하여 Database가 정상적으로 Recovery 되었는지 확인해 볼 수 있다.
2. Control file 중 일부가 손상된 경우의 Recovery
oerr ora 210
00210, 00000, "cannot open control file '%s'"
*Cause: Cannot open the control file
*Action: Check to make sure the control file is there and not locked by some other program
현상 및 Error 내용
위 CASE 2-1과 같은 Error를 Return 할 것이다.
SQL> alter tablespace users add Datafile '/u02/ORACLE/BACKUP/usr2BACKUP.dbf';
alter tablespace users add Datafile '/u02/ORACLE/BACKUP/usr2BACKUP.dbf'
*
ERROR at line 1:
ORA-00210: cannot open control file '/u02/ORACLE/BACKUP/ctrl1BACKUP.ctl'
ORA-07368: sfofi: open error, unable to open database file.
IBM AIX RISC System/6000 Error: 2: No such file or directory
Recovery 수행 방법
1. Physical directory에서 mirroring 되고 있는 Control file을 Copy한다.
$ cp /u02/ORACLE/BACKUP/ctrl2BACKUP.ctl ctrl1BACKUP.ctl
2. IMMEDIATE로 Shutdown한다.
SVRMGR> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
3. STRATUP 한다.
SVRMGR> startup
ORACLE instance started.
Database mounted.
Database opened.
위와 같이 Test결과 Recovery된다. Mirroring되고있는Control file 중 일부가 손상을 입어 Database의 물리적 구조를 변화시키지 못하여 Error를 Return 할 때 Mirroring되고 있는 Control file을 Physical directory에 Copy하고 NORMAL로 SHUTDOWN한 후 다시 STARTUP하면 손상된Control file을 Recovery할 수 있다. 그러나 ORACLE Mannual에는 ABORT로 SHUTDOWN하라고 명시하고 있다. 그리고 Mannual에는 1과 2를 바꿔 수행하라고 기술되어 있지만 두 가지 경우 모두 Recovery는 정상적으로 된다.
다른 Recovery 방법(ORACLE Mannual)
1. ABORT로 SHUTDOWN한다.
SVRMGR> shutdown ABORT
Database closed.
Database dismounted.
ORACLE instance shut down.
2. Physical directory에서 mirroring 되고 있는 Control file을 Copy한다.
$ cp /u02/ORACLE/BACKUP/ctrl2BACKUP.ctl ctrl1BACKUP.ctl
3. STRATUP 한다.
SVRMGR> startup
ORACLE instance started.
Database mounted.
Database opened.
2.4.3 온라인 Log(Redo Log)의 손상 시 복구 절차
1. Mirrored 되는 Redolog file Group중 특정 member의 Recovery
(Current redo log Group이 아닌 Group의 member가 손상된 경우, Current redo log Group의 member가 손상된 경우 공통)
cf) 현재 log file의 상태
SVRMGR> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
------ ------- --------- ------- -------- ---
1 1 136 10240 2 YES INACTIVE
2 1 137 10240 2 NO CURRENT
2 rows selected.
현상 및 Error 내용
SQL> insert into bonus
2 select * from bonus;
736 rows created.
SQL>select count(*) from bonus
COUNT(*)
----------
1472
SVRMGR> select GROUP#,THREAD#,SEQUENCE#,BYTES, MEMBERS, ARCHIVED,STATUS
2> from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
------ -------- ----------- ----- -------- ---
1 1 146 10240 2 NO CURRENT
2 1 145 10240 2 YES INACTIVE
2 rows selected.
Log Group에서 각 Group에 최소한 1개의 Mirroring되고 있는log file이 있다면 Log 상태가 CURRENT이든 INACTIVE이든 상관없이 log file member가 손상을 입었을지라도 ORACLE의 background process인 LGWR은 손상된 log file이외 의 다른 log file member를 찾아 Write하므로 별도의 Error를 Return하지 않고 정상적으로 Database가 작동하도록 한다. 다만 LGWR Trace file이나 ALERT file에 Error message를 남긴다.
Recovery 수행 방법
1. V$LOG에서 손상된 log file member의 상태가 Current가 아닌지를 확인한다. 만약 Current상태라면 인위적으로 Log Switch를 다른 Group으로 넘겨 INACTIVE 상태로 만들어야 손상된 log file을 DROP할 수 있고 다시 ADD할 수 있다.
SVRMGR> alter system switch logfile;
Statement processed.
SVRMGR> select GROUP#,THREAD#,SEQUENCE#,BYTES, MEMBERS,ARCHIVED,STATUS
2> from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
------ -------- --------- ------ -------- ----
1 1 145 10240 2 YES INACTIVE
2 1 146 10240 2 NO CURRENT
2. 손상된 log file을 DROP한다.
SVRMGR> alter database drop logfile member '/u02/ORACLE/BACKUP/log1BACKUP.dbf';
Statement processed.
SVRMGR> select * from v$logfile;
GROUP# MEMBER
--------- -------------------------
2 /u02/ORACLE/BACKUP/log2BACKUP.dbf
2 /u02/ORACLE/BACKUP/log2_m_BACKUP.dbf
1 /u02/ORACLE/BACKUP/log1_m_BACKUP.dbf
3rows selected.
3. 다시 log member를 추가한다.
SVRMGR> alter database add logfile member '/u02/ORACLE/BACKUP/log1BACKUP.dbf'
2> to group 1;
Statement processed.
SVRMGR> select * from v$logfile;
GROUP# STATUS MEMBER
--------- -----------------------------------
2 /u02/ORACLE/BACKUP/log2BACKUP.dbf
2 /u02/ORACLE/BACKUP/log2_m_BACKUP.dbf
1 INVALID /u02/ORACLE/BACKUP/log1BACKUP.dbf
1 /u02/ORACLE/BACKUP/log1_m_BACKUP.dbf
4 rows selected.
위와 같이 Log file Group에서 Member일부가 손상을 입었을 경우에는 위와 같이 간단히 Recovery 할 수 있다.
2 Mirrored 되는 Redolog file Group중 특정 Group의 Recovery
(Current Online Redolog Group이 아닌 경우)
ORA-1096을 Return하는 경우에는 아래의 Recovery 수행 방법을 통해 Recovery한다.
oerr ora 1092
01092, 00000, "ORACLE instance terminated. Disconnection forced"
*Cause:The instance this process was connected to was terminated abnormally, probably via a shutdown abort. This process was forced to disconnect from the instance.
*Action: When instance has been restarted, retry action.
현상 및 Error 내용
SQL> insert into bonus values('wwew','qeq',1122,22222);
1 row created.
SQL> /
1 row created.
SQL> /
insert into bonus
*
ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced
Current Log Group이 아닌 다음 Log Switch가 일어날 Group이 손상된 경우 User는 계속해서 DML작업을 계속할 것이다. 일반적으로 SGA안의 Log Buffer가 다 차면 Current Log Group 에 Write하고 Log Switch를 다음 Log Group으로 넘기고 꽉 찬 Current Log file의 내용을 Archive log file에 써야 한다. 그러나 다음 Log Switch가 넘어갈 Group이 손상되어 있으므로 Log Switch가 넘어가지를 못한다. 그리고 Current Log Group은 LGWR이 Log Buffer의 내용을 Write했으므로 꽉찼지만 Archive 는 아직 수행하지 못하고 있는 상태이다.
이처럼 다음 Log Switch가 일어날 Group이 손상된 경우 ORACLE은 Background process인 LGWR를 강제로 terminate 시키고 Trace file에 기록을 남긴다.
$ls -la /admhome/oracle/admin/BACKUP/bdump
-rw-r--r-- 1 oracle dba 27107 Oct 19 15:53 alert_BACKUP.log
-rw-r----- 1 oracle dba 1131 Oct 19 15:58 lgwr_44568.trc
-rw-r----- 1 oracle dba 682 Oct 19 15:58 pmon_28172.trc
$ vi /admhome/oracle/admin/BACKUP/bdump/ pmon_28172.trc
Sat Oct 19 15:58:21 1996
*** SESSION ID:(1.1) 1996.10.19.15.58.21.959
error 470 detected in background process
OPIRIP: Uncaught error 447. Error stack:
ORA-00447: fatal error in background process
ORA-00470: LGWR process terminated with error
$ vi /admhome/oracle/admin/BACKUP/bdump/ lgwr_44568.trc
*** SESSION ID:(4.1) 1996.10.19.15.50.06.574
ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: '/u02/ORACLE/BACKUP/log1BACKUP.dbf'
ORA-07360: sfifi: stat error, unable to obtain information about file.
IBM AIX RISC System/6000 Error: 2: No such file or directory
ORA-00312: online log 1 thread 1: '/u02/ORACLE/BACKUP/log1_m_BACKUP.dbf'
ORA-07360: sfifi: stat error, unable to obtain information about file.
IBM AIX RISC System/6000 Error: 2: No such file or directory
Sat Oct 19 15:53:12 1996
ORA-00313: open failed for members of log group 1 of thread 1
Sat Oct 19 15:58:21 1996
error 313 detected in background process
Recovery 수행 방법
1. PMON은 Background process인 LGWR를 강제로 kill 시키고 Terminate 시키므로 ABORT Option으로 SHUTDOWN 시킨다.
SVRMGR> shutdown abort
ORACLE instance shut down.
2. 일단 NORMAL로 STARTUP하여 ERROR를 Check한다.
SVRMGR> startup
ORACLE instance started.
Database mounted.
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/u02/ORACLE/BACKUP/log2_m_BACKUP.dbf'
ORA-00312: online log 2 thread 1: '/u02/ORACLE/BACKUP/log2BACKUP.dbf'
SVRMGR> !oerr ora 313
00313, 00000, "open failed for members of log group %s of thread %s"
*Cause: The online log cannot be opened. May not be able to find file.
*Action: See accompanying errors and make log available.
SVRMGR> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
------- ------ ---------- ----- ---------
1 1 156 10240 2 NO CURRENT
2 1 0 10240 2 YES UNUSED
2 rows selected.
SVRMGR> select * from v$logfile;
GROUP# STATUS MEMBER
---------- ------- ---------------------------
2 STALE /u02/ORACLE/BACKUP/log2BACKUP.dbf
2 STALE /u02/ORACLE/BACKUP/log2_m_BACKUP.dbf
1 /u02/ORACLE/BACKUP/log1BACKUP.dbf
1 /u02/ORACLE/BACKUP/log1_m_BACKUP.dbf
3. 임의의 Log Group을 Add한다.
SVRMGR> alter database add logfile '/u02/ORACLE/BACKUP/log3.dbf' size 10k;
Statement processed.
4. 손상된 Log Group을 DROP한다.
SVRMGR> alter database drop logfile group 2;
Statement processed.
5. 다시 손상된 Log Group과 같은 Size, Name으로 ADD한다.
SVRMGR> alter database add logfile '/u02/ORACLE/BACKUP/log2BACKUP.dbf' size 10k;
Statement processed.
SVRMGR> alter database add logfile member '/u02/ORACLE/BACKUP/log2_m_BACKUP.dbf'
2> to group 2;
Statement processed.
SVRMGR> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
------- ------ ----------- ----- -------------
1 1 156 10240 2 NO CURRENT
2 1 0 10240 2 YES UNUSED
3 1 0 10240 1 YES UNUSED
3 rows selected.
6. 임의로 생성했던 Log Group을 DROP한다.
SVRMGR> alter database drop logfile group 3;
Statement processed.
7. Database를 OPEN한다.
SVRMGR> alter database open;
Statement processed.
SVRMGR> alter system switch logfile;
Statement processed.
SVRMGR> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
------- ------ ----------- ---- --------------
1 1 156 10240 2 NO CURRENT
2 1 157 10240 2 YES INACTIVE
2 rows selected.
SVRMGR> select * from v$logfile;
GROUP# STATUS MEMBER
-------- ------- -----------------------------
2 /u02/ORACLE/BACKUP/log2BACKUP.dbf
2 /u02/ORACLE/BACKUP/log2_m_BACKUP.dbf
1 /u02/ORACLE/BACKUP/log1BACKUP.dbf
1 /u02/ORACLE/BACKUP/log1_m_BACKUP.dbf
4 rows selected.
8. 마지막으로 임의로 생성했던 Physical한 Log file을 Remove한다.
$ rm /u02/ORACLE/BACKUP/log3.dbf
3 Mirrored 되는 Redolog file Group중 특정 Group의 Recovery
(Current Online Redo log Group인 경우)
DML(Data Manipulation Language) 즉, Insert, Delete, Update등 을 실행 시켰는데 아무런 결과를 Return하지 않고 계속 묵묵부 답일 때에는 다른 Session을 열어 Alert_ORACLE_SID.ora을 확인 하여 Database에 어떤 문제가 발생한 것은 아닌 지 확인 해보는 자세가 중요하다.
현상 및 Error 내용
SQL> insert into bonus
2 select * from bonus;
10 rows created.
SQL> /
===> 무반응
현재 Current log Group이 전부 손상된 시점에 ORACLE은 특별한 Error Message를 Return하지 않고 다만 /admhome/oracle/admin/BACKUP/bdump에 ALERT file이나 arch_xx.trc file에 Error Message를 남긴다. 여기서 arch_xx.trc file을 보면 ,
ORA-00255: error archiving log 1 of thread 1, sequence # 169
ORA-00312: online log 1 thread 1: '/u02/ORACLE/BACKUP/log1BACKUP.dbf'
ORA-00312: online log 1 thread 1: '/u02/ORACLE/BACKUP/log1_m_BACKUP.dbf'
ORA-00286: No members available, or no member contains valid data
ORA-00334: archived log: ‘/adhome/oracle/admin/BACKUP/arch/arch_169.arc
위의 Error를 Return 함을 알 수 있다. 특히 ORA-286을 보면 알 수 있듯이 Current log Group이 없음을 알 수 있고 Log file이 없으므로 Archive할 Data가 없다고 Message를 남긴다.
00286, 00000, "No members available, or no member contains valid data"
*Cause: None of the members of a logfile group are available, or the available members do not contain complete data.
*Action: If a member is temporarily offline, attempt to make it available.Make sure that the correct file names are being used, especially if the log is being accessed from a remote location.
SGA안의 Log buffer가 꽉차서 LGWR가 Redo log Buffer안의 내용을 Current Log file에 write하려고 하지만 Log file이 손상되어 있으므로 write하지 못한다. 이때 ORACLE은 내부적 알고리즘에 의해 LGWR가 손상된 Current Log file에 Redo log buffer의 내용을 write하지 못했더라도 다른 정상적인 Log Group으로 Log Switch를 넘긴다. 그러나 현재 손상된 Current log file에 write한 것이 없으므로 Current log file의 것을 Archive file로도 남길 수 없다. 다음의 V$LOG에서 나타나듯이 손상된 Current Group이었던 Group # 1의 STATUS는 INACTIVE이고 Archive는 안되었음을 알 수 있다.
§주의 할 점은 위처럼 Current Log Group이 손상을 입었을 때는 ORACLE은 아무런 Message를 내보내지 않는다는 것이 다. 그러므로 위에서처럼 DML에 아무런 반응이 없을 때는 Current Log Group이 손상되지 않았나 Check해 보는 것이 바람직하다.
Recovery 수행 방법
1. 일단 DML에 대한 아무런 반응이 없었으므로 Alert file이나 현재시간에 생성된 Trace file을 살펴본다. Trace file의 내용이 Log file과 연관이 있는 것이라면 V$LOG를 확인해 본다.
SVRMGR> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
------- ------ ----------- ------ -------- ---
1 1 158 10240 2 NO INACTIVE
2 1 159 10240 2 NO CURRENT
2 rows selected.
위에서 확인한 것처럼 Group # 1의 ARCHIVE가 안 일어나고 Group 2로 Log Switch가 넘어갔음을 알 수 있다.
2. 임의의 Log Group을 생성한다.
왜냐하면 손상된 Log Group 을 없애고 새로 만드는 과정에서 ORACLE에서는 반드시 Log Group이 2개 이상(Circular fashion)이어야 한다. 그러므로 GROUP 1을 DROP하는 시점에 Log Group은 2개 이상이 존재 해야 하므로 임의의 Log Group 3를 생성해야 한다.
SVRMGR> alter database add logfile '/u02/ORACLE/BACKUP/log3.dbf' size 10k;
Statement processed.
SVRMGR> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
-------- ------ ---------- ---- --------- ---
1 1 158 10240 2 NO INACTIVE
2 1 159 10240 2 NO CURRENT
3 1 0 10240 1 YES UNUSED
3 rows selected.
3. 손상될 Log Group을 DROP해야 한다. 그러나 현재 Database는 ARCHIVELOG Mode로 운영되고 있다. ARCHIVELOG Mode에서는 Archive가 되지않은 Current Log file을 DROP할 수 없다. 그러므로 손상된 Log Group을 DROP하 기에 앞서 Database를 NOARCHIVELOG Mode로 변경시켜주어 야 한다.
SVRMGR> alter database drop logfile group 1;
alter database drop logfile group 1
ORA-00350: log 1 of thread 1 needs to be archived
ORA-00312: online log 1 thread 1: '/u02/ORACLE/BACKUP/log1BACKUP.dbf'
ORA-00312: online log 1 thread 1: '/u02/ORACLE/BACKUP/log1_m_BACKUP.dbf'
SVRMGR> shutdown immediate
ORACLE instance shut down.
SHUTDOWN 했으면 STARTUP MOUNT한다.
SVRMGR> startup mount
ORACLE instance started.
Database mounted.
SVRMGR> alter database noarchivelog;
Statement processed.
SVRMGR> archive log list
Database log mode No Archive Mode
Automatic archival Enabled
Archive destination /admhome/oracle/admin/BACKUP/arch
Oldest online log sequence 158
Current log sequence 159
4. 손상된 Log Group을 DROP한다.
SVRMGR> alter database drop logfile group 1;
Statement processed.
SVRMGR> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
------- ------ ---------- ------- -------- ---
2 1 159 10240 2 NO CURRENT
3 1 0 10240 1 YES UNUSED
2 rows selected.
5. 새로 Log Group을 생성한다.
SVRMGR> alter database add logfile '/u02/ORACLE/BACKUP/log1BACKUP.dbf' size 10k;
Statement processed.
SVRMGR> alter database add logfile member '/u02/ORACLE/BACKUP/log1_m_BACKUP.dbf'
2> to group 1;
Statement processed.
SVRMGR> select * from v$logfile;
GROUP# STATUS MEMBER
---------- ------- ---------------------------
2 STALE /u02/ORACLE/BACKUP/log2BACKUP.dbf
2 STALE /u02/ORACLE/BACKUP/log2_m_BACKUP.dbf
1
/u02/ORACLE/BACKUP/log1BACKUP.dbf
1 INVALID /u02/ORACLE/BACKUP/log1_m_BACKUP.dbf
3
/u02/ORACLE/BACKUP/log3.dbf
5 rows selected.
6. 임의로 생성했던 Log Group 을 DROP 한다.
SVRMGR> alter database drop logfile group 3;
Statement processed.
SVRMGR> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS
------- --------- ------------ ---------- ---
1 1 0 10240 2 YES UNUSED
2 1 159 10240 2 NO CURRENT
2 rows selected.
SVRMGR> select * from v$logfile;
GROUP# STATUS MEMBER
---------- ------- ---------------------------
2 STALE /u02/ORACLE/BACKUP/log2BACKUP.dbf
2 STALE /u02/ORACLE/BACKUP/log2_m_BACKUP.dbf
1
/u02/ORACLE/BACKUP/log1BACKUP.dbf
1 INVALID /u02/ORACLE/BACKUP/log1_m_BACKUP.dbf
4 rows selected.
7. NOARCHIVE Mode를 다시 ARCHIVELOG Mode로 바꾼다.
SVRMGR> alter database archivelog;
Statement processed.
8. Database를 OPEN한다.
SVRMGR> alter database open;
Statement processed.
9. Physical Storage directory에서 임의로 생성했던 log file을 Remove한다.
$ rm /u02/ORACLE/BACKUP/log3.dbf
4. Redo log file이 모두 손상된 경우
Recovery 수행 방법
System이 Shutdown되기 전에 복구해야 함.
SQL> insert into bonus
2 select * from bonus;
1280 rows created. (총 2560row 존재)
SVRMGR> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIR
---------- ---------- ---------- ---------- ---------- --- ---------------- ----
1 1 1 4194304 2 NO CURRENT
2 1 0 4194304 2 YES UNUSED
SVRMGR> alter database add logfile group 3
'/u01/ORACLE/BACKUP/log3BACKUP.dbf' size 1m;
Statement processed.
SVRMGR> alter database drop logfile group 2;
Statement processed.
SVRMGR> alter database add logfile group 2
'/u01/ORACLE/BACKUP/log2BACKUP.dbf' size 4m;
Statement processed.
SVRMGR> alter database add logfile member
'/u01/ORACLE/BACKUP/log2_m_BACKUP.dbf' to group 2;
Statement processed.
SVRMGR> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIR
---------- ---------- ---------- ---------- --
1 1 1 4194304 2 NO CURRENT
2 1 0 4194304 2 YES UNUSED
3 1 0 1048576 1 YES UNUSED
3 rows selected.
SVRMGR> alter database drop logfile group 1;
alter database drop logfile group 1
ORA-01623: log 1 is current log for thread 1 - cannot drop
ORA-00312: online log 1 thread 1: '/u01/ORACLE/BACKUP/log1BACKUP.dbf'
ORA-00312: online log 1 thread 1: '/u01/ORACLE/BACKUP/log1_m_BACKUP.dbf'
SVRMGR> alter system switch logfile;
Statement processed.
SVRMGR> select * from v$log;
GROUP# THREAD# SEQUENCE# BYTES MEMBERS ARC STATUS FIR
---------- ---------- ---------- ---------- --
1 1 1 4194304 2 NO INACTIVE
2 1 2 4194304 2 NO CURRENT
3 1 0 1048576 1 YES UNUSED
3 rows selected.
SVRMGR> alter database drop logfile group 1;
alter database drop logfile group 1
*
ORA-00350: log 1 of thread 1 needs to be archived
ORA-00312: online log 1 thread 1: '/u01/ORACLE/BACKUP/log1BACKUP.dbf'
ORA-00312: online log 1 thread 1: '/u01/ORACLE/BACKUP/log1_m_BACKUP.dbf'
SVRMGR> shutdown abort
SVRMGR> startup mount
SVRMGR> alter database noarchivelog;
Statement processed.
SVRMGR> alter database drop logfile group 1;
Statement processed.
SVRMGR> alter database add logfile group 1
2> '/u01/ORACLE/BACKUP/log1BACKUP.dbf' size 4m;
Statement processed.
SVRMGR> alter database add logfile member
2> '/u01/ORACLE/BACKUP/log1_m_BACKUP.dbf' to group 1;
Statement processed.
SVRMGR> alter database drop logfile group 3;
Statement processed.
SVRMGR> alter database open;
SVRMGR> shutdown
SVRMGR> startup mount
SVRMGR> alter database archivelog;
Statement processed.
SVRMGR> alter database open;
Statement processed.
SVRMGR> connect scott/tiger
Connected.
SVRMGR> select count(*) from bonus;
COUNT(*)
----------
2560
1 row selected.
2.3.4 기타 장애 유형별 복구 절차.
Case 1. Online Tablespace backup 직후 failure가 발생한 경우 (End Backup command를 아직 수행하지 못한 경우)
Recovery 수행 방법
SVRMGR> select * from v$backup;
FILE# STATUS CHANGE# TIME
------ ------ -------- ----------------------
1 ACTIVE 6559 10/12/96 13:53:16
2 ACTIVE 6560 10/12/96 13:53:16
3 ACTIVE 6562 10/12/96 13:53:16
4 ACTIVE 6561 10/12/96 13:53:16
5 ACTIVE 6563 10/12/96 13:53:16 ACTIVE는 backup mode중 임을 뜻한다.
SVRMGR> shutdown abort
ORACLE instance shut down.
SVRMGR> startup
ORACLE instance started.
Total System Global Area 4953044 bytes
Fixed Size 38940 bytes
Variable Size 4078520 bytes
Database Buffers 819200 bytes
Redo Buffers 16384 bytes
Database mounted.
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: '/u01/ORACLE/BACKUP/systBACKUP.dbf'
SVRMGR> recover Datafile '/u01/ORACLE/BACKUP/systBACKUP.dbf';
Media recovery complete.
ORA-01113: file 2 needs media recovery
ORA-01110: data file 2: '/u01/ORACLE/BACKUP/rbsBACKUP.dbf'
SVRMGR> recover Datafile '/u01/ORACLE/BACKUP/rbsBACKUP.dbf';
Media recovery complete.
SVRMGR> alter database open;
alter database open
*
ORA-01113: file 3 needs media recovery
ORA-01110: data file 3: '/u01/ORACLE/BACKUP/tempBACKUP.dbf'
SVRMGR> recover Datafile '/u01/ORACLE/BACKUP/tempBACKUP.dbf'
Media recovery complete.
SVRMGR> alter database open;
ORA-01113: file 4 needs media recovery
ORA-01110: data file 4: '/u01/ORACLE/BACKUP/toolBACKUP.dbf'
SVRMGR> recover Datafile '/u01/ORACLE/BACKUP/toolBACKUP.dbf'
Media recovery complete.
SVRMGR> alter database open;
alter database open
*
ORA-01113: file 5 needs media recovery
ORA-01110: data file 5: '/u01/ORACLE/BACKUP/usrBACKUP.dbf'
SVRMGR> recover Datafile '/u01/ORACLE/BACKUP/usrBACKUP.dbf';
Media recovery complete.
SVRMGR> alter database open;
Statement processed.
SVRMGR> select * from v$backup;
FILE# STATUS CHANGE# TIME
---------- ------------------ ---------- --------------------
1 NOT ACTIVE 6559 10/12/96 13:53:16
2 NOT ACTIVE 6560 10/12/96 13:53:16
3 NOT ACTIVE 6562 10/12/96 13:53:16
4 NOT ACTIVE 6561 10/12/96 13:53:16
5 NOT ACTIVE 6563 10/12/96 13:53:1
Recovery 수행 방법
SVRMGR> startup mount
ORACLE instance started.
Total System Global Area 4953044 bytes
Fixed Size 38940 bytes
Variable Size 4078520 bytes
Database Buffers 819200 bytes
Redo Buffers 16384 bytes
Database mounted.
SVRMGR> alter database Datafile '/u01/ORACLE/BACKUP/systBACKUP.dbf' end backup;
Statement processed.
SVRMGR> alter database Datafile '/u01/ORACLE/BACKUP/rbsBACKUP.dbf' end backup;
Statement processed.
SVRMGR> alter database Datafile '/u01/ORACLE/BACKUP/tempBACKUP.dbf' end backup;
Statement processed.
SVRMGR> alter database Datafile '/u01/ORACLE/BACKUP/toolBACKUP.dbf' end backup;
Statement processed.
SVRMGR> alter database Datafile '/u01/ORACLE/BACKUP/usrBACKUP.dbf' end backup;
Statement processed.
SVRMGR> alter database open;
Statement processed.
Case 2. Backup본이 없는 Datafile이 손상 된 경우
Recovery 수행 방법
임의의 tablespace test3를 만듦.
그 tablespace에 table을 만든다.
Datafile을 삭제한다.
SQL> create tablespace TEST Datafile
'/u01/ORACLE/BACKUP/test3.dbf' size 5m reuse
default storage (
initial 20k
next 20k
pctincrease 50);
SQL> create table chw
2 (a number(2),
3 b varchar2(8),
4 c varchar2(8))
5 tablespace test;
Table created.
SQL> insert into chw
2 values(1,'chw','seoul');
1 row created.
SQL> /
1 row created.
SQL>commit;
$ rm /u01/ORACLE/BACKUP/test3.dbf
Recovery 수행 방법
SQL> select NAME,STATUS from v$Datafile;
NAME STATUS
----------------------------------- ---------
/u01/ORACLE/BACKUP/systBACKUP.dbf SYSTEM
/u01/ORACLE/BACKUP/rbsBACKUP.dbf ONLINE
/u01/ORACLE/BACKUP/tempBACKUP.dbf ONLINE
/u01/ORACLE/BACKUP/toolBACKUP.dbf ONLINE
/u01/ORACLE/BACKUP/usrBACKUP.dbf ONLINE
/u01/ORACLE/BACKUP/test.dbf ONLINE
SVRMGR> shutdown abort
ORACLE instance shut down.
SVRMGR> startup
ORACLE instance started.
Database mounted.
ORA-01157: cannot identify data file 6 - file not found
ORA-01110: data file 6: '/u01/ORACLE/BACKUP/test.dbf'
SVRMGR> alter database create Datafile '/u01/ORACLE/BACKUP/test.dbf' as
2> '/u01/ORACLE/BACKUP/test2.dbf';
SVRMGR> recover tablespace test;
ORA-01109: database not open
SVRMGR> alter database open;
alter database open
*
ORA-01113: file 6 needs media recovery
ORA-01110: data file 6: '/u01/ORACLE/BACKUP/test2.dbf'
SVRMGR> recover Datafile '/u01/ORACLE/BACKUP/test2.dbf';
ORA-00279: Change 6583 generated at 10/12/96 14:22:20 needed for thread 1
ORA-00289: Suggestion : /admhome/oracle/admin/BACKUP/arch/arch_8.arc
ORA-00280: Change 6583 for thread 1 is in sequence #8
Specify log: {=suggested | filename | AUTO | CANCEL}
Log applied.
ORA-00279: Change 6643 generated at 10/14/96 10:47:40 needed for thread 1
ORA-00289: Suggestion : /admhome/oracle/admin/BACKUP/arch/arch_9.arc
ORA-00280: Change 6643 for thread 1 is in sequence #9
ORA-00278: Logfile '/admhome/oracle/admin/BACKUP/arch/arch_8.arc' no longer neey
Specify log: {=suggested | filename | AUTO | CANCEL}
Log applied.
ORA-00279: Change 6659 generated at 10/14/96 10:50:58 needed for thread 1
ORA-00289: Suggestion : /admhome/oracle/admin/BACKUP/arch/arch_10.arc
ORA-00280: Change 6659 for thread 1 is in sequence #10
ORA-00278: Logfile '/admhome/oracle/admin/BACKUP/arch/arch_9.arc' no longer neey
Specify log: {=suggested | filename | AUTO | CANCEL}
Log applied.
Media recovery complete.
** set auto recovery on으로 설정한 후 log를 적용하면 적용 시점까지 저절로 apply된다.
SVRMGR> alter database open ;
Statement processed.
Case 3. 특정 시점으로의 Recovery ( Time-Based Recovery)
현상 및 Error 내용
SVRMGR> shutdown
$cp /u01/ORACLE/BACKUP/* /u01/ORACLE/COLD_BACK
SVRMGR> startup
SVRMGR>connect scott/tiger
SVRMGR> insert into bonus
2> select * from bonus;
640 rows processed.
SVRMGR> /
SVRMGR> /
SVRMGR> commit;
Statement processed.
SVRMGR> select count(*) from bonus;
COUNT(*)
----------
1280
1 row selected.
SVRMGR> select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DD:HH24:MI:SS')
---------------------------------------------------------------------------
1996-10-16:18:37:20
1 row selected.
SVRMGR> truncate table bonus;
Statement processed.
SVRMGR> commit;
Statement processed.
Recovery 수행 방법
SVRMGR>shutdown abort
$ls /u01/ORACLE/COLD_BACK
ctrl1BACKUP.ctl log1_m_BACKUP.dbf systBACKUP.dbf usrBACKUP.dbf
ctrl2BACKUP.ctl log2BACKUP.dbf tempBACKUP.dbf
ctrl3BACKUP.ctl log2_m_BACKUP.dbf test.dbf
log1BACKUP.dbf rbsBACKUP.dbf toolBACKUP.dbf Control file과 Redo log file을 제외한 Datafile을 copy한다.
만일 current한 control file이 복구하고자 하는 시점의 database의 물리적 구조와 일치하지 않는다면 incomplete recovery를 끝내고자 하는 시점의 database의 물리적 file 구조를 반영하는 control file의 backup을 restore한다.
Hardware적인 문제로 인해 control file backup을 대체시킬 수 없다면 control_files를 edit할 수 있다.
존재하는 Datafile을 대체하기 위해서 사용되는 모든 backup file은 복구하고자 하는 시점 전의 것이어야 한다.
$cd /u01/ORACLE/COLD_BACK
$cp rbsBACKUP.dbf systBACKUP.dbf tempBACKUP.dbf test.dbf toolBACKUP.dbf usrBACKUP.dbf /u01/ORACLE/BACKUP
SVRMGR> startup mount database의 모든 Datafile은 time-based or change-based recovery 하는 동안 online이어야 함
SVRMGR> select * from v$Datafile;
FILE# STATUS ENABLED CHECKPOINT BYTES CREATE_BYT NAME
---------- ------- ---------- ---------- -----
1 SYSTEM READ WRITE 6798 52428800 52428800 /u01/ORACLE/BACK
2 ONLINE READ WRITE 6798 41943040 41943040 /u01/ORACLE/BACK
3 ONLINE READ WRITE 6798 52428800 52428800 /u01/ORACLE/BACK
4 ONLINE READ WRITE 6798 10485760 10485760 /u01/ORACLE/BACK
5 ONLINE READ WRITE 6798 10485760 10485760 /u01/ORACLE/BACK truncate 하기 전의 시간으로 복구한다.
Control file backup을 사용했거나 재 creation된 control file이 restore되었다면 “using backup Control file” parameter를 명시한다.
SVRMGR> recover database until time '1996-10-16:18:37:00';
Media recovery complete. log를 reset시킨다.
SVRMGR> alter database open resetlogs;
Statement processed.
SVRMGR> connect scott/tiger
Connected.
SVRMGR> select count(*) from bonus;
COUNT(*)
----------
1280
1 row selected
제공 : DB포탈사이트 DBguide.net
출처명 : 엔코아 컨설팅
'030. Database > 01. Oracle' 카테고리의 다른 글
[Oracle] DB Job 시간 지정 참고 (0) | 2013.07.30 |
---|---|
[Oracle] 대체변수 포한 문자 '&' INSERT시 해결방안 (1) | 2013.05.10 |
[Oracle] 데이터베이스 백업과 복구전략 (1) - 오라클의 데이터베이스 백업 (0) | 2013.04.27 |
[Oracle] 테이블 정보 알아보기(인덱스, 총ROWS등) (0) | 2012.09.12 |
[Oracle] 올림, 내림, 반올림 (0) | 2011.11.04 |
WRITTEN BY
- 테네시왈츠
항상 겸손하게 항상 새롭게 항상 진실하게