2012. 7. 11. 17:33

No. 10080

ORACLE 7 BACKUP 및 RECOVERY 방법
================================

DATABASE 의 BACKUP 은 DB 관리자 및 DB를 사용하는 모든 사용자에게 가장 중요한
사항이다. ORACLE은 DB BACKUP 을 위해 몇 가지 방법을 제시하고 있으나 선택은
데이타의 중요도, DB 이용도 등에 따라 가장 적절한 방법을 택하고 가능하면
여러가지 방법으로 BACKUP을 받는 것이 안전하다.


< BACKUP 및 RECOVERY 방법 >
  . EXPORT & IMPORT
  . INCREMENTAL EXPORT & IMPORT
  . IMAGE BACKUP (COLD, HOT BACKUP)
  . ARCHIVING


1. EXPORT & IMPORT

EXPORT 는 DATA 를 ORACLE DATABASE 로부터 ORACLE Binary 형태의 OS FILE로
만들고 IMPORT 를 이용하여 DATABASE 로 LOADING 한다.

  < EXPORT 의 형태 >
  Entire Database (full) - 모든 DATABASE 을 EXPORT 한다.
  User(s)                - 특정 USER 의 OBJECT 를 EXPORT 한다.
  Table(s)               - 특정 TABLE 을 EXPORT 한다.


< 예 1 >  전체 데이타베이스  EXPORT (Interactive Method)

$ exp system/manager
Connected to: ORACLE7 Server Release 7.0.16.4.0 - Production
With the procedural and distributed options
PL/SQL Release 2.0.18.1.0 - Production
Enter array fetch buffer size : 4096 > (RETURN)
Export file : expdat.dmp >
(1) E(ntire database), (2) U(sers), (3) T(ables) :  U > e
Export grants (Y/N) : Y > y
Export table data (Y/N) : Y > y
Compress extents (Y/N) : Y > y
About to export the entire database....
. exporting tablespace definitions
. exporting profiles
. exporting user definitions
. exporting role
. exporting rollback segment definitions
. exporting database links
. exporting sequence numbers
. exporting sequence numbers
. exporting cluster definitions
. exporting stored procedures
. about to export SYSTEM's tables ...
. about to export SCOTT's tables ...
. exporting synonyms
. exporting views
. exporting referential integrity constraints
. exporting triggers
Export terminated successfully without warnings.


< 예 2 >  전체 데이타베이스  EXPORT (Command Line Method)

$ exp userid=system/manager full=y file=fullbackup.dmp


< 예 3 >  전체 데이타베이스 EXPORT ( Dynamic Method )

EXPORT PARAMETERS 을 다음과 같은 FILE(tusc.par) 형태로 만든다.

  system/manager
  full=y
  file=fullbackup.dmp

$ exp parfile=tusc.par


< 예 4 > USER only EXPORT

$ exp system/manager
Connected to: ORACLE7 Server Release 7.0.16.4.0 - Production
With the procedural and distributed options
PL/SQL Release 2.0.18.1.0 - Production
Enter array fetch buffer size : 4096 > (RETURN)
Export file : expdat.dmp >
(1) E(ntire database), (2) U(sers), (3) T(ables) :  U > u
Export grants (Y/N) : Y > y
Export table data (Y/N) : Y > y
Compress extents (Y/N) : Y > y

About to export specified users
User to be exported: (RETURN to quit) > scott
. exporting snapshots
. exporting snapshot log
. exporting database links
. exporting sequence numbers
. exporting sequence numbers
. exporting cluster definitions
. exporting stored procedures
. about to export SCOTT's tables ...
. exporting synonyms
. exporting views
. exporting referential integrity constraints
. exporting triggers
Export terminated successfully without warnings.


< 예 5 >  USER only EXPORT (Command Line Method)

$ exp system/manager owner=scott file=scott.dmp

또는

$ exp scott/tiger file=scott.dmp

< 예 6 >  USER ONLY EXPORT ( Dynamic Method )

EXPORT PARAMETERS 을 다음과 같은 FILE(tusc.par) 형태로 만든다.

  scott/tiger
  file=scott.dmp

$ exp parfile=tusc.par


< 예 7 >  TABLES EXPORT

$ exp scott/tiger file=table.dmp tables=emp,dept



< DATA IMPORTING >

DATA IMPORT는 EXPORT와 비슷하고 항상 EXPORT된 FILE로만 IMPORTING이 된다.


