본문 바로가기

오라클 백업/복구

Clone DB를 이용한 무정지 상태에서의 응급 복구



Clone DB

한 서버에 인스턴스를 여러개 띄우는 것

많은 목적으로 사용하지만 여기서는 복구용 목적으로 사용



Clone DB 생성개념





Clone DB를 사용한 복구 방법

어떤 장애더라도 대략적인 내용은 다 똑같다.

1. Clone DB용 파라미터 파일 생성 (수정 가능한 pfile로)

2. pfile 수정

3. 백업되어있는 데이터파일 임시경로로 restore

4. 컨트롤 파일 재생성을 위한 스크립트 생성

5. 스크립트 수정

6. Clone DB로 접속한 후 스크립트로 DB MOUNT

7. 장애난 시간 전까지로 해서 장애 복구

8. resetlogs로 DB OPEN

9. 복구 확인 후 export/import나 DB LINK를 통해 운영 DB로 복구 데이터 보내기

10. 복구 확인


※ 마무리 작업 ※

복구 끝나면 Clone DB shutdown 하고 관련 파일들 삭제해주기

파라미터 파일 삭제는 (clone DB SID=testdb2라고 했을 때)

$ORACLE_HOME/dbs/ 에서 inittestdb2.ora, lkTESTDB2 hc_testdb2.dat 이렇게 3개 지워주면 됨




데이터 복구 후 Exp/Imp로 옮기기


[실습1- drop table 복구]

백업파일경로: /data/backup/close

운영서버SID: testdb

복구서버SID: testdb2

복구서버 파일경로: /data/temp/clone


> !


$ cd /app/oracle/product/11g/dbs

$ cp inittestdb.ora inittestdb2.ora

$ vi inittestdb2.ora

control file 경로 수정

db_name 수정

memory_target 주석처리

