IT기술/Oracle

06 Data File 장애 및 사용자 장애 복구하기

dobbby 2013. 12. 18. 14:05
반응형

Oracle 은 사용자가 데이터를 수정하거나 입력하면 메모리 부분인 Tablespace 에서 작업되고

특정 규칙에 의해 안전하게 하드 디스크에 있는 Data file 에 저장됩니다.

그리고 Datafile 에 저장되어 있던 데이터는 사용자의 요청 (SELECT DDL, DML 등) 에 의해 다시 Tablespace 로 호출되어 작업이 진행된다.



6.1 Tablespace 와 Data File 개념 살펴보기

1. Tablespace Data file 개념

Tablespace 매장

Data file 창고

Server Process 직원

일반적으로 Tablespace 가 클수록 속도가 빨라진다.

shutdown 하면

Database Bffer Cache 에 있는 데이터를 파일로 저장하고 닫는다.



2. Tablespace 의 종류 및 특징

(1) SYSTEM tablespace - 데이터 딕셔너리 저장, 손상되면 서버가 시작안됨

(2) SYSAUX tablespace - 10g 부터 등장, 서버 성능 튜닝을 위한 데이터 저장, 10g 에 새로 등장한 자동 튜닝 기능 (AWR, ADDM, ASH 등) 이 이 곳 정보 사용

(3) Undo tablespace - 사용자가 DML 을 수행할 경우 원본 데이터 (undo data) 들을 저장해두는 특별한 tablespace


1) Undo tablespace 특징

- oracle server process 는 tablespace 에 undo segment 를 생성하고 

기본적으로 각 사용자별로 undo tablespace 를 할당해서 undo data 를 관리하며 사용자는 관여할 수 없다.

- Instance 당 여러 개가 동시에 존재할 수 있지만 사용되는 것은 한번에 1개다.

- 관리방법은 자동, 수동 모드가 있는데 9i 부터는 AUM (Automatic Undo Management) 을 권장한다.


2) Undo tablespace 사용 목적

- Transaction Rollback : 사용자가 rollback 명령을 수행할 경우 이 곳에 저장된 undo data 를 사용해 rollback 한다.

- Read Consistency (읽기 일관성) : CR 작업을 통해 트랜잭션이 끝나지 않은 데이터는 변경 전 데이터를 보여준다.

- Transaction Recovery (Intance Recovery) : 운영 중이던 DB 서버가 비정상적으로 종료되었을 때 Roll Forward 와 Roll Backwared 작업을 수행해서

Dirty Database 를 Clean Database 로 만들어 주는 과정에서 undo data 가 사용된다.


3) undo tablespace 관리방법

현재 상태 파악

SQL> show parameter undo ;


신규 생성

SQL> create undo tablespace undo01

  2     datafile '/home/oracle/oradata/testdb/undo01.dbf' size 10m

  3     autoextend on ;


변경

SQL> alter system set undo_tablespace=undo01 ;

이 작업 후 반드시 파라미터 파일의 내용도 변경해야 재부팅 시 장애가 없다.


세션별 사용중인 undo segment 확인하기

SQL> select s.sid, s.serial#, s.usernmae, r.name "ROLLBACK SEG"

  2      from v$session s, v$transaction t, v$rollname r

  3      where s.taddr = t.addr

  4      and t.xidusn = r.usn ;


undo segment 가 할당되는 원리


undo 관련 주요 parameter





심화학습 Data file 내용 dump 로 직접 확인하기



6.2 Data 장애 복구하기

1. No archive log mode 에서 복구하기

no archive log mode 라 할지라도 복구해야 할 내용이 redo log 에 남아 있다면 복구가 된다.


scn

100            102             103             106

1일    101    2일    103    3일    105    4일


scn 100 번일때 전체 파일을 Full backup 받아놓았다.

운영 중 4일차에 ts_a01.dbf 파일이 os 명령어에 의해 삭제되는 사고 발생



복구 원리

1. Restore (복원)

1일에 백업받아둔 SCN 100 번 파일을 4일 시점으로 복사해온다.


2. 복구를 시작하라는 명령 수행

recover datafile '/home/oracle/oradata/testdb/ts_a01.dbf' ;

server process 는 control file 을 찾아서 

해당 data file 의 checkpoint cnt 번호를 확인한 후

control file 에 적혀 있는 경로로 recover data file 에 있는 파일을 찾아간다.

data file 헤더에서 checkpoint cnt 에 대응되는 번호를 확인하고

