오라클/백업/복구

Data file Recovery (불완전 복구)

김포춘 2014. 11. 4. 11:18
반응형

불완전 복구 = 특정 시점으로 복구하는 방법


상황 1. 1시에 전체파일 백업, 그후 3시에 tt820 테이블에 1 , AAA   / 2, BBB  / 3, CCC 라는 데이터 삽입, 

5시에 잘못된 update 를 수행해 모든 데이터가 DDD로 변경 , commit 까지 한 상태라 rollback 불가

다시 원래 3시의 데이터로 백업


복구 순서 : 1. DB종료후 백업 실행 -> 2. OPEN 후 테스트용 테이블 tt820, 데이터 생성 -> 3. 잘못된 업데이트 수행후 comit 하여 장애상황 만듬 -> 4. DB종료 -> 5. 임시 디렉토리 생성해서 백업한 datafile , 운영중이던 redo log file, control file 을 복사 -> 6. control file 경로 변경후 startup mount -> 7. rename 으로 data file 과 redo log file 경로 변경 -> 8.update가 일어나기 전 시간으로 복구 -> 9. DB OPEN


1. SYS> shutdown immediate ;

    SYS> !cp /app/oracle/oradata/testdb/* /data/backup/close/


2. SYS> startup

    

    SYS> create table scott.tt820 ( no number, name varchar2(10) ) tablespace users ;

    SYS> insert into values (1, 'aaa') 

    SYS> insert into values (2, 'bbb')

    SYS> insert into values (3, 'ccc')

    SYS> commit ;

    SYS> select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual ;


TO_CHAR(SYSDATE,'

------------------

2014-11-04:03:00:00                           < -- 테이블 생성했을때 시간이 3시임을 확인 이시간까지 데이터 존재



    SYS> select * from scott.tt820


NUMBER      NAME

---------------- 

1            AAA

2            BBB

3            CCC


3. SYS> update scott.tt820 set name = 'DDD' ;            <-- where 절 하지않아 전체 데이터가 DDD로 업데이트


    SYS> select * from scott.tt820

NUMBER      NAME

---------------- 

1            DDD

2            DDD

3            DDD


    SYS> commit ;                    <-- commit 을 해서 이제 rollback 안됨


4. SYS> shutdown immediate         <-- 복구를 위해 DB 종료


5. SYS> !mkdir /data/tmp              <-- 복구 경로로 /data/temp 사용하기위해 디렉토리 미리 생성

    

    SYS> cp /data/backup/close/*.dbf /data/temp                          <-- 백업파일 복사

    SYS> cp /app/oracle/oradata/testdb/*.ctl /data/temp                 <-- 운영중이던 파일 복사

    SYS> cp /app/oracle/oradata/testdb/*.log /data/temp                <-- 운영중이던 파일 복사


6. SYS>! vi $ORACLE_HOME/dbs/inittestdb.ora

          ...

        control_files = '/data/temp/control01.ctl'                    <-- 컨트롤 파일 경로 변경

          ...


    SYS> startup mount 


7. SYS> alter database rename file '/app/oracle/oradata/testdb/system01.dbf' 

2    to '/data/temp/system01.dbf' ;                    <-- 이런식으로 data file 의 경로 변경


    SYS> alter database rename file '/app/oracle/oradata/testdb/redo01.log'

2    to '/data/temp/redo01.log' ;                        <-- 이런식으로 redo log file 의 경로 변경


8. SYS> recover database until time '2014-11-04:03:00:00' ;     <-- until time 옵션을 줘서 해당 시간으로 복구


9. SYS> alter database open resetlogs      <-- 파일들의 scn이 맞지않아 정상적으로는 open 되지 않아 resetlogs 옵션사용


    SYS> select * from scott.tt820 ;


SYS> select * from scott.tt820


NUMBER      NAME

---------------- 

1            AAA

2            BBB

3            CCC                     <-- 3시에 수행됬던 데이터로 복구 됨


상황 2. 잘못된 drop tablespace 복구하기 -backup 파일 있을 경우


순서 : 1. 새로운 tablespace 생성 -> 2. DB 종료후 백업실행 -> 3. DB 오픈후 Test용 tablespace 삭제 -> 4. DB 종료후 임시 복구 경로로 필요 파일 복사 -> 5. 파일들의 경로 변경 -> 6. 복구 


1. SYS> create tablespace test

2    datafile '/app/oracle/oradata/testdb/test01.dbf' size 10M ;


2. SYS> shut immediate;

    SYS>! cp /app/oracle/oradata/testdb/* /data/backup/close/

    

3. SYS> startup

    SYS> create table scott.tt850 (no number) tablespace test;

    SYS> insert into scott.tt850 values (1) ;

    SYS> commit;


    SYS> drop tablespace test including contents and datafiles;              <--drop 해서 장애 발생


4. SYS> shut immediate ;

    SYS>! mkdir /data/temp2                <-- 복구 하기 위한 임시경로

    SYS>! cp /data/backup/close/*.ctl /data/temp2/                            <-- 백업 파일 사용

    SYS>! cp /data/backup/close/*.dbf /data/temp2/                           <-- 백업 파일 사용 

    SYS>! cp /app/oracle/oradata/testdb/*.log /data/temp2/                 <-- 운영중이던 파일 사용


5. SYS>! vi $ORACLE_HOME/dbs/inittestdb.ora                 <-- 컨트롤 파일 경로 변경

    SYS> startup mount


    SYS> alter database rename file '/app/oracle/oradata/testdb/system01.dbf'

2    to '/data/temp2/system01.dbf' ;                     <-- 데이터 파일 경로 변경


    SYS> alter database rename file '/app/oracle/oradata/testdb/redo01.log'

2    to '/data/temp2/redo01.log' ;                      <-- 리두 로그 파일 경로 변경


6. drop tablespace 된 시점을 확인하기위해 alert log file 에서 찾기  (drop 된 시간을 2014-11-04:06:00:00 라고 가정)


    SYS> recover database until time '2014-11-04:06:00:00' using backup controlfile ;


ORA-00279: change 1373367 generated at 11/04/2014 05:53:12 needed for thread 1

ORA-00289: suggestion : /data/arc2/1_1_861154526.arc

ORA-00280: change 1373367 for thread 1 is in sequence #1

         
※ 복구를 위해 백업된 controlfile 을 가져왔기 때문에 using backup controlfile 옵션을 사용

그 후 sequence #1 번인 archive log file 을 찾는데 파일이 없어서 위와 같은 에러가 나옴

redo log 상태 조회해서 seq #1 번인 리두로그 파일을 지정 해주면 됨


    SYS> recover database until time '2014-11-04:06:00:00' using backup controlfile ;


ORA-00279: change 1373367 generated at 10/17/2014 02:43:12 needed for thread 1

ORA-00289: suggestion : /data/arc2/1_1_861154526.arc

ORA-00280: change 1373367 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

/data/temp6/redo01.log


    SYS> alter database open resetlogs ;

복구 끝!                


상황 3. 상황 2. 잘못된 drop tablespace 복구하기 -backup 파일 없을 경우


순서 : 1. DB 종료후 백업실행 -> 2. DB 오픈 후 새로운 tablespace 생성 3. Test용 tablespace 삭제 -> 4. DB 종료후 임시 복구 경로로 필요 파일 복사 -> 5. 파일들의 경로 변경 -> 6. 복구


1. SYS> shut immediate;

    SYS>! cp /app/oracle/oradata/testdb/* /data/backup/close/


2. SYS> startup


    SYS> create tablespace test2

2    datafile '/app/oracle/oradata/testdb/test02.dbf' size 10M ;


    SYS> create table scott.tt860 (no number) tablespace test2;

    SYS> insert into scott.tt860 values (1) ;

    SYS> commit;


3. SYS> drop tablespace test including contents and datafiles;              <--drop 해서 장애 발생


4. SYS> shut immediate ;

    SYS>! mkdir /data/temp3                <-- 복구 하기 위한 임시경로

    SYS>! cp /data/backup/close/*.ctl /data/temp3/                            <-- 백업 파일 사용

    SYS>! cp /data/backup/close/*.dbf /data/temp3/                           <-- 백업 파일 사용 

    SYS>! cp /app/oracle/oradata/testdb/*.log /data/temp3/                 <-- 운영중이던 파일 사용


5. SYS>! vi $ORACLE_HOME/dbs/inittestdb.ora                 <-- 컨트롤 파일 경로 변경

    SYS> startup mount


    SYS> alter database rename file '/app/oracle/oradata/testdb/system01.dbf'

2    to '/data/temp3/system01.dbf' ;                     <-- 데이터 파일 경로 변경

- 경로를 변경하는데 복구 필요한 test2 tablespace는 없음


    SYS> alter database rename file '/app/oracle/oradata/testdb/redo01.log'

2    to '/data/temp3/redo01.log' ;                      <-- 리두 로그 파일 경로 변경


6. drop tablespace 된 시점을 확인하기위해 alert log file 에서 찾기  (drop 된 시간을 2014-11-04:08:00:00 라고 가정)


    SYS> recover database until time '2014-11-04:08:00:00' using backup controlfile ;


ORA-00279: change 1373367 generated at 11/04/2014 05:53:12 needed for thread 1

ORA-00289: suggestion : /data/arc2/1_1_861154526.arc

ORA-00280: change 1373367 for thread 1 is in sequence #1

         

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

/data/temp6/redo01.log

ORA-00283: recovery session canceled due to errors
ORA-01244: unnamed datafile(s) added to control file by media recovery
ORA-01110: data file 8: '/data/temp/test03.dbf'

위 에러메시지를 확인하면 unnamed datafile 이 control file 에 추가되었다고 알려줌

    SYS> select name from v$datafile ;         <-- 데이터파일을 확인하면 추가된것을 확인할 수 있다.

NAME 
-----------------------------------
/data/temp3/system01.dbf
/data/temp3/sysaux01.dbf
/data/temp3/undotbs01.dbf
/data/temp3/users01.dbf
/data/temp3/example01.dbf
/data/temp3/test.dbf
/app/oracle/product/11g/dbs/UNNAMED00006            <-- 생김

UNNAMED0006 파일을 새로운 경로에 생성 한 후 다시 복구 시도

    SYS> alter database create datafile '/app/oracle/product/11g/dbs/UNNAMED00006'
2    as '/data/temp2/test02.dbf' ;

    SYS> recover database un until time '2014-11-04:08:00:00' using backup controlfile ;


ORA-00279: change 1373367 generated at 11/04/2014 05:53:12 needed for thread 1

ORA-00289: suggestion : /data/arc2/1_1_861154526.arc

ORA-00280: change 1373367 for thread 1 is in sequence #1

         

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

/data/temp6/redo01.log


    SYS> alter database open resetlogs ;


복구 완료!


반응형

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

Redo log flle 장애 처리방법  (0) 2014.11.05
Log Miner 활용하기  (0) 2014.11.05
control file, data file 연습문제  (0) 2014.11.04
Control file 복구  (0) 2014.11.04
Data File Recovery  (0) 2014.10.30
Backup (cold, hot)  (0) 2014.10.30
사용자 암호설정/ Archive log mode, No Archive log mode  (0) 2014.10.29