오라클/백업/복구

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 ;


복구 완료!


반응형