oracle

오승현 2011. 1. 18. 17:39

오라클 백업과 복구

1. 데이터베이스의 복구 모드

1) 아카이브 로그 모드

데이터베이스의 물리적 구조에서 로그 버퍼영역의 데이터를 로그 기록기(LGWR)에 의해 사용자들의 모든 작업내용(입력, 변경,삭제시의 commit 또는 rollback 데이터)을 로그파일에 저장한다. 로그파일에 변경 전의 데이터와 변경 후의 데이터를 저장하는 이유는 갑자기 데이터베이스가 다운되거나 시스템이 다운되면 다운 당시에 실행되었던 모든 데이터를 잃어버려 데이터들의 무결성을 보장해 줄 수 없기 때문이다. 이런 경우, 모든 변경 데이터를 리두로그 파일에 저장해 두었다가 데이터베이스가 다시 정상적으로 시작될 때 리두로그 파일에 있던 데이터를 통해서 다운될 당시까지의 모든 트랜잭션에 대하여 복구작업을 실행하게 된다. 데이터베이스를 설치하면 기본적으로 3개의 리두로그 파일이 생성된다. 이 파일은 첫 번째 파일이 모두 사용되면 2번째 파일에 변경된 데이터를 저장하고 3번째 파일까지 순차적으로 사용되는데 3번째 리두로그 파일이 모두 사용되면 첫 번째 파일에 다시 저장하게 된다. 문제는 첫 번째 파일에는 이미 이전의 데이터가 저장되어 있기 때문에 이 파일에 새로운 데이터를 저장하게 되면 이전에 저장되어 있던 데이터를 사용할 수 없게되는 문제가 발생한다. 그래서 이미 사용된 리두로그 파일에 새로운 데이터가 저장될 때 이전의 데이터를 사용자가 지정한 디렉토리에 복사하여 두고 해당 파일을 재사용하게 하는 방법을 아카이브 로그 모드라고 한다. 다음은 아카이브 로그 모드를 설정하는 방법이다.

(1) 먼저, 데이터베이스를 아카이브 로그모드로 설정해야 한다.

test:/oracle/app/oracle/product/8.1.5/dbs] vi inittest.ora



* log_archive_start : true는 리두로그 파일을 자동으로 복사

* log_archive_dest_1 : 리두 로그 파일의 복사 파일이 저장될 경로를 나타냄

* log_archive_format : log_archive_dest 파라메터에 의해 해당 경로에 저장될 복사 파일명을 의미

* %s : 로그의 일련번호, %t :쓰레드 번호

(2) 아카이브 로그모드로 사용하기 위해서는 데이터베이스를 마운트 단계까지만 시작하고

'alter database archivelog' 명령어를 실행해야 한다.


(3) 아카이브 로그모드로 데이터베이스가 설정되었는지 확인하는 방법이다.

* database log mode : 아카이브 로그 모드로 설정되었음을 의미

* automoactic archival : 파일의 복사를 자동으로 처리

* archive destination : 복사될 디렉토리

* oldest online log sequence : 가장 오래된 로그파일의 순차번호

* next log sequence to archive : 다음 로그파일의 순차번호

* current log sequence : 현재 로그파일의 순차번호

만약, 데이터베이스 운영중에 시스템이 다운되거나 데이터베이스에 문제가 발생했을 때 문제가 발생했던 시점까지 복구를 원한다면 데이터베이스는 꼭 아카이브 로그 모드에서 운영되어야 한다. 현재 운영되고 있는 데이터베이스의 백업모드를 확인할 때는 'archive log list'명령어를 사용하면 알 수 있다.

2. 백업 방법

1) 전체(whole) 백업

가장 단순한 백업방법 중의 하나이지만 가장 수행하기가 어려운 방법 중의 하나가 전체(whole) 백업이다. 홀 백업은 데이터베이스를 종료하고, 데이터베이스와 관련된 모든 물리적 파일을 운영체제 유틸리티를 이용하여 복사하는 것을 의미한다. 이러한 백업 유형은 데이터 파일의 크기가 매우 큰 경우에는 많은 시간을 필요로 하기 때문에 비주기적으로 실행해야 한다.

