Oracle/백업&복구

복구시 Clone DB만드는법, 만드는 이유, export, import 하는법

에몽이ㅋ 2012. 2. 3. 09:19
DB가 운영중에 datafile이 손상되는 경우가 있습니다.

하지만 DB는 계속 운영이 되어야 하므로, CloneDB를 만들어서 그 clone을 이용해서 복구하고 export한 후
복구된 자료를 원래 DB로 import하게되면, 운영중인 DB를 끄지않고, 자료만 싹 복구 할 수 있습니다.

( ↑ clone DB 만드는 이유 중 하나 )



clone DB생성방법
(운영중인 DB와 clone DB는 같은 하드안에 있다고 가정합니다.)
(clone DB의 SID를 CLONE으로 하겠습니다.
clone DB의 모든 파일들은 /data/clone안에 넣겠습니다.)
 

1. 파일복사단계 
백업된 datafile들을 /data/clone안에 복사합니다.
운영중인 redolog file을 /data/clone안에 복사합니다.
   --> 실제 DB가 운영되고 있다면, 불가능하므로 alter system switch logfile; 로 아카이브로 떨어뜨려주세요. 
(그리고 redolog는 재생성할 것이기때문에, 복사안하셔도 됩니다.) 



2. 파라미터파일 단계
파라미터파일 복제(initclone.ora로 같은 경로($ORACLE_HOME/dbs)에 복제합니다.)
initclone.ora안의 db_name부분값을 clone으로 바꿔줍니다.
control_files 부분을 /data/clone 으로 경로 수정합니다. 


3. control file 재생성 스크립트 만들어주기
운영중인 DB에서
    SQL>alter database backup controlfile to trace as '/home/oracle/c.sql';   (파일경로는 권한이 있는 곳이면 아무곳이나 가능)
이후 vi c.sql하셔서
CREATE CONTROLFILE REUSE DATABASE "운영중인DB" RESETLOGS  ARCHIVELOG 
부분의 스크립트를 남기시고 나머지는 다 지우고
-------------->
CREATE CONTROLFILE SET DATABASE "CLONE" RESETLOGS  ARCHIVELOG   
으로 바꿉니다. 
 
또한, redolog file들의 경로와 datafile들의 경로를 clonedb에 맞게 셋팅합니다
(여기서는 cloneDB의 파일들이 모두 /data/clone안에 있으므로 /data/clone안으로 전부 셋팅하면 됩니다.)

4. cloneDB로 접속하기
putty 사용시, 창을 하나 더 열어서 oracle계정으로 로그인 후
$ export ORACLE_SID=clone
을 하신 다음
$ sqlplus / as sysdba 한다음

SQL> @/home/oracle/c  하시면 controlfile이 생성되면서 mount단계까지 올라갑니다.


********* 여기까지가 cloneDB생성 및 접속입니다.

하지만, 아직 숙제가 남았죠? 자료들을 복구하고 원래 DB로 그 자료들을 넣어줘야합니다.

CloneDB에서 자료복구하고 원래 DB에 자료들 부어주기 
1. 복구시도(clone DB에서 하세요)
SQL> recover database until time '     ';  (원하는 자료가 있는 시점으로 복구하세요)

복구 후

2. 복구시도 후 OPEN하기
SQL> alter database open resetlogs;  로 open단계로 올라갑니다.

3. 원하는 자료가 있는지 확인

4. 확인 후 그 자료를 export하기
SQL에서 잠시 나와서

$ exp 자료가있는계정/패스워드 file='자료들을저장할덤프파일.dmp' [full=y  or  tables=원하는테이블]
(full=y옵션은 해당 user의 모든 자료들을 덤프파일에 export한다는 의미이고,
tables= 옵션은 해당 user의 원하는 table만 덤프파일에 export한다는 의미입니다.)

**export 오류가 날때
 보통, 백업시 temp tablespace는 저장하지 않으므로, export시 default temp tablespace를 만들어줘야 export가 정상적으로 가능합니다.
( http://gyh214.tistory.com/91(복구 후 Tablespace 사용하도록 하는 방법) 에서 두번째 방법 참고 )



5. 원래 DB에 import하기(운영중인 원래 DB에서 하세요)
운영중인 DB에서 SQL잠시 나온 후(shutdown 이 아닙니다, 그냥 ! 로 나오는 것)

$ imp     치시고 import 하세요

Import: Release 10.2.0.5.0 - Production on Fri Feb 3 09:03:20 2012

Copyright (c) 1982, 2007, Oracle.  All rights reserved.

Username: sys/oracle as sysdba   <----- 손실된 table이 있는 계정입니다.(자료를 넣고싶은 계정)
                                              (sys계정이라 비밀번호 as  sysdba로 접속합니다)

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Import data only (yes/no): no >

Import file: expdat.dmp > /home/oracle/temp/test_b.dmp    <---- CLONE에서 자료들을 export한 dump파일을 적어줍니다.

Enter insert buffer size (minimum is 8192) 30720>

Export file created by EXPORT:V10.02.01 via conventional path
import done in KO16MSWIN949 character set and AL16UTF16 NCHAR character set
List contents of import file only (yes/no): no >

Ignore create error due to object existence (yes/no): no >

Import grants (yes/no): yes >

Import table data (yes/no): yes >

Import entire export file (yes/no): no >
Username: sys     <----- fromuser=sys(clone의 sys계정에서 export했으므로, sys라고 적어줍니다)

Enter table(T) or partition(T:P) names. Null list means all tables for user
Enter table(T) or partition(T:P) name or . if done:

. importing SYS's objects into SYS
. importing SYS's objects into SYS
. . importing table                       "TEST_B"          5 rows imported
Import terminated successfully without warnings.
(** export할 때, TEST_B 테이블만을 export했으므로 import할때도 해당 테이블만 import합니다)