DB 무정지 상태에서의 복구
Clone db 와 exp/imp 를 이용한 drop table 복구
 

파라미터파일 : 복사
컨트롤파일   : 재생성
데이터파일   : 백업파일
리두로그파일 : 아카이브


 











=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-실습1 시작
실습 1: Clone db 와 exp/imp 를 이용한 drop table 복구
 
-전제조건
백업파일경로 : /data/backup/close/
운영DB SID : testdb
clone DB SID : testdb2 (복구용 DB)
clone DB 파일 경로 : /data/temp/clone/

 
 

★ 작업순서
1. 장애 상황 발생
  1) 테스트용 테이블 스페이스 생성 (test01)
  2) 테스트용 테이블 생성 (gogak) 후 데이터 입력
  3) 테이블 삭제 (시간확보해두기)
2. Clone db 용 파라미터 파일 생성 (pfile 사용)
3. 백업 데이터 파일 복원
4. 컨트롤 파일 재생성
5. 장애 난 시점 직전까지 시간기반 복구로 테이블 복구
   (운영 DB에서 로그스위치 일으켜서 아카이브 파일에 저장되도록 만들어 두기)
6. Export 수행 후 운영 db로 import 수행 (또는 DB Link 사용)
7. 복구 확인


 
 
 
장애 발생 --------------------------->>>>>>>>>>>>>>>>>>>>
 
 
 
1. 테이블생성 데이터 입력후 drop
 
 
  1) 테스트용 테이블 스페이스 생성 (test01)
SYS> create tablespace test01 datafile '/home/oracle/oradata/testdb/test01.dbf' size 10M;
 
SYS> shutdown immediate;
 