data file 의 stop scn 번호와 control file 의 checkpoint scn 번호를 비교해 본다.

control file 을 확인한 결과 scn 은 106번이 될 것이다.

data file 을 확인하면 stop scn 이 100번이 될 것이다.

101번부터 106번까지가 data file 이 없다는 것을 확인하고

redo log file 과 archive log file 에서 부족한 101번부터 106번 scn 까지의 작업을 찾아서

ts_a.dbf 에 적용하고 적용이 마무리 된면 복구가 끝난다.



실무실습7 no archive log mode 에서 장애 해결

우선 현재 DB 를 no archive log mode 로 변경

SYS>startup mount ;

SYS>archive log list ;

SYS>alter database noarchivelog ;

SYS>alter database open ;

SYS>archive log list ;

SYS>archive log list ;

SYS>set line 200

SYS>col tablespace_name for a10

SYS>col file_name for a50

SYS>select tablespace_name, bytes/1024/1024 MB, file_name

  2  from dba_data_files ;




# 신규 Tablespace test 를 생성하고 백업 후 장애 발생


SYS>create tablespace test2

  2  datafile '/app/oracle/oradata/testdb/test02.dbf' size 5m;


SYS>shutdown immediate ;


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

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

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




SYS>startup

SYS>!rm -fr /app/oracle/oradata/testdb/test02.dbf

SYS>shutdown abort ;

SYS>startup




# restore 후 recover 시도합니다.


SYS>!cp /data/backup/close/test02.dbf /app/oracle/oradata/testdb


SYS>recover database ;




위 결과를 보면 no archive log mode 에서 장애가 발생했지만 복구가 됩니다.

그 이유는 복구하려는 데이터가 온라인 redo log 에 있기 때문입니다.


이번에는 log switch 를 수동으로 발생시켜 복구하려는 데이터를 archive log 에 있게 만들고 다시 시도해보겠습니다.


SYS>alter database open ;

SYS>!rm -fr /app/oracle/oradata/testdb/test02.dbf

SYS>!ls /app/oracle/oradata/testdb/test02.dbf


SYS>alter system switch logfile ;

SYS>/

SYS>/


SYS>select status from v$instance ;

SYS>exit




log switch 가 발생하는 동안에 db 가 강제로 shutdown abort 되었습니다.

다시 startup 시켜보겠습니다.


$ sqlplus / as sysdba


SYS>startup


# 백업파일 복원

SYS>!cp /data/backup/close/test02.dbf /app/oracle/oradata/testdb/


SYS>recover database ;

ORA-00279: change 3595626 generated at 12/18/2013 11:45:59 needed for thread 1

ORA-00289: suggestion : /data/arc2/582_1_830614214.arc

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


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


ORA-00308: cannot open archived log '/data/arc2/582_1_830614214.arc'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3



SYS>select status from v$instance ;


SYS>alter database open ;



no archive mode 이므로 archive log 파일이 없어서 복구에 실패한다.

DB 가 open 되기 위해서는 모든 data file, control file, redo log file 의 checkpoint scn 의 정보가 같아야 하는데

data file 중에서 test02.dbf 파일 하나의 scn 정보가 다르기 때문이다.



# 장애 해결하기

test02.dbf 파일을 복구하기 위해서는 archive log 파일이 있어야 하지만 그 파일이 없기 때문에 복구가 안된다.

나머지 파일만이라도 복구해야 하는데 그 방법은 모든 파일의 scn 을 같게 만드는 것이다.

즉 이렇게 scn 번호가 달라서 db가 시작이 안되는 것이므로 scn 번호를 같게 만들어 주면 된다.


먼저 백업 파일의 내용을 현재와 같은 내용으로 하려 했으나 중간의 archive 파일이 없어서 실해했다.

현재의 파일 내용을 백업 파일의 내용과 같도록 해야할텐데 이 방법은 1일에 받았던 모든 파일을 4일로 복원해야 한다.

그렇게 되면 DB 는 시작되겠지만 문제는 1일부터 4일까지 변경된 모든 데이터는 다 손실된다는 것이다.

결국 데이터가 복구되는 것은 아니다.


두 번째 방법은 문제가 되는 test02.dbf 만 포기하는 것이다.

test02.dbf 에 있던 데이터는 모두 손실되겠지만 나머지 데이터들은 다 복구할 수 있다.


$ startup

SYS>alter database datafile '/app/oracle/oradata/testdb/test02.dbf' offline drop ;

