행위

오라클 복구 클론DB 이용

DB CAFE

thumb_up 추천메뉴 바로가기




Oracle DB 무정지 상태에서 복구 Clone DB를 사용한 exp/imp 복구 Oracle-Backup & Recovery 2015.04.23 03:28


- 운영 DB Open 상태에서 Clone DB를 생성한 다음 recover를 통해서 복구후에 exp/imp 수행 - Archive Log로 복구하기때문에 Archive Log Mode 상태여야 함

- Clone DB의 Data File은 Backup에서 복사, Control File은 운영DB에서 재생성, Redo Log File은 리셋




- 주요 절차

>> 운영DB Full Backup된 상태에서 delete,commit발생
>> Clone DB생성
>> Clone DB를 통해서 Recover
>> Clone DB Export Data
>> 운영DB Import Data




- 세부 절차

1. 논리적 장애 발생 : 테이블 생성 >> 데이터 입력 >> 커밋 >> 테이블 삭제(장애발생)

- 테이블 삭제 시각 확보

2. CloneDB용 파라미터 파일 복사(여기서는 pfile 사용)

3. 백업 데이터 파일 복사

4. 컨트롤 파일 재생성

5. CloneDB에서 Control File 생성 >> CloneDB 마운트 >> 장애 난 시점으로 시간 기간 복구 >> DB Open

6. 복구한 테이블 Export

7. 운영DB에서 Import






>> 장애 상황 발생

create table scott.abc(no number);

insert into scott.abc values(1);

insert into scott.abc values(2);

insert into scott.abc values(3);

commit;

drop table scott.abc;




>> Log Switch 발생(Recover 할때 사용할 Archive Log File 생성을 위해)

alter system switch logfile;

/

/

/




>> Log Miner로 장애 시점을 찾음

exec dbms_logmnr_d.build(dictionary_filename=>'dict.dat', dictionary_location=>'/app/oracle/logminer');

@logmnrl

@log

exec dbms_logmnr.add_logfile('/app/oracle/oradata/testdb/redo01.log', 1);

exec dbms_logmnr.add_logfile('/app/oracle/oradata/testdb/redo02.log', 3);

exec dbms_logmnr.add_logfile('/app/oracle/oradata/testdb/redo03.log', 3);

!

rm arch.sql

sh ar.sh

tail -10 arch.sql

exit

@arch

@logmnrl

exec dbms_logmnr.start_logmnr(dictfilename=>'/app/oracle/logminer/dict.dat');

또는 (DML이 많을 경우에)

exec dbms_logmnr.start_logmnr(dictfilename=>'/app/oracle/logminer/dict.dat', options=>dbms_logmnr.ddl_dict_tracking);

@logmnrc seg_name: ABC

(drop table scott.abc의 timestamp확인 >> 2015-04-21:07:33:21 >> 여기에서 1~2초를 빼서 복구할때 사용)




>> Clone DB 생성 파라미터 파일 복사 >> 수정

!

cd $ORACLE_HOME/dbs/

cp inittestdb.ora initclonedb.ora

vi initclonedb.ora

  • .control_files='/data/temp/control01.ctl'
  • .db_name='clonedb'
    • .memory_target=423624704 # 주석처리




>> 백업 Data File 복사

cp /data/backup/close/*.dbf /data/temp/ -v

exit




>> Control File 재생성 sql 수정

alter database backup controlfile to trace as '/home/oracle/mkctl.sql';

!

vi mkctl.sql

(

1. 처음 나타나는 STARTUP 구문 부터 ;까지만 남기고 제거

2. REUSE 를 SET 으로 변경

3. TESTDB 를 CLONEDB 로 변경

4. NORESETLOGS를 RESETLOGS로 변경

4. 모든 파일의 경로 /app/oracle/oradata/testdb 를 /data/temp 로 변경

)



CREATE CONTROLFILE SET DATABASE "CLONEDB" RESETLOGS ARCHIVELOG

   MAXLOGFILES 16
   MAXLOGMEMBERS 3
   MAXDATAFILES 100
   MAXINSTANCES 8
   MAXLOGHISTORY 292

LOGFILE

 GROUP 1 '/data/temp/redo01.log'  SIZE 50M BLOCKSIZE 512,
 GROUP 2 '/data/temp/redo02.log'  SIZE 50M BLOCKSIZE 512,
 GROUP 3 '/data/temp/redo03.log'  SIZE 50M BLOCKSIZE 512

-- STANDBY LOGFILE

DATAFILE

 '/data/temp/system01.dbf',
 '/data/temp/sysaux01.dbf',
 '/data/temp/undotbs01.dbf',
 '/data/temp/users01.dbf',
 '/data/temp/example01.dbf'


CHARACTER SET KO16MSWIN949




      • 지금 부터는 새창으로 작업하는게 편함



>> Clone DB로 접속 >> 컨트롤 파일 생성 >> 복구 >> DB오픈

export ORACLE_SID=clonedb # initclonedb.ora를 소문자로 했기때문에 소문자로 세팅

echo $ORACLE_SID

sqlplus / as sysdba

@mkctl

select instance_name from v$instance;

!ps -ef | grep ora_

recover database until time '2015-04-21:07:33:20' using backup controlfile;

AUTO

alter database open resetlogs;

select * from scott.abc;



>> clonedb에서 Export >> testdb에서 Import

!exp scott/tiger file=/home/oracle/abctbl.dmp tables=abc

!ls /home/oracle/abctbl.dmp

shutdown immediate

exit

export ORACLE_SID=testdb

echo $ORACLE_SID

sqlplus / as sysdba

select instance_name from v$instance;

!imp scott/tiger file=/home/oracle/abctbl.dmp tables=abc ignore=y













      • 로그마이너 관련 쿼리

@logmnrl

select filename , status from v$logmnr_logs



@logmnrc

select to_char(timestamp, 'yyyy-mm-dd:hh24:mi:ss') timestamp,

       to_char(commit_timestamp, 'yyyy-mm-dd:hh24:mi:ss') commit_timestamp,
       username, operation, table_name, sql_redo

from v$logmnr_contents

where seg_name='&seg_name'


출처: https://dbaguide.tistory.com/73?category=509242 [DBA Guide]