$ cp /home/oracle/oradata/testdb/* /data/backup/close/
 
 
  2) 테스트용 테이블 생성 (gogak) 후 데이터 입력
 
SYS> startup
SYS> conn scott/tiger;
SCOTT> create table gogak (no number, name varchar2(10), tel number(11)) tablespace test01;
SCOTT> begin
   2   for i in 1..100 loop
   3   insert into gogak values (i,dbms_random.string('A',10),dbms_random.value(1,10));
   4   end loop;
   5   commit;
   6   end;
   7   /
 
SCOTT> select * from gogak;
SCOTT> commit;
SCOTT> select to_char(sysdate, 'YYYY-MM-DD:HH24:MI:SS') from dual;
복구할 시간 기록
 
TO_CHAR(SYSDATE,'YYYY-MM-DD:HH24:MI:SS
--------------------------------------
2012-02-15:14:47:43
 
 
  3) 테이블 삭제 (시간확보해두기)
 
SCOTT> drop table gogak purge;
SCOTT> select * from gogak;
조회안됨
SCOTT> conn / as sysdba
 
SYS> alter system switch logfile;
SYS> /
SYS> /
SYS> /
SYS> /
SYS> /
 
 
복구 과정 --------------------------->>>>>>>>>>>>>>>>>>>>
 
2. 복구 서버 (testdb2)용 파라미터파일 생성
 
$ cd /home/oracle/product/10g/dbs/
$ cp inittestdb.ora inittestdb2.ora
 
- db_name과 control_files 값을 clone db로 변경
$ vi inittestdb2.ora
db_name=testdb2
control_files='/data/temp/clone/control01.ctl','/data/temp/clone/control02.ctl','/data/temp/clone/control03.ctl'
 
 
3. 백업 데이터 파일 복원
4. 컨트롤 파일 재생성
 : 컨트롤파일을 만들기 위해 생성 스크립트를 testdb에서 만들고 수정한다.
 : 컨트롤파일을 생성하려면 데이터파일이 존재해야 하기 때문에, 백업파일을 복원한다.
 
 
$ mkdir -p /data/temp/clone
$ cp /data/backup/close/*.dbf /data/temp/clone/
 
 
SYS> select instance_name from v$instance;
 
INSTANCE_NAME
--------------------------------
testdb
 
SYS> alter database backup controlfile to trace as '/home/oracle/cl.sql';
 
$ vi /home/oracle/cl.sql
 

※ 변경할 것
① DB 이름 변경
② Redo logfile 경로 변경
③ Data file 경로 변경


 
 
① DB 이름 변경
 REUSE → SET
 TESTDB → TESTDB2
 
② Redo logfile 경로 변경
각 경로 변경 : /home/oracle/oradata/testdb/ → /data/temp/clone/
 
 LOGFILE
      9   GROUP 1 (
     10     '/home/oracle/oradata/testdb/redo01_a.log',
     11     '/home/oracle/oradata/testdb/redo01_b.log'
     12   ) SIZE 5M,
     13   GROUP 2 (
     14     '/home/oracle/oradata/testdb/redo02_a.log',
     15     '/home/oracle/oradata/testdb/redo02_b.log'
     16   ) SIZE 5M,
     17   GROUP 3 (
     18     '/home/oracle/oradata/testdb/redo03_a.log',
     19     '/home/oracle/oradata/testdb/redo03_b.log'
     20   ) SIZE 5M
 
③ Data file 경로 변경
각 경로 변경 : /home/oracle/oradata/testdb/ → /data/temp/clone/
 
     21 DATAFILE
     22   '/home/oracle/oradata/testdb/system01.dbf',
     23   '/home/oracle/oradata/testdb/undotbs01.dbf',
     24   '/home/oracle/oradata/testdb/sysaux01.dbf',
     25   '/home/oracle/oradata/testdb/users01.dbf',
     26   '/home/oracle/oradata/testdb/example01.dbf',
     27   '/home/oracle/oradata/testdb/test01.dbf'
 
 
$ export ORACLE_SID=testdb2  ← testdb2를 시작시키기위해 접속한다.
 
 
 
$ sqlplus / as sysdba;
 
SQL> @/home/oracle/cl.sql
ORACLE instance started.
 
Total System Global Area  285212672 bytes
Fixed Size                  1273276 bytes
Variable Size              92275268 bytes
Database Buffers          188743680 bytes
Redo Buffers                2920448 bytes
 
Control file created.
 
 
SQL> select name from v$controlfile;
 
NAME
--------------------------------------------------------------------------------
/data/temp/clone/control01.ctl
/data/temp/clone/control02.ctl
/data/temp/clone/control03.ctl
 
 
 
 
 
5. 장애 난 시점 직전까지 시간기반 복구로 테이블 복구
   (운영 DB에서 로그스위치 일으켜서 아카이브 파일에 저장되도록 만들어 두기)
 
 
SQL> recover database until time '2012-02-15:14:47:43' using backup controlfile;
ORA-00279: change 611374 generated at 02/15/2012 14:38:49 needed for thread 1
ORA-00289: suggestion : /data/arc2/211_1_771258526.arc
ORA-00280: change 611374 for thread 1 is in sequence #211
 
 
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
Log applied.
Media recovery complete.
 
 
SQL> alter database open resetlogs;
 
SQL> select instance_name from v$instance;
 
INSTANCE_NAME
--------------------------------
testdb2
 
SQL> select count(*) from scott.gogak;
 
  COUNT(*)
----------
       100    ← testdb2에서 복구 완료
 
 
 
 
6. Export 수행 후 운영 db로 import 수행 (또는 DB Link 사용)
 
 
$ export ORACLE_SID=testdb2
$ exp scott/tiger file=gogak.dmp tables=gogak
. . exporting table                          GOGAK        100 rows exported
Export terminated successfully without warnings.
 
 
 
$ export ORACLE_SID=testdb
$ imp scott/tiger file=gogak.dmp ignore=yes
 
※ 참고 : 에러뜨면
IMP-00013: only a DBA can import a file exported by another DBA
IMP-00000: Import terminated unsuccessfully
 
$ imp scott/tiger file=gogak.dmp ignore=yes fromuser=scott touser=scott;
해주면 된다.
 
 
 
7. 복구 확인
 
SQL> select instance_name from v$instance;
SQL> select count(*) from scott.gogak;
 
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-실습1 끝
 
 




 
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-실습2 시작
실습 2: Clone DB를 이용한 drop tablespace 복구
 
 
-전제조건
백업파일경로 : /data/backup/close/
운영DB SID : testdb
clone DB SID : testdb2 (복구용 DB)
clone DB 파일 경로 : /data/temp/clone/

 
 

★ 작업순서
1. 복구 서버용 파라미터 파일생성
2. 백업 데이터 파일 복원
3. 컨트롤 파일 재생성
4. 불와전 복구 시작
5. Test01.dbf 파일 내용 수정하고 다시 복구 시작
6. 복구 완료되면 export 후 운영서버에 import 수행


 
 
장애 발생 --------------------------->>>>>>>>>>>>>>>>>>>>
 
1) 현재상황 확인
 
$ export ORACLE_SID=testdb
$ sqlplus / as sysdba;
 
$ vi ddf.sql
set line 200
col tablespace_name for a10
col file_name for a50
 
select tablespace_name, bytes/1024/1024/ MB, file_name
from dba_data_files
/
:wq!
 
2) 전체 열린 백업
 
SQL> !vi ob.sql
conn / as sysdba;
 
alter tablespace system begin backup;
!cp -av /home/oracle/oradata/testdb/system01.dbf /data/backup/open/
alter tablespace system end backup;
 
alter tablespace sysaux begin backup;
!cp -av /home/oracle/oradata/testdb/sysaux01.dbf /data/backup/open/
alter tablespace sysaux end backup;
 
alter tablespace undotbs1 begin backup;
!cp -av /home/oracle/oradata/testdb/undotbs01.dbf /data/backup/open/
alter tablespace undotbs1 end backup;
 
alter tablespace example begin backup;
!cp -av /home/oracle/oradata/testdb/example01.dbf /data/backup/open/
alter tablespace example end backup;
 
alter tablespace users begin backup;
!cp -av /home/oracle/oradata/testdb/users01.dbf /data/backup/open/
alter tablespace users end backup;
 
alter database backup controlfile to '/data/backup/open/control.ctl';
:wq!
 
SQL> @ob.sql
 
 
3) Test01 테이블스페이스 생성 후 gogak 테이블 생성하고 데이터 입력
 
SQL> create tablespace test01 datafile '/home/oracle/oradata/testdb/test01.dbf' size 10M
 
SQL> conn scott/tiger
 
SCOTT> create table gogak (no number, name varchar2(10), tel number(11)) tablespace test01;
SCOTT> begin
   2   for i in 1..100 loop
   3   insert into gogak values (i,dbms_random.string('A',10),dbms_random.value(1,100));
   4   end loop;
   5   commit;
   6   end;
   7   /
 
SCOTT> select * from gogak;
 
SCOTT> commit;
SCOTT> select to_char(sysdate, 'YYYY-MM-DD:HH24:MI:SS') from dual;
복구할 시간 기록
 
 
4) 장애발생
 
SQL> conn / as sysdba;
 
SQL> drop tablespace test01 including contents and datfiles;
 
SQL> alter system switch logfile;
 
SQL> /
SQL> /
SQL> /
SQL> /
SQL> /
 
 
Alert log 에서 삭제 시간 확인해 보기.
$ vi /home/oracle/admin/testdb/bdump/alert_testdb.log
 
 
 
 
복구 과정 --------------------------->>>>>>>>>>>>>>>>>>>>
 

★ 작업순서
1. 복구 서버용 파라미터 파일생성
2. 백업 데이터 파일 복원
3. 컨트롤 파일 재생성
4. 불완저 복구 시작
5. Test01.dbf 파일 내용 수정하고 다시 복구 시작
6. 복구 완료되면 export 후 운영서버에 import 수행


 
 
 
 
1. 복구 서버용 파라미터 파일생성
 
$ cd /home/oracle/product/10g/dbs/
$ ls
$ rm -fr inittestdb2.ora lkTESTDB2 hc_testdb2.dat
$ cp inittestdb.ora inittestdb2.ora
 
- db_name과 control_files 값을 clone db로 변경
$ vi inittestdb2.ora
db_name=testdb2
control_files='/data/temp/clone/control01.ctl','/data/temp/clone/control02.ctl','/data/temp/clone/control03.ctl'
 
 
 
2. 백업 데이터 파일 복원
 
$ cp /data/backup/open/*.dbf /data/temp/clone/
 
 
 
3. 컨트롤 파일 재생성
 
$ export ORACLE_SID=testdb
$ sqlplus / as sysdba;
 
SQL> select instance_name from v$instance;
testdb
 
SQL> alter database backup controlfile to trace as '/home/oracle/re2.sql';
 
$ vi re2.sql
SET TESTDB2 로바꾸기
경로 맞춰주기
 
$ export ORACLE_SID=testdb2
$ sqlplus / as sysdba;
 
SQL> @/home/oracle/re2.sql
 
 
 
4. 불완전 복구 시작
 
SQL> recover database until time '시간' using backup controlfile;
 
auto
 
ORA-01112: media recovery not started
 
 
 
5. Test01.dbf 파일 내용 수정하고 다시 복구 시작
 
SQL> select name from v$datafile;
 
UNNAMED00006 생성됨 : 이것 이름 복구할 테이블 스페이스로 바꿔주기
 
SQL> alter database create datafile '/home/oracle/product/10g/dbs/UNNAME00006' as '/data/temp/clone/test01.dbf';
 
SQL> recover database until time '시간' using backup controlfile;
auto
 
SQL> alter database open resetlogs;
 
SQL> select instance_name from v$instance;
testdb2
 
SQL> select count(*) from scott.gogak;
COUNT(*)
--------
100
 
 
 
6. 복구 완료되면 export 후 운영서버에 import 수행
 
$ exp scott/tiger file=gogak2.dmp tables=gogak
 
$ export ORACLE_SID=testdb
SQL> select count(*) from scott.gogak;
아직복구 안됨
 
 
$ export ORACLE_SID=testdb
$ imp scott/tiger file=gogak2.dmp ignore=y
안되면 fromuser=scott touser=scott 써주기
 
SQL> select count(*) from scott.gogak;
복구완료
 
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-실습2 끝
 
 
 
Posted by 딩구르
,