SYS>alter database open ;

SYS>select status from v$instance ;



이렇게 두가지 방법으로 no archive mode 에서 db 가 시작되지 않는 장애가 발생하면 조치할 수 있다.



2. archive log mode 일 경우 장애 복구하기

archive log mode 일 경우 복구하는 방법은 크게

완전 복구 (complete recovery)

불완전 복구 (inconplete recovery) 로 나눌 수 있다.


완전 복구 - 물리적 장애 발생시 사용

Oracle 에서 절대적으로 지켜야 하는 원칙 중 아주 중요한 것은 파일에 I/O 가 발생하고 있을 경우에는 절대로 이동하거나 복사 또는

복구 작업을 해서는 안된다는 것이다.


4가지를 자유자재로 할 수 있어야 한다.

offline 가능할 때

offline 불가능할 때

백업파일 없는 경우

임시경로 복구



실무실습 8 Offline 되는 일반 tablespace 장애 복구하기


STEP1 db를 archive log mode 로 시작


SYS>startup mount ;

SYS>alter database archivelog ;

SYS>alter database open ;




STEP2 백업 수행


SYS>set line 200

SYS>col tablespace_name for a10

SYS>col file_name for a50

SYS>select tablespace_name, bytes/1024/1024 MB, file_name

  2  from dba_data_files ;


SYS>alter tablespace test begin backup ;

SYS>!cp /app/oracle/oradata/testdb/test01.dbf /data/backup/open/

SYS>alter tablespace test end backup ;




STEP3 장애 발생시키고 작업 진행


SYS>!rm -fr /app/oracle/oradata/testdb/test01.dbf

SYS>!ls /app/oracle/oradata/testdb/test01.dbf


SYS>create table abc (no number) tablespace test ;

SYS>insert into abc values (1) ;

SYS>insert into abc values (2) ;


SYS>commit ;


SYS>select * from abc ;




STEP4 장애 발생 확인

SYS>alter tablespace test offline ;


SYS>alter tablespace test online ;




STEP5 백업으로부터 복원 후 복구하기


SYS>!cp /data/backup/open/test01.dbf /app/oracle/oradata/testdb/

SYS>recover tablespace test ;

SYS>alter tablespace test online ;

SYS>select * from abc ;




이 실습에서 가장 핵심사항은 백업 data file 에는 abc 라는 table 이 없었다.

abc 라는 table 을 만들고 redo log 에 남아있었기에 백업 data file 에 그 내용이 복구될 수 있는 것입니다.

그리고 offline 되는 tablespace  라서 db 종료 없이 해당 tablespace 만 offline 시키고 복구한 후

online 시켜서 다운타임을 최소화할 수 있습니다.



실무실습9 Offline 안되는 tablespace 장애 복구하기


SYS>select status from v$instance ;

SYS>create table test1 (no number) tablespace system ;

SYS>insert into test1 values (1) ;


SYS>commit ;


SYS>set line 200

SYS>col tablespace_name for a10

SYS>col file_name for a50

SYS>select tablespace_name, bytes/1024/1024 MB, file_name

  2  from dba_data_files ;





잘 안되네요




실무실습10 백업파일이 없는 경우 복구하기

step1 장애상황 발생


SYS>create tablespace haksa

  2  datafile '/data/temp/haksa01.dbf' size 5m;


SYS>select tablespace_name, bytes/1024/1024 MB, file_name

  2  from dba_data_files ;


SYS>!rm -f /data/temp/haksa01.dbf


SYS>!ls /data/temp/haksa01.dbf


파일이 없습니다.




★ 임시 경로를 이용한 긴급복구 (일부 Data file 의 백업 파일이 없는 경우)

디스크 불량으로 data file 삭제됨

redo log file, archive log file, 백업된 data file 은 다른 경로에 있고

하드디스크가 오는 동안 db를 중단시킬 수 없어서 /data/temp 에 복원하고 복구하여 운영하고

하드디스크가 도착하면 원래경로로 이동시킨다

SQL> !mkdir /data/temp