데이터 파일의 크기와 사용되는 복사 명령어의 속도에 따라 전체(whole) 백업은 몇 분에서 몇 시간, 심지어 며칠이 걸릴 수도 있다. 그러므로 전체(whole) 백업은 항상 사용할 때 주의해야 하며 충분한 고려를 해야 한다. 이 방법은 데이터베이스 관리자가 사용자 공동체의 요구와 운영 팀의 요구를 평가한 결과에 따라 수행하는 것이 좋다. 전체(whole) 백업은 오프라인 백업이라고 부르기도 한다.

2) 전체(whole) 백업 절차

전체(whole) 백업은 모든 백업방법 중에서 가장 간단하며 실행하기가 쉽다.

(1) 먼저, 오라클 데이터베이스를 종료해야 한다. (NORMAL 또는 IMMEDIATE 모드로 종료)


(2) 데이터베이스와 관련된 모든 물리적 파일을 운영체제에서 복사한다.(컨트롤파일,

리두로그 파일, 데이터 파일, 파라메터 파일)

# 데이터베이스와 관련된 파일 복사

cp $ORACLE_HOME/dbs/*.ora $ORACLE_HOME/backup --> 파라메터 파일

cp $ORACLE_HOME/dbs/oradata/testora/*.dbf $ORACLE_HOME/backup --> 데이터 파일

cp $ORACLE_HOME/dbs/oradata/testora/*.ctl $ORACLE_HOME/backup --> 컨트롤 파일

cp $ORACLE_HOME/dbs/oradata/testora/*.log $ORACLE_HOME/backup --> 리두로그 파일

(3) 데이터베이스를 다시 시작한다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal



한가지 주의해야 할 점은 운영체제상에서 데이터베이스와 관련되는 모든 파일을 백업해야 한다. 예를 들어, 오늘은 컨트롤 파일과 리두로그 파일만 백업하고 내일은 데이터 파일과 파라메터 파일만 백업하는 것은 아무런 의미가 없는 백업이다.

그리고 데이터베이스의 정상적 구동중에 관련되는 파일을 복사하는 것은 의미가 없다. 왜냐하면, 데이터베이스가 사용중이라는 것은 사용자들이 update, delete,insert 작업을 진행중이라는 의미이기 때문에, 트랜잭션이 종료되지 않은 상태의 백업은 백업된 데이터의 무결성을 보장할 수 없다는 의미이기 때문이다.

3) 자동으로 전체(whole) 백업하는 방법

일반적으로 홀 백업은 많은 시간이 소요될 수 있기 때문에 데이터베이스 관리자가 진행 상태를 확인하면서 백업작업을 진행할 수는 없다. 그래서 자동화된 스크립트를 작성하여 운영체제상의 스케줄러(Scheduler)에 의해 백업이 자동으로 실행될 수 있도록 해야 한다. 다음은 전체(whole) 백업을 자동으로 실행하는 스크립트 파일을 작성하는 방법이다.

test:/oracle/app/oracle/product/8.1.5/] vi whole_backup.sql


4) 오픈 백업

전체(whole) 백업은 데이터베이스를 종료한 상태에서 백업을 하지만 오픈 백업은 데이터베이스를 사용하는 도중에도 백업을 할 수 있다. 그리고, 오픈 백업은 테이블스페이스 단위로 백업을 하게 되며 'alter tablespace'명령을 사용하여 테이블스페이스를 백업 모드에 놓고 테이블스페이스에 설정된 물리적 데이터 파일을 운영체제 상에서 복사한다. 다음은 오픈 백업을 할 때 사용하는 명령어이다.

alter tablespace [테이블스페이스명] begin backup; --> 백업을 시작하는 명령어

cp [백업할 경로와 파일명] [백업될 경로와 파일명]

alter tablespace [테이블스페이스명] end backup; --> 백업을 종료하는 명령어

테이블스페이스를 백업 모드(BEGIN BACKUP)에 둘 때, 오라클 데이터베이스에게 백업작업이 수행 주임을 알리고 내부적으로 적합한지를 확인한다.


5) 오픈 백업 절차

오픈 백업은 테이블스페이스 단위로 백업을 한다.

(1) 데이터베이스를 아카이브 모드로 설정한다. (아카이브 모드로 데이터베이스를 설정)

(2) 백업할 테이블스페이스의 정보를 확인한다.


(3) 테이블스페이스의 백업을 시작하고 관계 있는 모든 데이터 파일을 복사한다.

SQL> !cp $ORACLE_HOME/dbs/oradata/testora/temp01.dbf $ORACLE_HOME/backup/temp01.dbf

(4) 테이블스페이스의 백업을 종료한다.

SQL> alter tablespace temp end backup;

(5) 다른 테이블스페이스를 2) ~ 4) 단계를 수행하여 백업한다.

(6) 컨트롤파일을 복사한다. (원본 컨트롤파일을 '/disk02/backup' 디렉토리의 control.ctl

파일을 복사한다.)

또는(원본 컨트롤파일의 내용을 $ORACLE_HOME/fdbms/log 디렉토리에 *.trc 형태의

파일로 복사)

(7) 온라인 리두로그 파일을 복사한다.


6) 자동으로 오픈 백업하는 방법

일반적으로 오픈 백업은 많은 시간이 소요될 수 있고 야간에 일어나는 작업이기 때문에 데이터베이스 관리자가 백업진행 상태를 확인하면서 작업을 진행할 수는 없다. 그래서 자동화된 스크립트를 작성하여 운영체제 상의 스케줄러(Scheduler)에 의해 백업이 자동으로 실행될 수 있도록 하여야 한다. 다음은 오픈 백업을 자동으로 실행하는 스크립트 파일을 작성하 는 방법이다.

참조 파일

test:/oracle/app/oracle/product/8.1.5] vi open_backup.sql

7) 익스포트와 임포트

익스포트와 임포트는 데이터베이스의 백업과 복구를 논리적으로 실행할 수 있는 유틸리티이다. 홀 백업과 오픈 백업이 물리적인 파일을 운영체제상에서 복사하는 방법이라면 익스포트, 임포트는 데이터베이스 내의 테이블, 인덱스와 같은 객체를 백업하고 복구하는 방법이다. 다음 내용은 익스포트와 임포트의 기타 기능이다.

* 오라클 데이터베이스의 특정 사용자가 가지고 있는 객체를 다른 사용자에게로 이동할

수 있다.

* 서로 다른 운영체제에 있는 데이터베이스 데이터를 서로 이동시킬 수 있다.

* 테이블, 인덱스, 뷰 등을 재저장할 수 있기 때문에 단편화(fragmentation)를 감소시킬

수 있다.

8) 익스포트

데이터베이스 내의 테이블, 인덱스와 같은 객체를 운영체제상의 파일 형태로 백업하는 유틸리티이다. 다음은 익스포트 유틸리티에서 사용할 수 있는 파라메터의 종류이다.

USERID/PASSWORD : 사용자명과 패스워드

BUFFER : 데이타를 읽어오는데 필요한 버퍼크기

0으로 설정되면 한번에 한행만 읽어온다.

데이타형이 LONG인 것은 한번에 하나의 행만 읽어와야 한다.

FILE : 백업 파일명

GRANTS : 백업할 객체의 권한 백업

INDEXS : 인덱스를 생성할 수 있는 sql문을 파일로 만들어준다.

ROWS : 테이블의 데이타를 백업해준다.

CONSTRAINTS : 테이블이 가지고 잇는 제약조건 백업

COMPRESS : 익스텐트 영역을 하나의 영역으로 압축하여 백업

FULL : 데이타베이스 전체 백업

OWNER : 백업할 객체를 가지고 잇는 사용자명 정의

TABLES : 특정 테이블을 선택하여 백업

INCTYPE : FULL = Y

COMPLETE : 모든 테이블의 데이터를 백업

INCREMENTAL : 최근에 백업(COMPLETE, CUMULATIVE, INCREMENTAL)한

이후의 변경된 테이블만 백업

CUMULATIVE : 최근에 백업(COMPLETE, CUMULATIVE)한 이후의 변경된

RECORD : SYS.INCVID, SYS.INCEXP테이블에 INCREMENTAL 엑스포트

백업내용을 기록해준다.

HELP : 도움말

LOG : 지정한 파일에 로그 내용을 기록해준다.

CONSISTENT : 백업 진행중인 테이블의 데이타가 변경중이라면 변경전의 데이타를

백업한다.

STATISTICS : 백업하는 동안 테이블과 인덱스에 있는 통계정보를 수집해 준다.

ESTIMATE : 전체 데이타중 일부 데이타로 통계정보를 수집

COMPUTE : 전체 데이타로 통계 정보를 수집한다

NONE : 통계정보를 수집하지 않는다.

DIRECT : 데이타버퍼 캐쉬 영역을 사용하지 않고 백업하기 때문에 매우 빠르게

백업할 수 있다.

객체타입, 중첩테이블, LOB, REF, VARRAY 타입에는 사용할 수 없다.

FEEDBACK : 백업하는 도중에 행의 수마다 점(.)을 찍는다.

※ 백업 모드

익스포트는 데이터베이스 전체 모드, 사용자 모드, 테이블 모드의 3가지 모드로 백업을 할 수 있다. 다음은 3가지 모드별로 백업되는 내용이다.

* 테이블 모드

- 테이블 생성 스크립트

- 테이블 데이타

- 테이블 권한

- 인덱스

- 제약조건

- 트리거

* 사용자 모드

- 테이블 생성 스크립트

- 테이블 데이타

- 테이블 권한

- 인덱스

- 제약조건

- 트리거

- 클러스트

- 스냅샷

- 저장 프로시저

- 시노님

- 뷰

* 전체 모드

- 테이블 생성 스크립트

- 테이블 데이타

- 테이블 권한

- 인덱스

- 제약조건

- 트리거

- 클러스트

- 스냅샷

- 저장 프로시저

- 시노님

- 뷰

- 프로파일

- 롤

- 롤백 세그먼트

- 감사

- 테이블스페이스 데이터

* 데이터베이스 전체 모드 : 데이터베이스에 생성되어 있는 모든 사용자의 모든 객체를

백업해준다.

test:/oracle/app/oracle/product/8.1.5] exp userid=system/manager full=y

* 사용자 모드 : 데이터베이스 내에 특정 사용자의 객체들만 백업해 준다.

test:/oracle/app/oracle/product/8.1.5] exp userid=system/manager owner=bkso

* 테이블 모드 : 데이터베이스 내에 특정 사용자의 특정 테이블들만 백업한다.

test:/oracle/app/oracle/product/8.1.5] exp userid=bkso/bkso tables = (bkso.dept,

bkso.enrol, bkso.student)

다음 예제는 익스포트 유틸리티를 사용하는 방법이다.


9) 임포트

임포트는 익스포트된 파일을 이용해서 데이터베이스에 객체를 다시 생성하는 유틸리티이다. 또한 ASCII 파일 형태를 EBCDIC 파일 형태로 변환하여 데이터를 저장할 수도 있다. 다음은 익스포트 유틸리티에서 사용할 수 있는 파라메터의 종류이다.

USERID : 접속할 오라클의 사용자명/패스워드

BUFFER : 엑스포트와 같다

FILE : 엑스포트와 같다

SHOW : Y값으로 설정되면 실제 복구 작업은 실행되지 않고 복구해야할 내역만

화면에 출력

IGONRE : 이미 존재하는 테이블에 대해 복구작업을 실행하면 'Object already exists'

라는 에러가 발생하는데 이 에러를 무시하고 계속 복구작업 수행

INDEXES : 인덱스를 별도로 생성할 것인지 표시

ROWS : 테이블의 데이타를 복구할 것인지 표시

FULL : 백업된 모든 데이타를 복구

FROMUSER : 여기에 정의된 사용자가 가지고 있는 모든 객체를 복구

TOUSER : 여기에 정의된 사용자가 FROMUSER 리스트에 정의되어 있는 사용자의

모든 객체를 복구

TABLES : 복구할 테이블을 지정하여 복구 TABLES = (emp, dept)

RECORDLENGTH : 한번에 임포트할 수 있는 파일의 레코드 길이를 정의

INCTYPE : 복구할 파일의 COMPLETE, CUMULATIVE, INCREMENTAL

유형을 정의

COMMIT : Y를 설정하면 각 배열을 입력한후 commit문을 실행

HELP : 도움말

PARFILE : 임포트 파라미터를 외부 파일에 정의하여 사용하는 경우 파일명 표시

imp USERID = scott/tiger PARFILE = test.par

LOG : 모든 에러 메세지를 기록하는 파일명을 표시

DESTORY : 데이타베이스에 이미 존재하는 객체를 삭제후 재생성해주며

FROMUSER, TOUSER 옵션과 같이 사용한다.

INDEXFILE : 엑스포트 파일에 있는 모든 객체를 재생성 할 수 있는 CREATE문과

ALTER문을 외부 파일로 생성해 준다.

※ 익스포트 모드

익스포트와 마찬가지로 임포트도 데이터베이스 전체 모드, 사용자 모드, 테이블 모드의 3가지 모드로 복구할 수 있다.

* 데이터베이스 전체 모드 : 백업된 파일로부터 모든 사용자의 모든 객체를 복구한다.

test:/oracle/app/oracle/product/8.1.5] imp userid=system/manager

·

·

import entire export file (yes/no) : yes > yes

* 사용자 모드 : 백업된 파일로부터 특정 사용자의 객체들만 복구해준다.

test:/oracle/app/oracle/product/8.1.5] imp userid=system/manager

·

·

import entire export file (yes/no) : yes > yes

username : bkso

·

·

* 테이블 모드 : 백업된 파일로부터 특정 사용자의 특정 테이블들만 복구한다.

test:/oracle/app/oracle/product/8.1.5] imp userid=bkso/bkso

·

·

enter table names . null list means all tables for user

enter table names or . if done : emp --> 복구할 테이블명 1

enter table names or . if done : dept --> 복구할 테이블명 2

enter table names or . if done : . --> 작업 종료

·

·

다음 예제는 유틸리티를 사용하는 방법이다.


3. 완전 복구

데이터베이스에 문제가 발생했던 시점까지 복구되는 것을 완전복구(Complete Recovery)라고 한다. 완전 복구에는 3가지 방법이 있다.

* 전체 복구 : 데이터베이스 전체적인 복구작업이 실행되는 것을 의미한다.

* 테이블 스페이스 복구 : 특정 테이블스페이스에 문제가 발생했던 시점까지 복구되는 것을

의미한다.

* 데이터 파일 복구 : 특정 데이터 파일에 문제가 발생했던 시점까지 복구되는 것을 의미한다.

1) 전체 복구

다음은 전체 복구를 실행하는 방법이다.

(1) 데이터베이스를 종료해야 한다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal

SQL> shutdown immediate;

(2) 백업되었던 데이터 파일을 디스크에 설치한다. (홀 백업에 의해 백업되었던 모든 파일 또는 오픈백업에 의해 백업된 파일들을 해당경로에 다시 설치)

test:/oracle/app/oracle/product/8.1.5] cp backup/*.ora dbs

test:/oracle/app/oracle/product/8.1.5] cp backup/*.dbf dbs/oradata/testora

test:/oracle/app/oracle/product/8.1.5] cp backup/*.ctl dbs/oradata/testora

test:/oracle/app/oracle/product/8.1.5] cp backup/*.log dbs/oradata/testora

(3) sqlplus로 접속한 후 데이터베이스를 마운트 단계까지만 시작한다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal

SQL> startup mount;

(4) 'recover database' 명령을 실행하여 데이터베이스의 모든 변경 내용들을 복구한다. 복구에 소요되는 시간은 최종 백업시간과 백업파일의 크기, 아카이브 로그의 수에 따라 다르며 수초에서 여러시간이 소요될 수도 있다.

SQL> recover database;

media recovery complete.

(5) 복구작업이 완료되면 데이터베이스를 오픈한다. 그러면, 데이터베이스는 완전히 복구되고

사용가능한 상태가 된다.

SQL> alter database open;

2) 테이블스페이스 복구

※ 테이블스페이스 복구를 실행하는 방법

(1) 데이터베이스를 종료해야 한다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal

SQL> shutdown immediate;

(2) 백업 되었던 특정 테이블 스페이스의 데이터 파일을 디스크에 설치한다.

test:/oracle/app/oracle/product/8.1.5]

cp backup/users01.dbf dbs/oradata/testora

test:/oracle/app/oracle/product/8.1.5]

cp backup/users02.dbf dbs/oradata/testora

(3) sqlplus로 접속한 후 데이터베이스를 마운트 단계까지만 시작한다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal

SQL> startup mount;

(4) 복구 작업을 실행할 테이블스페이스의 데이터 파일을 오프라인(OFFLINE)한 다음

데이터베이스를 오픈해야 한다.

SQL> alter database datafile 'dbs/oradata/testora/users01.dbf offline

SQL> alter database datafile 'dbs/oradata/testora/users02.dbf offline

SQL> alter database open;

(5) 복구 작업을 실행할 데이터 파일의 테이블스페이스를 오프라인(OFFLINE)하고

'recover tablespace'명령을 실행하여 데이터베이스의 모든 변경 내용들을 복구한다.

SQL> alter tablespace users offline;

SQL> recover tablespace users;

(6) 복구가 완료되면 테이블스페이스를 온라인(ONLINE)로 설정해야 한다. 그러면 데이터베이스는

완전히 복구되고 사용 가능한 상태가 된다.

SQL> alter tablespace users online;

3) 데이터 파일 복구

※ 데이터 파일 복구를 실행하는 방법

(1)데이터베이스를 종료해야 한다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal

SQL> shutdown immediate;

(2) 백업되었던 특정 테이블스페이스의 데이터 파일을 디스크에 설치한다.

test:/oracle/app/oracle/product/8.1.5] cp backup/users01.dbf dbs/oradata/testora

test:/oracle/app/oracle/product/8.1.5] cp backup/users02.dbf dbs/oradata/testora

(3) sqlplus로 접속한 후 데이터베이스를 마운트 단계까지만 시작한다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal

SQL> startup mount;

(4) 복구 작업을 실행할 테이블스페이스의 데이터 파일을 오프라인(OFFLINE)한 다음

데이터베이스를 오픈해야 한다.

SQL> alter database datafile 'dbs/oradata/testora/users01.dbf' offline;

SQL> alter database datafile 'dbs/oradata/testora/users02.dbf' offline;

SQL> alter database open;

(5) 'recover datafile'명령을 실행하여 데이터베이스의 모든 변경 내용들을 복구한다. 그러면

데이터베이스는 완전히 복구되고 사용 가능한 상태가 된다.

SQL> recover datafile 'dbs/oradata/testora/users01.dbf';

SQL> recover datafile 'dbs/oradata/testora/users02.dbf';

4. 불완전 복구

1) 시간기반 복구

예를 들어, 어떤 개발자가 실수로 테이블 내의 모든 행을 삭제했다고 가정해 보면, 데이터베이스에 대한 완전복구는 수행할 수 없을 것이다. 테이블의 행을 삭제했던 모든 작업내역은 아카이브 로그파일 내에 존재하고 있기 때문에 아카이브 파일을 이용하면 간단히 복구할 수 있고 실수로 삭제한 테이블의 행은 복구될 것이다. 만약, 오후 2:30분에 실수로 테이블을 삭제한 사실을 알고 있다면 오후 2:29 까지만 복구하면 삭제된 테이블을 복구할 수 있게 된다. 이러한 방법을 시간기반 복구(time based recovery)라고 한다.

※ 시간기반의 복구 절차

(1) 데이터베이스를 종료해야 한다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal

SQL> shutdown immediate;

(2) 백업되었던 데이터 파일을 디스크에 설치한다.

test:/oracle/app/oracle/product/8.1.5]

cp backup/users01.dbf dbs/oradata/testora

test:/oracle/app/oracle/product/8.1.5]

cp backup/users02.dbf dbs/oradata/testora

(3) sqlplus로 접속한 후 데이터베이스를 마운트 단계까지만 시작한다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal

SQL> startup mount;

(4) 다음 명령어를 사용하여 데이터베이스를 지정한 시간까지만 복구한다. 경과 시간은 최종

백업시간과 데이터 파일의 크기, 아카이브의 수에 따라 다르며 수초에서 여러 시간이 소요될 수 있다.

SQL> recover database until time '2002-07-30:23:00:00';

(5) 데이터베이스를 다시 오픈해야 한다.

SQL> alter database open;


2) 취소기반 복구

아카이브 로그파일은 순차적으로 생성되고 관리되지만 디스크가 깨진다거나 파일을 실수로 삭제하는 경우가 발생할 수 있다. 이런 경우 사용자들은 복구작업시 필요한 아카이브 로그 파일을 사용하여 전체 복구를 하지 못하고 아카이브 파일이 존재하는 부분까지만 복구하게 될 것이다. 이러한 경우에 사용되는 복구방법이 취소기반(cancel based)복구 방법이다. 복구 작업은 존재하는 마지막 아카이브 파일까지만 적용되고 그 이후 부분은 복구를 하지 못하게 된다.

※ 취소기반(cancel based) 복구 방법

(1) 데이터베이스를 종료 해야한다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal

SQL> shutdown immediate;

(2) 백업되었던 데이터 파일을 디스크에 설치한다.

test:/oracle/app/oracle/product/8.1.5]

cp backup/users01.dbf dbs/oradata/testora

test:/oracle/app/oracle/product/8.1.5]

cp backup/users02.dbf dbs/oradata/testora

(3) sqlplus로 접속한 후 데이터베이스를 마운트 단계까지만 시작한다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal

SQL> startup mount;

(4) 다음 명령어를 사용하여 데이터베이스를 마지막 아카이브 파일까지만 복구한다.

경과시간은 최종 백업 시간과 데이터 파일의 크기, 아카이브의 수에 따라 따르며 수 초에서 여러 시간이 소요될 수 있다.

SQL> recover database until cancel;

로그지정 : {<RET>=suggested | 파일명 | AUTO | CANCEL

<RET>는 리턴(RETURN)을 의미하며 arc_123.arc 아카이브 파일을 복구작업에 사용한다는 의미를 가지고 있고 AUTO는 데이터베이스 서버가 적용할 수 있는 모든 아카이브 파일을 자동으로 적용해주며 CANCEL은 복구 작업을 중단하게 된다.

마지막 존재하는 아카이브 파일까지만 적용을 하고 존재하지 않는 아카이브 파일을 적용할 때 'cancel'를 입력한다.

(5) 데이터베이스를 오픈해야 한다.

SQL> alter database open;


3) 변경기반 복구

변경기반(change-based) 복구 방법은 데이터베이스에서 일어나는 특별한 변화를 근거로 데이터베이스를 복구하는 방법이다. 이 방법은 아카이브 로그 파일이 하나라도 없을 때 사용될 수 있다. 이런 경우에 사용자들은 SCN(SYSTEM CHANGE NUMBER)이나 아카이브 로그파일을 이용하여 데이터베이스를 복구 할 수 있다. 데이터베이스의 모든 변경에 대한 정보는 V$LOG_HISTORY를 질의하여 #20 파일을 잃어버렸다고 가정하면 #19 파일의 SCN을 얻기 위해서 V$LOG_HISTORY를 질의하여 #20 파일에 대한 SCN을 확인한 후 그 이전 단계를 살펴보면 #19 파일의 마지막 변화에 대한 SCN을 알 수 있다. 그런 다음 #19 파일까지를 복구하면 된다.

test:/oracle/app/oracle/product/8.1.5] sqlplus internal

SQL> startup mount

이 문장이 실행될 때 요구되는 아카이브 로그파일들이 아카이브 디렉토리 내에 존재하는지를 자동으로 확인하기 위해 오라클 서버가 첫 번째 아카이프 로그파일에 대한 이름을 요구할 때 'auto'를 입력하면 자동으로 아카이브 파일들을 적용하여 복구작업을 실행한다.

학습효과를 높이고 싶으시면 들어오세요