< 예 8 >  전체 데이타베이스 EXPORT FILE 로부터 SINGLE TABLE 을 IMPORT
          (INTERACTIVE MODE)

$ imp system/manager
Connected to: ORACLE7 Server Release 7.0.16.4.0 - Production
With the procedural and distributed options
PL/SQL Release 2.0.18.1.0 - Production

Import file: expdat.dmp > (RETURN)
Enter insert buffer size (minimum is 4096) 30720 > (RETURN)
Export file created by EXPORT:V07.00.16
List contents of import file only (yes/no) : no >
( "yes" 이면 data는 import 되지않고 Display 만됨 )
Ignore create errors due to object existence (yes/no) : yes >
("yes" : 만일 table 이존재하면 record 가 추가된다.
  "no"  : 이미 존재한 Object 에대해서 import 를 하지않는다.)
Import grants (yes/no) : yes >
Import table data (yes/no) : yes >
Import entire export file (yes/no) : yes >  no
User name : SCOTT
Enter table name. Null list name all tables for user
Enter table name or . if done : TEST
importing SCOTT's objects into SCOTT
importing table TEST      900 rows imported
Import terminated successfully.


주의 : IMPORT 작업은 보통 생성되는 INDEX 수에 따라 1.5 - 4 배의 시간이
       걸리는데 EXPORT 는  "CREATE INDEX ...." 문만을 FILE 에 쓰고
       IMPORT 시에는 INDEX를 생성하기 때문이다.

(COMMAND LINE MODE)

$ imp system/manager full=n owner=scott tables=test commit=y

주의 : IMPORT 시는 데이타를 DB에 WRITE하기 때문에 ROLLBACK SEGMENT가 사용된다.
       commit=y 는 row 만큼 데이타를 LOAD 하고나서 COMMIT을 하기 때문에
       ROLLBACK SEGMENT가 커지는 것을 피할 수 있다.
       commit=n 이면 TABLE 단위로 IMPORT 하고 나서 COMMIT이 되기 때문에
       ROLLBACK SEGMNET 확장 ERROR가 발생할 수 있다.



3. IMAGE BACKUP

IMAGE BACKUP 은 모든 데이타베이스 FILE 들을 다른 장소로 COPY 하는 것이다.
이 방법은 가장 빠르고 안전한 방법이나 BACKUP 시점까지 데이타를 저장 할 수
밖에 없고, BACKUP 을 하는 동안 데이타베이스를 DOWN 해야 하는 문제가 있다.
그러나, IMAGE BACKUP 관련된 문제는 대부분 ARCHIVING 과 같이 사용하면 해결될
수가 있다. 또한 IMAGE BACKUP 은 PERFORMANCE 를 고려하여 DISK 로 하는 것이
좋다. DATABASE 를 STARTUP 하고 나서 TAPE 로 COPY 하면 DB 가 DOWN되는 시간을
줄일 수 있기 때문이다.

<COLD BACKUP>

a. 데이타베이스를 정상적으로(NORMAL) DOWN 한다.
b. 모든 DATA FILES, CONTROL FILES, ONLINE REDO LOG FILE 들을 OS 의
   BACKUP UTILITY(UNIX 경우 cp, tar, cpio) 를 사용하여 COPY 한다.
    
   (파라메타 파일 까지 BACKUP 하는 것이 좋다)

< 복구 방법 >

데이타 복구는 BACKUP했던 시점까지 복구되고 이후 변경된 데이타는
데이타베이스가 NOARCHIVELOG MODE이면 복구 불가능하다.

a. DISK에 있는 모든 데이타베이스 FILE(CONTROL, ONLINE REDO LOG, DATA)
    들을 삭제한다.
b. COLD BACKCUP 을 RESTORE 한다.
c. 데이타베이스를 STARTUP 한다.



4. ARCHIVING

ARCHIVING 은 주어진 기간 동안에 데이타베이스에 발생한 변경 사항을 모두 저장
하는 방법이다.
따라서, IMAGE BACKUP 을 하고 난 이후에 모든 ARCHIVE FILE을 가지고 있다면
어떠한 데이타베이스 장애에도 최근에 변경된 내용까지 복구가 가능하다.

