Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-18
제목 TIME BASED RECOVERY를 통한 DROP한 TABLE 복구 방법
TIME BASED RECOVERY를 통한 DROP한 TABLE 복구 방법
=================================================

oracle database를 archive log mode로 운영 중인 경우 hot backup
또는 cold backup을 이용한 incomplete recovery가 가능하다.

다음은 archive log mode로 운영 중인 ORACLE database에서 drop 또는 truncate된
table에 대한 복구 예제로 현재 운영 중인 database를 계속 운영하면서 임시
database를 구성하고 필요한 table과 관계된 backup datafile을 이용하여
time based recovery를 통한 복구 방법에 대한 예이다.
테스트는 ORACLE 8에서 이루어졌다.


% 운영 중인 ORACLE instance의 ORACLE_SID를 'ORA8'이라고 하고 임시 instance의
ORACLE_SID를 'RECODB'라고 한다.

1. ORACLE owner user로 OS에 login하여 ORACLE_SID 설정 및 임시 database에
대한 구성 file을 위치시킬 새로운 directory를 생성한다.

$ ORACLE_SID=RECODB; export ORACLE_SID
$ echo $ORACLE_SID
RECODB
$ mkdir $ORACLE_HOME/dbs2

2. 새로운 instance에 대한 oracle kernel parameter file을 작성한다.

$ cp $ORACLE_HOME/dbs/initORA8.ora $ORACLE_HOME/dbs/initRECODB.ora

- 위의 initRECODB.ora에서 ifile parameter가 설정되어 있다면 그 값을 변경
하고 새로운 config file을 작성한다. 만일 설정이 되어 있지 않는 경우 다음에
설명되어지는 parameter들을 initRECODB.ora에서 변경한다.

[initORA8.ora]
ifile=$ORACLE_HOME/dbs/configORA8.ora

[initRECODB.ora]
ifile=$ORACLE_HOME/dbs2/configRECODB.ora

$ cp $ORACLE_HOME/dbs/configORA8.ora $ORACLE_HOME/dbs2/configRECODB.ora

- configRECODB.ora의 db_name을 새로운 database name으로 변경하고
control_files parameter의 file을 새로운 file로 설정한다.

[configORA8.ora]
control_files=($ORACLE_HOME/dbs/configORA8.ctl)
db_name=ORA8

[configRECODB.ora]
control_files=($ORACLE_HOME/dbs2/configRECODB.ctl)
db_name=RECODB

- 이 때 log_archive_dest와 log_archive_format 등에 대한 parameter는 변경
하지 않도록 한다.

3. 위의 초기화 화일들 작성이 정상적으로 되었다면 새로운 oracle instance를
start하여 본다.

$ echo $ORACLE_SID
RECODB
$ svrmgrl
SVRMGR> connect internal
SVRMGR> startup nomount
ORACLE instance started.

4. 운영 중인 ORA8 database에서 control file에 대한 trace file을 얻는다.

$ echo $ORACLE_SID
ORA8
$ svrmgrl
SVRMGR> connect internal
SVRMGR> alter database backup controlfile to trace;
SVRMGR> show parameter user_dump_dest

- 위의 명령을 수행 후, 발생되는 trace file은 user_dump_dest에 위치한다.
위의 directory에서 가장 최근에 발생한 trace file 내에 create controlfile
command 부분만 새로운 SQL file로 저장한다.


5. control file 생성 명령문을 새로운 database의 내용에 따라 script file을
작성한다.
이 때 복구에 필요한 datafile들만(system, rbs, temp 및 복구할 table에
관련된 user datafile) datafile list에 등록하도록 한다.

ex) file name : crctl.sql
CREATE CONTROLFILE set DATABASE "RECODB" RESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 30
MAXINSTANCES 8
MAXLOGHISTORY 904
LOGFILE
GROUP 1 '/mnt3/rctest80/server/lsh/dbs2/redo1ORA8.log' SIZE 500K,
GROUP 2 '/mnt3/rctest80/server/lsh/dbs2/redo2ORA8.log' SIZE 500K
DATAFILE
'/mnt3/rctest80/server/lsh/dbs2/syst1ORA8.dbf',
'/mnt3/rctest80/server/lsh/dbs2/rbs1ORA8.dbf',
'/mnt3/rctest80/server/lsh/dbs2/temp1ORA8.dbf',
'/mnt3/rctest80/server/lsh/dbs2/usr1ORA8.dbf'
;

- control file 생성 script file이 완성되면 backup된 datafile들을 새로운
directory($ORACLE_HOME/dbs2)에 복사하여 둔다.

$cd $ORACLE_HOME/backup
$cp syst1ORA8.dbf /mnt3/rctest80/server/lsh/dbs2/
$cp rbs1ORA8.dbf /mnt3/rctest80/server/lsh/dbs2/
$cp temp1ORA8.dbf /mnt3/rctest80/server/lsh/dbs2/
$cp usr1ORA8.dbf /mnt3/rctest80/server/lsh/dbs2/

6. RECODB instance에서 위의 control file 생성문을 이용하여 control file을
생성한다. (이 때 ORACLE 7.X server의 경우 RECODB와 ORA8이 동일한
server에서 수행되면 다음과 같은 메시지를 발생시키며,
ORA-09782: sfifi: another instance has the same database mounted.
운영 중인 ORA8을 shutdown 후 RECODB의 control file 생성이 가능하다.)

SVRMGR> connect internal
SVRMGR> shutdown normal
SVRMGR> startup nomount
SVRMGR> @crctl
Statement processed.

7. control file이 생성되어지면 time based recovery 작업을 한다.

SVRMGR> alter session set nls_date_format='YYYY-MM-DD:HH24:MI:SS';
SVRMGR> recover database using backup controlfile until time
'1999-05-28:01:20:03';
ORA-00279: change 5407740174583 generated at 05/28/99 12:53:31
needed for thread
ORA-00289: suggestion : /mnt3/rctest80/server/lsh/log0000000001.ARC
ORA-00280: change 5407740174583 for thread 1 is in sequence #1
Specify log: {=suggested | filename | AUTO | CANCEL}
AUTO

- 위의 시간은 table drop/truncate 하기 직전 시점

8. recovery가 완료되면 db를 open하고 복구하고자 하는 table을 export받는다.

SVRMGR> alter database open resetlogs;

exp . . .
Comment
등록된 코멘트가 없습니다.