SQL> !cp /data/backup/close/*.dbf /data/temp/

SQL> select name from v$datafile ;

SQL> alter database rename file '/home/oracle/oradata/testdb/system01.dbf'

  2      to '/data/temp/system01.dbf' ;

...       

SQL> alter database create datafile '/home/oracle/oradata/testdb/test01.dbf'

  2      as '/data/temp/test01.dbf' ;                ← 백업 없던 파일을 신규로 생성함

SQL> recover database ;

SQL> alter database open ;

모든 data file 을 과거에 백업 받았던 것으로 전부 복원한 후, archive log 파일을 적용시켜 장애 직전 시점까지 복구하는 것

모든 data file 은 사고 시점 이전의 백업파일로부터 복원하고, redo log file 과 control file 은 현재 시점의 것을 사용해야 합니다.



Drop table 명령으로 삭제된 table 복구하기 (모든 데이터 파일 복원)

SYS> shutdown immediate ;

SYS> !

$ mkdir /home/oracle/temp


백업된 data file 복사해오기

cp /data/backup/close/*.dbf /home/oracle/temp/

현재 쓰고 있던 control file 복사해오기

cp /home/oracle/oradata/testdb/*.ctl /home/oracle/temp/

현재 쓰고 있던 redo log file 복사해오기

cp /home/oracle/oradata/testdb/*.log /home/oracle/temp/


$ vi /home/oracle/product/10g/dbs/inittestdb.ora

control_files=("/home/oracle/temp/control01.ctl",

"/home/oracle/temp/control02.ctl",

"/home/oracle/temp/control03.ctl")

:wq!

exit

SYS> startup mount ;

SYS> select name from v$controlfile ;

SYS> select name from v$datafile ;

redo log file 위치 변경하기

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

  2     to '/home/oracle/temp/system01.dbf' ;

...

복구하기
SYS> recover database until time '2013-01-21:04:53:05' ;    ← 지워진 시간보다 조금 빠르게 줌
auto
SYS> alter database open resetlogs ;

복구가 완료되었다 하더라도 data file 과 control file, redo log file 의 checkpoint SCN 정보가 동일하지 않습니다.
oracle 은 DB 를 open 시키지 않습니다. 이 때 사용하는 옵션이 resetlogs 입니다.
※ Resetlogs 옵션으로 open 하면
1. 모든 log의 sequence 정보가 0으로 초기화됩니다. 즉 이렇게 되면 이전에 생성되었던 archive log 파일은 더이상 복구에 사용될 수 없습니다.
2. data file 의 checkpoint scn 정보는 open 시점의 scn 으로 업데이트 됩니다.
3. 딕셔너리의 data file 정보와 control file 의 data file 의 정보를 비교해서 딕셔너리에 있지만 control file 에 없는 파일은 MISSINGXXXXXX 으로
가짜 엔트리를 생성합니다.
※ Resetlogs 옵션으로 DB 가 open 된 경우 이전에 받아두었던 백업 파일은 사용할 수 없는 경우가 대부분이므로 반드시 다시 백업 받아야합니다.



★ Drop table 복구하기 - 일부 파일만 복원 (실무에서 아주 요긴하게 사용되는 방법이니 꼭 숙지할 것)

임시 경로에 필요한 파일 복원

mkdir /data/imsy

cp /data/backup/close/system01.dbf /data/imsy/

cp /data/backup/close/sysaux01.dbf /data/imsy/

$ cp /data/backup/close/undotbs01.dbf /data/imsy/

cp /data/backup/close/example01.dbf /data/imsy/

cp /home/oracle/oradata/testdb/*.log /data/imsy/

cp /home/oracle/oradata/tetsdb/*.ctl /data/imsy/


parameter file 에서 control file 의 경로 변경 후 mount

vi /home/oracle/product/10g/dbs/inittestdb.ora

*.control_files='/data/imsy/control01.ctl'

:wq!

exit

SQL> startup mount ;


필요한 파일의 경로 변경

SQL> select name form v$datafile ;

SQL> alter database rename file '/home/oracle/oradata/testdb/system01.dbf'

  2     to '/data/imsy/system01.dbf' ;

... 

복구에 필요없는 파일은 offline drop 

SQL> alter database datafile '/home/oracle/oradata/testdb/users01.dbf' offline drop ;

SQL> alter database rename file '/home/oracle/oradata/testdb/redo01.log'

  2     '/data/imsy/redo01.log' ;

...

복구 후 데이터 확인

SQL> recover database until time '2013-01-17:06:52:15' ;

SQL> alter database open resetlogs ;

※ 복구에 반드시 필요한 파일만 복사해오고, 나머지 파일들은 mount 상태에서 offline drop 으로 복구에 사용 안하게 만들어야 함



Drop table 복구하기 (백업 없는 경우)

백업파일이 없는 데이터파일이 OS 명령어로 강제 삭제되었을 때

그 후 해당 tablespace 에 들어있던 table 이 drop 되었다.

SQL> !

vi /home/oracle/product/10g/dbs/inittestdb.ora

*.control_files='/data/imsy2/control01.ctl'

:wq!

$ exit

SQL> startup mount ;

SQL> select name from v$controlfile ;

SQL> select name from v$datafile ;

SQL> alter database rename file '/home/oracle/oradata/testdb/system01.dbf'

  2     to '/data/imsy2/system01.dbf' ;

...

SQL> alter database datafile '/home/oracle/oradata/testdb/users01.dbf' offline drop ;

SQL> alter database datafile '/home/oracle/oradata/testdb/example01.dbf' offline drop ;


offline  후 삭제된 data file 생성 후 online

SQL> alter database datafile '/home/oracle/oradata/testdb/ts_b01.dbf' offline ;

SQL> alter database create datafile '/home/oracle/oradata/testdb/ts_b01.dbf'

  2     as '/data/imsy2/ts_b01.dbf' ;

SQL> alter database datafile '/data/imsy2/ts_b01.dbf' online ;


SQL> select name, status from v$datafile ;

SQL> select member from v$logfile ;


SQL> alter database rename file '/home/oracle/oradata/testdb/redo01.log'

  2     to '/data/imsy2/redo01.log' ;

...

SQL> select member from v$logfile ;

SQL> recover database until time '2013-01-15:13:16:31' ;

SQL> alter database open resetlogs ;



잘못된 Update 장애 복구하기

복구에 필요한 파일복원 (/home/oracle/temp/ 에서 복구)


백업된 data file 복사해오기

cp /data/backup/close/*.dbf /home/oracle/temp/

현재 쓰고 있던 control file 복사해오기

cp /home/oracle/oradata/testdb/*.ctl /home/oracle/temp/

현재 쓰고 있던 redo log file 복사해오기

cp /home/oracle/oradata/testdb/*.log /home/oracle/temp/


파일 경로 수정

$ vi /home/oracle/product/10g/dbs/inittestdb.ora

control_files=("/home/oracle/temp/control01.ctl",

"/home/oracle/temp/control02.ctl",

"/home/oracle/temp/control03.ctl")

:wq!

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

  2     to '/home/oracle/temp/system01.dbf' ;

...

SYS> alter database rename file '/home/oracle/oradata/testdb/redo01_a.dbf'

  2     to '/home/oracle/temp/redo01_a.dbf' ;

...


복구

SYS> recover database until time '2014-01-15:08:11:00' ;

auto

SYS> alter database open resetlogs ;



잘못된 Delete 장애 복구하기

db 종료 후 필요한 파일 복원

SYS> shutdown immediate ;

SYS> !

cp /data/backup/close/system01.dbf /home/oracle/temp/

$ cp /data/backup/close/sysaux01.dbf /home/oracle/temp/

$ cp /data/backup/close/undotbs01.dbf /home/oracle/temp/

$ cp /data/backup/close/test01.dbf /home/oracle/temp/

cp /home/oracle/oradata/testdb/*.log /home/oracle/temp/

cp /home/oracle/oradata/testdb/*.ctl /home/oracle/temp/


control file 경로 수정 후 mount

vi /home/oracle/product/10g/dbs/inittestdb.ora

SYS> startup mount ;

SYS> select name from v$controlfile ;


data file 경로 수정

SYS> select name from v$datafile ;

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

  2      to '/home/oracle/temp/system01.dbf' ;

...

필요없는 파일 offline으로

SYS> alter database datafile '/home/oracle/oradata/testdb/users01.dbf' offline drop ;

SYS> alter database datafile '/home/oracle/oradata/testdb/example01.dbf' offline drop ;

SYS> @df


redo log file 경로 수정

SYS> select member from v$logfile ;

SYS> alter database rename file '/home/oracle/oradata/testdb/redo03_a.log'

  2     to '/home/oracle/temp/redo03_a.log' ;

...


복구

SYS> recover database until time '2013-01-14:12:12:12' ;

SYS> alter database open resetlogs ;



잘못된 Drop User 장애 복구하기

임시 경로로 파일 복원 후 복구하기

SYS> shutdown immediate ;

SYS> !

cp /data/backup/close/system01.dbf /home/oracle/temp/

$ cp /data/backup/close/sysaux01.dbf /home/oracle/temp/

$ cp /data/backup/close/undotbs01.dbf /home/oracle/temp/

$ cp /data/backup/close/test01.dbf /home/oracle/temp/

cp /home/oracle/oradata/testdb/*.log /home/oracle/temp/

cp /home/oracle/oradata/testdb/*.ctl /home/oracle/temp/


control file 경로 수정 후 mount

vi /home/oracle/product/10g/dbs/inittestdb.ora

SYS> startup mount ;

SYS> select name from v$controlfile ;


data file 경로 수정

SYS> select name from v$datafile ;

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

  2      to '/home/oracle/temp/system01.dbf' ;

...

필요없는 파일 offline으로

SYS> alter database datafile '/home/oracle/oradata/testdb/users01.dbf' offline drop ;

SYS> alter database datafile '/home/oracle/oradata/testdb/example01.dbf' offline drop ;

SYS> @df


복구

SYS> recover database until time '2013-01-14:12:12:12' ;

SYS> alter database open resetlogs ;



Drop tablespace 로 잘못 삭제된 Tablespace 복구하기 - 백업 Control File 이 있을 경우

복구 원리

recover → control file → data file → redo/archive log file 

순서로 읽어 들여 복구


recover 가 시작되면 control file 에서 checkpoint 정보를 확인한 후 data file 을 찾아서 그 정보가 동일한지 확인하는데

data file 위치를 control file 에서 읽고 간다

drop tablespace 는 drop table 과는 다르게 control file 안에 있는 해당 tablespace 의 정보를 삭제해버린다.

drop tablespace 로 삭제된 tablespace 를 복구하려면 control file 에 해당 tablespace 의 정보가 있어야 한다.

복구 방법

1. 백업된 control file 이용

2. tablespace 정보를 redo/archive log 파일을 이용하여 강제로 control file 에 등록


※ drop tablespace 는 alert_SID.log 파일에 tablespace 가 삭제된 시간을 정확하게 기록해준다.


복구하기

$ vi /home/oracle/admin/testdb/bdump/alert_testdb.log

...

drop tablespace test including contents and datafiles

drop 위의 시간 확인


data file 만 백업 파일에서 복원

cp /data/backup/close/*.dbf /home/oracle/temp/

cp /home/oracle/oradata/testdb/*.log /home/oracle/temp/

cp /home/oracle/oradata/testdb/*ctl /home/oracle/temp/


control file 경로 수정 후 mount

vi /home/oracle/product/10g/dbs/inittestdb.ora

SYS> startup mount ;

SYS> select name from v$controlfile ;


data file 경로 수정

SYS> select name from v$datafile ;

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

  2      to '/home/oracle/temp/system01.dbf' ;

...

필요없는 파일 offline으로

SYS> alter database datafile '/home/oracle/oradata/testdb/users01.dbf' offline drop ;

SYS> alter database datafile '/home/oracle/oradata/testdb/example01.dbf' offline drop ;

SYS> @df


redo log file 경로 수정

SYS> select member from v$logfile ;

SYS> alter database rename file '/home/oracle/oradata/testdb/redo03_a.log'

  2     to '/home/oracle/temp/redo03_a.log' ;


복구

SYS> recover database until time '2013-01-14:12:12:12' ;

SYS> alter database open resetlogs ;

SYS> @df


복구가 안된 파일이 있다.

redo log file 에 해당 tablespace 를 만들었다는 기록이 있고 dictionary 에도 있는데

control file 에 정보가 없어서 RECOVER 라고 나오는 것이다.


tablespace 가 삭제되었는데 data file 만 백업을 가져오고  control file 과 redo log file 은 현재 시점의 것을 사용해서 문제가 되는 것이다.

data file 과 control file 모두 백업에서 가져와서 복구하겠다.

control file 을 백업에서 가져와야 하는 이유는

drop tablespace test including contents and datafiles; 로 삭제된 test tablespace 정보가 없기 때문에 복구에 사용할 수 없기 때문


복구 다시

SYS> shutdown immediate ;

SYS> !

cp /data/backup/close/system01.dbf /home/oracle/temp/

$ cp /data/backup/close/sysaux01.dbf /home/oracle/temp/

$ cp /data/backup/close/undotbs01.dbf /home/oracle/temp/

$ cp /data/backup/close/test01.dbf /home/oracle/temp/


control file 도 백업본 사용

cp /data/backup/close/*.ctl /home/oracle/temp/


redo log file은 최근 사용 파일 복사

cp /home/oracle/oradata/testdb/*.log /home/oracle/temp/

$ exit


control file 경로 수정 후 mount

vi /home/oracle/product/10g/dbs/inittestdb.ora

SYS> startup mount ;

SYS> select name from v$controlfile ;


data file 경로 수정

SYS> select name from v$datafile ;

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

  2      to '/home/oracle/temp/system01.dbf' ;

...

필요없는 파일 offline으로

SYS> alter database datafile '/home/oracle/oradata/testdb/users01.dbf' offline drop ;

SYS> alter database datafile '/home/oracle/oradata/testdb/example01.dbf' offline drop ;

SYS> @df


redo log file 경로 수정

SYS> select member from v$logfile ;

SYS> alter database rename file '/home/oracle/oradata/testdb/redo03_a.log'

  2     to '/home/oracle/temp/redo03_a.log' ;

...

SYS> select member from v$logfile ;


복구

control file 과 data file 은 예전 백업 파일이고 redo log file 은 현재 파일입니다.

control file 이 data file 보다 더 오래전 파일이면 old control file 이라는 에러가 나오며 복구가 안될 수 있습니다.

using backup controlfile 옵션을 추가해야 합니다.

until time 시간, until cancel 으로만 복구시점을 결정합니다.

SYS> recover database until time '2013-01-15:12:12:12' using backup controlfile ;

auto

SYS> alter database open resetlogs ;



Drop tablespace 로 잘못 삭제된 Tablespace 복구하기 - 백업 Control File 이 없을 경우

altertlog 에서 삭제된 시간 확인하기

SYS> !

$ vi /home/oracle/admin/testdb/bdump/alert_testdb.log


SYS> shutdown immediate ;

SYS> !

cp /data/backup/open/system01.dbf /home/oracle/temp/

$ cp /data/backup/open/sysaux01.dbf /home/oracle/temp/

$ cp /data/backup/open/undotbs01.dbf /home/oracle/temp/


control file 도 백업본 사용

cp /data/backup/open/*.ctl /home/oracle/temp/


redo log file은 최근 사용 파일 복사

cp /home/oracle/oradata/testdb/*.log /home/oracle/temp/

$ exit


control file 경로 수정 후 mount

vi /home/oracle/product/10g/dbs/inittestdb.ora

SYS> startup mount ;

SYS> select name from v$controlfile ;


data file 경로 수정

SYS> select name from v$datafile ;

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

  2      to '/home/oracle/temp/system01.dbf' ;

...

필요없는 파일 offline으로

SYS> alter database datafile '/home/oracle/oradata/testdb/users01.dbf' offline drop ;

SYS> alter database datafile '/home/oracle/oradata/testdb/example01.dbf' offline drop ;

SYS> @df


redo log file 경로 수정

SYS> select member from v$logfile ;

SYS> alter database rename file '/home/oracle/oradata/testdb/redo03_a.log'

  2     to '/home/oracle/temp/redo03_a.log' ;

...

SYS> select member from v$logfile ;


SYS> recover database until time '2013-01-15:12:12:12' using backup controlfile ;

/home/oracle/temp/redo02_a.log        ← current log 파일 적어줌


SYS> select name from v$datafile ;

새로 생성됨


SYS> alter database create datafile '/home/oracle/product/10g/dbs/UNNAMED00006'

  2      as '/home/oracle/temp/test01.dbf' ;


SYS> recover database until time '2013-01-15:12:12:12' using backup controlfile ;

auto  ← 이렇게 치면 에러남

/home/oracle/temp/redo02_a.log        ← current 였던 redo log 파일 이름 입력 후 엔터


SYS> alter database open resetlogs ;

SYS> @df



Log Miner 를 이용하여 Redo log file 에서 특정 테이블의 삭제 시간 찾기

db 에서 일어난 모든 변경 내역을 기록한 redo log file 안에 있는 내용을 참조하여 

장애가 일어난 시간을 찾아내는 기술이 log miner 라는 기술입니다.

log miner 설정하기

1. parameter file 에 dictionary file 이 생성될 경로 설정을 추가

utl_file_dir="/data/logmnr"     ← 경로는 원하는 곳으로 설정함. 디렉토리가 존재해야 함

2. 재시작

SQL> shutdown immediate ;

SQL> startup ;

3. 딕셔너리 파일을 생성

SQL> exec dbms_logmnr_d.build ('dict', '/data/logmnr') ;

4. 분석하기 원하는 log 파일 등록

SQL> @log

SQL> exec dbms_logmnr.add_logfile ('/home/oracle/oradata/testdb/redo091.log', 1) ;

5. 등록한 log 파일을 분석합니다

SQL> exec dbms_logmnr.start_logmnr (dictfilename=>'/data/logmnr/dict') ;

6. 찾고자 하는 내용을 조회

SQL> select timestamp, seg_owner, username, sql_redo

  2     from v$logmnr_contents

  3     where sql_redo like '%drop%'

  4     and seg_owner = 'SCOTT' ;



Undo Tablespace 장애 복구하기

운영 중인 undo tablespace 장애 복구하기

현재 상황 확인

SQL> @df

SQL> show parameter undo ;


사용 중인 롤백 segment 확인

SQL> select s.sid, s.serial#, s.username, r.name "ROLLBACK SEG"

  2     from v$session s, v$transaction t, v$rollname r

  3     where s.taddr = t.addr 

  4     t.xidusn = r.usn


SQL> !rm -fr /home/oracle/oradata/testdb/undotbs01.dbf        ← 운영 중인 undo tablespace 삭제되는 장애 발생

SQL> !ls /home/oracle/oradata/testdb/undotbs01.dbf


SQL> create undo tablespace undo01

  2     datafile '/home/oracle/oradata/testdb/undo01.dbf' size 10m ;


SQL> alter system set undo_tablespace=undo01 ;


SQL> drop tablespace undotbs1 ;

사용중이어서 삭제가 안됨


SQL> show parameter undo ;

SQL> shutdown immediate ;

SQL> shutdown abort ;

SQL> !


vi product/9.2/dbs/inittestdb.ora

_offline_rollback_segments=(_SYSSM6$)        ← 사용 중이던 rollback segment 를 offline 시킨 후 삭제


SQL> startup

SQL> alter database datafile '/home/oracle/oradata/testdb/undotbs01.dbf' offline drop ;

SQL> alter dataase open ;

SQL> show parameter undo ;


SQL> drop tablespace undotbs1 including contents and datafile ;

SQL> shutdown immediate ;


SQL> !vi /home/oracle/product/9.2/dbs/inittestdb.ora

undo_management=auto    ← manual 에서 auto 로 변경

#  _offline_rollback_segments=(_SYSSM6$)    ← 주석 처리


SQL> startup 

SQL> show parameter undo ;



No archive log mode 에서 Undo tablespace 의 Data file 이 삭제된 장애 상황 복구하기

파라미터 파일 undo 관련 설정 수동 mode 로 수정

SQL> shutdown abort ;

SQL> !

vi /home/oracle/product/10g/dbs/inittestdb.ora

# undo_management=AUTO    ← 기존 내용 주석 처리

undo_management=manual     ← 추가

_offline_rollback_segments=(_SYSSMU1$, _SYSSMU2$, _SYSSMU3$, _SYSSMU4$, _SYSSMU5$, _SYSSMU6$, _SYSSMU7$, _SYSSMU8$, SYSSMU9$, _SYSSMU10$)        ← 추가


재시작 후 복구

$ exit

SQL> startup mount ;

SQL> select name, status from v$datafile ;

장애 상황 반영 안됨

SQL> alter database datafile '/home/oracle/oradata/testdb/undotbs01.dbf' offline drop ;

SQL> alter database open ;

SQL> select status from v$instance ;

SQL> @dd

offline 됨


신규 undo tablespace 생성 후 반영

SQL> create undo tablespace undo

  2      datafile '/home/oracle/oradata/testdb/undo01.dbf' size 10m ;

SQL> shutdown immediate ;

SQL> !

vi /home/oracle/product/10g/dbs/inittestdb.ora

undo_tablespace=UNDO         ← 신규 undo 로 변경

$ exit

SQL> startup

SQL> show parameter undo ;

SQL> @dd


장애난 undo tablespace 삭제

SQL> drop tablespace undotbs1 including contents add datafile ;

drop 안됨

SQL> select segment_name, owner, tablespace_name, status

  2      from dba_rollback_segs ;

SQL> shutdown immediate ;

SQL> !

$ vi /home/oracle/product/10g/dbs/inittestdb.ora

_offline_rollback_segments=(_SYSSMU11$)    ← 강제로 offline 시킴

$ exit

SQL> startp

SQL> @dd

SQL>drop tablespace undotbs1 including contents and datafiles ;



반응형