< 예 11 >  월요일 11 P.M : 전체 데이타베이스 IMAGE BACKUP
           화요일 : ARCHIVE FILE 에  모든 변경된 내용이 저장
           수요일 : 다음 IMAGE BACKUP 전에 DB 장애

    <복구 방법>
           월요일 11 P.M IMAGE BACKUP 을 RESTORE 한다.
           모든 ARCHIVE FILE 을 DB 에 적용한다.
           ONLINE REDO LOG (아직 ARCHIVE 되지 않는 내용) 화일을 적용한다.



< 데이타베이스를 ARCHIVELOG MODE 로 전환하는 방법 >

a. ARCHIVELOG MODE 로 전환하기 위해서 ONLINE REDO LOG FILE이 3개 이상
   되어야한다. (ORACLE7 은 기본적으로 3 개)
  
   ONLINE REDO LOG FILE 을 추가하는 방법은 다음과 같다.
   (ORACLE 6경우)
  
  $sqldba
  SQLDBA > CONNECT INTERNAL
  SQLDBA > STARTUP MOUNT
  SQLDBA > ALTER DATABASE ADD LOGFILE
                     '?/dbs/log3SID.dbf' SIZE 5M;
  SQLDBA > ALTER DATABASE OPEN;

b. 자동으로  ARCHIVING 하기위해서 ?/dbs/initSID.ora FILE 에 다음 내용을
추가한다.

  LOG_ARCHIVE_START=TRUE
  LOG_ARCHIVE_DEST=/arch/log   (/arch DIRECTORY 가 생성 되어야한다)
  LOG_ARCHIVE_FORMAT=%s.arc

c. 데이타베이스를  MOUNT 한다

$ sqldba  lmode=y
SQLDBA > CONNECT INTERNAL
SQLDBA > STARTUP MOUNT  
SQLDBA > ALTER DATABASE ARCHIVELOG
SQLDBA > ALTER DATABASE OPEN

(ARCHIVING 상황을 DISPLAY 하기위하여)

SQLDBA > ARCHIVE LOG LIST

    Database log mode             ARCHIVELOG
    Automatic archival            ENABLED
    Archive destination           /arch/log
    Oldest online log seq.        155
    Next log sequence to archive  156
    Current log Sequence          156
    
데이타베이스를 위와 같이 ARCHIVELOG MODE 로 사용하면 ONLINE REDO
LOG FILE 이 LOG SWITCH 가 발생할 때  ARCHIVER(arch) PROCESS 는
CURRENT ONLNE REDO LOG FILE 을 /arch DIRECTORY 에 COPY 한다.
ARCHIVE FILE NAME은 log156.arc, log157.arc 등과 같이 LOG SEQUENCE NO
가  FILE NAME에  붙여진다. ARCHIVER PROCESS 는 ORACLE BACKGROUND
PROCESS 와 비동기적으로 작동 하기때문에 COPY 하
는 동안에 DISK I/O 가 증가되는 현상은 발생하나 데이타베이스의 동작이
중단되는 현상은 발생하지 않는다.


< 복구 >


ARCHIVE FILE 을 사용하여 데이타베이스를 복구하는 경우는
. MEDIA FAILURE
. 데이타 FILE 이 DROP 되기 전에 REMOVE 했을 경우
. ORACLE BLOCK 이 CORRUPT 된 경우
. ONLINE LOG FILE 이 CORRUPT 된 경우 등이다.

복구 방법으로는 COMPLETE MEDIA RECOVERY와 INCOMPLETE MEDIA RECOVERY 등이
있다.

방법 1.
   non-SYSTEM TABLESPACE 데이타 FILE 이 CORRUPT된 경우 CORRUT된 DATA
   FILE을 복구하거나 TABLESPACE 를 복구한다.
   TABLESPACE를 복구하는 경우 TABLESPACE 에있는 모든 DATA FILE 을 복구한다.

a. CORRUPT 된 DATAFILE 을 삭제하고 BACKUP 된 FILE 을 RESTORE 한다.
   $ tar xvf /dev/rmt0 user1.dbf

b. CORRUPT 된 DATAFILE 을 복구한다.(TABLESPACE 복구는 생략)

   데이타베이스를 STARTUP 하면 MOUNT 까지는 실행되지만 OPEN 할 때
   DATA FILE 의 LOG SEQUENCE 가 일치하지 않기 때문에 OPEN 되지 않는다.

SQLDBA > STARTUP MOUNT
SQLDBA > RECOVER DATAFILE '/usr/oracle7/dbs/user1.dbf';

