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하셔서
또한, 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한다는 의미입니다.)
5. 원래 DB에 import하기(운영중인 원래 DB에서 하세요)
운영중인 DB에서 SQL잠시 나온 후(shutdown 이 아닙니다, 그냥 ! 로 나오는 것)
$ imp 치시고 import 하세요
하지만 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
으로 바꿉니다.
부분의 스크립트를 남기시고 나머지는 다 지우고
-------------->
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로 접속합니다)
(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합니다)