$ cp /data/backup/close/*.dbf /data/temp/clone

$ exit


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

> !


$ vi /home/oracle/rectl.sql

수정


$ export ORACLE_SID=testdb2

$ sqlplus / as sysdba

> @/home/oracle/rectl.sql


Log Miner로 복구시간 찾아내기


$ export ORACLE_SID=testdb

$ sqlplus / as sysdba


> alter database add supplemental log data ;

> exec dbms_logmnr_d.build('dict099.dat','/data/logmnr') ;

> exec dbms_logmnr.add_logfile('/data2/vol3/redo01_a.log',1) ;

> @arc_logmnr (아카이브로그 추가하는 스크립트)

> exec dbms_logmnr.start_logmnr(dictfilename=>'/data/logmnr/dict099.dat') ;

> select timestamp, username, operation, sql_red from v$logmnr_contents

   where seg_name='GOGAK9' and seg_owner='SCOTT' ;


$ export ORACLE_SID=testdb2

$ sqlplus / as sysdba


> recover database until time 'time' using backup controlfile ;

> alter database open resetlogs ;


>!


$ export ORACLE_SID=testdb2

$ exp scott/tiger file=gogak9.dmp tables=gogak9


$ export ORACLE_SID=testdb

$ imp scott/tiger file=gogak9.dmp ignore=y



[작업내용]




[실습2- drop tablespace 복구]

백업파일경로: /data/backup/open

운영서버SID: testdb

복구서버SID: testdb2

복구서버 파일경로: /data/temp/clone


> !


$ cd /app/oracle/product/11g/dbs

$ cp inittestdb.ora inittestdb2.ora

$ vi inittestdb2.ora

control file 경로 수정

db_name 수정

memory_target 주석처리

$ cp /data/backup/open/*.dbf /data/temp/clone

$ exit


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

> !


$ vi /home/oracle/recont.sql

수정

$ export ORACLE_SID=testdb2

$ sqlplus / as sysdba


> @recont


> recover database until time 'time' using backup controlfile ;


> alter database create datafile '/app/oracle/product/11g/dbs/UNNAMED00006' as '/data/temp/clone/test01.dbf' ;

> recover database until time 'time' using backup controlfile ;


ORA-01195: online backup of file 1 needs more recovery to be consistent

ORA-01110: data file 1: '/data/temp/clone/system01.dbf'


> shutdown immediate ;


$ vi /app/oracle/product/11g/dbs/inittestdb2.ora

_allow_resetlogs_corruption=true

$ exit


> startup mount ;

> alter database open resetlogs ;


>!


$ export ORACLE_SID=testdb2

$ exp scott/tiger file=gogak123.dmp tables=gogak123


$ export ORACLE_SID=testdb

$ imp scott/tiger file=gogak123.dmp ignore=y



[작업내용]




데이터 복구 후 DB LINK로 옮기기

DB LINK는 원격지의 데이터베이스를 마치 local DB인 것처럼 연결해 주는 기술
local DB 서버의 tnsnames.ora 파일과 원격지 DB 서버의 listener.ora 파일 설정 사용
listener.ora 에는 SID, port 등등의 내용이 들어있는데 오라클 전용 port는 1521지만 보안상 바꿔씀
여기 설정해 놓은 port와 tnsnames.ora에 설정해 놓은 port 가 서로 맞아야 접속 가능! 다르면 접속 안된다.

연결하려는 서버의 listener가 켜져있는지 확인하려면 tnsping 을 이용
서버는 켜져있지만 리스너가 죽으면 신규접속은 불가능하기 때문에 확인해야 함

$ORACLE_HOME/network/admin 에 tnsnames.ora , listener.ora 파일이 없는 경우는 생성해야 함

01234567891011121314151617




clone DB에서 복구 성공한 후에 DB LINK 생성 과정


1. tnsnames.ora와 listener.ora 파일 수정


tnsnames.ora 수정

기존 내용에서 아래 내용 추가하면 됨

cloneDB이름(임의로정해도상관없음) =

  (DESCRIPTION =

    (ADDRESS_LIST =

      (ADDRESS = (PROTOCOL = TCP)(HOST = clonedb로접속할ip주소 및 서버이름)(PORT = 포트번호))

    )

    (CONNECT_DATA =

      (SERVICE_NAME = clonedb의SID)

    )

  )


listener.ora 수정

기존 내용에서 아래 내용 추가하면 됨

LISTENER# =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = clonedb로접속할ip주소 및 서버이름)(PORT = 포트번호))

    )

  )


SID_LIST_LISTENER# =

  (SID_LIST=

      (SID_DESC =

          (SID_NAME = clonedb의SID)

          (ORACLE_HOME = /app/oracle/product/11g)

      )

  )


주의!

(HOST = clonedb로접속할ip주소 및 서버이름) 여기서 서버이름으로 쓸경우 /etc/hosts에 입력이 되어있어야만 쓸 수있음

tnsnames.ora 와 listener.ora에 쓰는 PORT=포트번호는 서로 같아야 접속 가능함!





2. 운영 서버에서 clone DB로 연결하는 DB LINK 생성

운영 서버에서!!!! 만들어야 한다!! 잊지 말기!

> CREATE DATABASE LINK 링크이름

   CONNECT TO 유저이름 IDENTIFIED BY 암호

   USING 'tnsname.ora에서쓴cloneDB이름' ;





3. clone DB로 접속 테스트

$ lsnrctl                            --> 리스너 관리 명령어

> status listerner#              --> 해당 리스너 상태 조회

> stop listerner#                --> 해당 리스터 중지

> start listerner#                --> 해당 리스터 시작

Service Summary 내용에 

Service "cloneDB의SID" has  # instance(s).

라고 나와야 정상적으로 접속 된 것임. unknown으로 나오면 다시 해야함


$ tnsping 'tnsname.ora에서쓴cloneDB이름' 

에러가 나지 않는다면 접속이 잘 된것.





4. clone DB로 조회 및 데이터 복사해오기

clone DB에 있는 테이블 조회

> SELECT * FROM 테이블명@DBLINK이름 ; 


CTAS로 clone DB에서 복구한 데이터를 운영DB로 복사

> CREATE TABLE 테이블명 AS SELECT * FROM 테이블명@DBLINK이름 ;




[실습1 - drop table 복구]



[실습2 - drop user 복구]




'오라클 백업/복구' 카테고리의 다른 글

백업 파일 / 아카이브 로그에 문제가 있을 때 복구  (0) 2013.02.13
SQL Loader  (0) 2013.02.11
Datapump  (1) 2013.02.06
IMPORT  (0) 2013.02.05
EXPORT  (0) 2013.02.04