ORA-00279: Change 5035 generated at 05/05/94 16:10:00 needed for thread1
ORA-00289: Suggestion : /arch/log156.arc
ORA-00280: Change 5035 for thread 1 is in sequence # 156
Specify log : {<RET>=suggested | filename | AUTO | FROM logsource |
                     CANCEL | <RETURN >

( RETURN 을 하면 제시된 ARCHIVE LOG FILE 이 APPLY 한다. )

Applying suggested logfile...

( 계속해서 제시된 ARCHIVE LOG FILE 로 APPLY 하면 최종적으로
   "Media recovery complete" MESSAGE 가 나타나면서 복구가 완료된다.)

SQLDBA > ALTER DATABASE OPEN;


방법 2. SYSTEM TABLESPACE 데이타 화일이  CORRUPT 된 경우

a. CORRUPT 된 DATAFILE 을 삭제하고 BACKUP 된 FILE 을 RESTORE 한다.
   $ tar xvf /dev/rmt0 systORA7.dbf


b. 데이타베이스 전체를 복구한다.

SQLDBA > STARTUP MOUNT
SQLDBA > RECOVER DATABASE;

ORA-00279: Change 5035 generated at 05/05/94 16:10:00 needed for thread1
ORA-00289: Suggestion : /arch/log156.arc
ORA-00280: Change 5035 for thread 1 is in sequence # 156
Specify log : {<RET>=suggested | filename | AUTO | FROM logsource |
                     CANCEL | <RETURN >

( RETURN 을 하면 제시된 ARCHIVE LOG FILE 이 APPLY 한다. )

Applying suggested logfile...

( 계속해서 제시된 ARCHIVE LOG FILE 로 APPLY 하면 최종적으로
   "Media recovery complete" MESSAGE 가 나타나면서 복구가 완료된다.)

SQLDBA > ALTER DATABASE OPEN;


방법 3. CONTROL FILE 과 ONLINE REDOLOG FILE 복구 방법

a. CONTROL FILE 은 서로 다른 DISK 에 2 개 이상 COPY 하여 운영하면
   하나의 FILE 이 CORRUPT 된 경우 다른 CONTROL FILE 을 COPY 하여 사용한다.
b. ONLINE REDO LOG FILE 은 ORACLE7 에서는 MIRRORED ONLINE REDO LOG 방법을
   사용하여 운영하면 하나의 GROUP 에 있는 모든 REDO LOG FILE이 CORRUPT 되는
   경우를 제외하고 데이타베이스 운영에 장애를 받지 않는다.



5. HOT BACKUP

데이타베이스를 DOWN 하지 않고 IMAGE BACKUP 하는 방법이다.  
이 방법은 COLD BACKUP 보다 더 어럽지만 데이타베이스를 OPEN 중에 할 수 있고
또한 TABLESPACE 별로 BACKUP 을 할 수 있는 장점이 있다.
HOT BACKUP 은 항상 데이타베이스를 ARCHIVE LOG MODE 상태에서 실시한다.

< 방법 > TABLESPACE 단위로 BACKUP 을 실시한다.

SQLDBA > CONNECT INTERNAL
SQLDBA > ALTER TABLESPACE SYSTEM BEGIN BACKUP;



( SYSTEM TABLESPACE 의 모든 DATAFILE 에 대해서 OS BACKUP 한다)
$ tar cvf /dev/rmt0 /usr/oracle7/dbs/syst1ORA7.dbf
$ tar cvf /dev/rmt0 /usr/oracle7/dbs/syst2ORA7.dbf

SQLDBA > ALTER TABLESPACE SYSTEM END BACKUP;

SQLDBA > ALTER TABLESPACE USERS BEGIN BACKUP;

$ tar cvf /dev/rmt0 /usr/oracle7/dbs/user1ORA7.dbf
$ tar cvf /dev/rmt0 /usr/oracle7/dbs/user2ORA7.dbf

SQLDBA > ALTER TABLESPACE USERS END BACKUP;

(다른 TABLESPACE 에 대해서도 같은 방법으로 한다)

주의: BEGIN 과 END 사이에는 해당 TABLESPACE 의 DATAFILE HEADER가
      변경되지 않는다.
      따라서 OS backup이 종료됨과 동시에
      "ALTER TABLESPACE ... END BAKCUP " COMMAND를 실행하여
      DATAFILE의 HEADER가 변경되도록 한다.
      복구 방법은 ARCHIVING 경우의 RECOVERY 방법과 동일하다

Posted by 몰라욧