기본적인 대처 순서

1. Current 파일 / Current 아닌 파일 지웠는지 확인

2. 아카이브 파일 / 노 아카이브 파일을 지웠는지 확인





case1. Current 가 아닌 1개의 member 가 삭제되는 장애

얼럿로그 확인

-> 지워진 목록 drop

SYS> alter database drop logfile member '/data/backup/close/redo01_a.log';

-> 지워진 멤버 생성

SYS> alter database add logfile member '/data/backup/close/redo01_a.log' to group 1;

끝.


case2. Current 가 아닌 1개의 group 이 삭제되는 장애

얼럿로그 확인

-> 지워진 그룹 drop

SYS> alter database drop logfile group 1;

-> DB 오픈

SYS> alter database open;

-> 지워진 그룹과 멤버 생성

SYS> alter database add logfile group 1('/data/backup/close/redo01_a.log','/data/backup/close/redo01_b.log') size 50M;

끝.


(중요) case3. Current 가 아닌 그룹 중 archive 안 된 그룹이 삭제되었고 DB 상태는 Open

얼럿로그 확인

-> 장애가 발생하는 그룹 확인

-> Redo Log 초기화 및 신규생성

SYS> alter database clear unarchived logfile group 1;

끝.

※ 서버 운영 중 특정 그룹이 지워진 후 계속 log switch 가 발생하게 되면 Archive Hang 현상이 발생하여 중단되다가 강제로 비정상 종료됨. 그리고 오라클에서는 Archiving 을 순서대로 하기 때문에 한개의 그룹에서 아카이빙이 완료되지 않으면 그 다음 그룹의 로그파일 모두 아카이빙 되지 않는다. 계속 없는 그룹에 아카이빙을 시도하다보니 Hang 이 발생하게 되는 것이다. SEQ# 가장 작은 번호부터 정체가 시작.


case4. Current 가 아닌 그룹 중 archive 안 된 그룹이 삭제되었고 DB 상태는 Close

재시작시키면 에러 발생하면서 중단됨. ORA-03113 : end-of-file on communication channel

-> 얼럿로그 확인

-> 지워진 그룹 drop

SYS> alter database drop logfile group 1;

Archive 안 된 그룹은 삭제를 할 수 없다고 에러 메시지 나옴.

-> 초기화 및 재생성

SYS> alter database clear unarchived logfile group 1;

끝.


case5. Current 그룹이 삭제된 후 DB Open 상태

얼럿로그 메시지 확인해본다.

-> 삭제된 리두 로그 그룹 멤버를 찾을 수 없다는 에러 확인.

SYS> alter database clear unarchived logfile group 1;

끝.


case6. Current 그룹이 삭제된 경우 - Shutdown immediate 로 종료

Current 그룹이 삭제된 후 DB가 종료되었다면 정상 종료인지 비정상 종료인지에 따라 향후 재시작 시 심각한 문제가 될 수 있다. 먼저 shutdown immediate; 로 종료 한 경우.

-> 얼럿 로그 확인

->삭제된 그룹의 멤버를 찾을 수 없다는 에러 확인

-> 불완전 복구 후 리셋로그 옵션으로 오픈

SYS> recover database until cancel;

Media recovery complete.

SYS> alter database open resetlogs;

Database altered.

끝.

※ 원리를 아는 것이 매우 중요하다. 

 현재 상황은 Current 상태의 Redo log group 이 삭제된 후 shutdown immediate; 로 종료된 것이다. shutdown immediate; 란 DB 버퍼캐시에 있는 내용 중 commit 완료 된 내용은 데이터 파일로 전부 저장하고 commit 안 된 내용은 rollback 한 후 종료하는 것이다. 

 테스트용 테이블에 인서트 후 커밋 했기 때문에 shutdown immediate 한 순간 해당 내용은 데이터 파일에 저장 완료되었다. 그래서 사실 복구할 필요가 없다. 그런데 Current 상태의 Redo log file 이 없기때문에 Open 되지 않는다.

 이럴 때 Control File 에는 명단이 있으나 실제 파일이 없는 Redo log 를 재생성시키는 resetlogs 옵션을 사용하는 것이다. 문제는 resetlogs 옵션은 불완전 복구를 수행했을 경우만 쓸 수 있다는 점.













'Backup&Recovery' 카테고리의 다른 글

Parameter file 관리 및 장애복구  (0) 2015.04.20
데이터 이동하기 (Export / Import)  (1) 2015.04.20
Controlfile 장애복구  (0) 2015.04.14
닫힌백업(cold backup / closed backup)  (0) 2015.04.13
백업대상  (0) 2015.04.13

설정

트랙백

댓글

컨트롤 파일 장애 복구에 앞서 일단 백업 수행

※ 열린백업을 할 때에는 아카이브 로그모드로 변경 필요. (현재 spfile 사용중)

닫힌백업 수행할꺼지만 복습차원에서 일단 아카이브모드로 변경하고 진행


DB 오픈 상태에서

SYS>alter system set log_archive_dest_1='location=/data/arc1' scope=spfile;

System altered.


SYS>alter system set log_archive_dest_1='location=/data/arc2' scope=spfile;

System altered.


SYS>alter system set log_archive_format="%s_%t_%r.arc" scope=spfile;

System altered.


startup mount;

ORACLE instance started.


Total System Global Area  619360256 bytes

Fixed Size                  1345936 bytes

Variable Size             394266224 bytes

Database Buffers          218103808 bytes

Redo Buffers                5644288 bytes

Database mounted.


SYS>archive log list;

Database log mode              Archive Mode (아카이브 모드로 변경 완료)

Automatic archival             Enabled

Archive destination            /data/arc2

Oldest online log sequence     21

Next log sequence to archive   23

Current log sequence           23


SYS>alter database open;


Database altered.



<닫힌백업 수행>

1. 컨트롤파일, 데이터파일, 리두로그의 위치를 각각 확인 한 후

SYS>select name from v$controlfile;


NAME

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

/home/oracle/disk3/ctrl01.ctl

/home/oracle/disk4/ctrl02.ctl

/home/oracle/disk5/ctrl03.ctl


SYS>select name from v$datafile;


NAME

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

/app/oracle/disk4/system01.dbf

/app/oracle/disk4/sysaux01.dbf

/app/oracle/disk3/undo01.dbf

/app/oracle/disk5/users01.dbf

/app/oracle/disk5/example01.dbf

/app/oracle/oradata/testdb/undo01.dbf

/app/oracle/oradata/testdb/hakjum01.dbf


7 rows selected.


SYS>select member from v$logfile;


MEMBER

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

/app/oracle/disk1/redo03_a.log

/app/oracle/disk1/redo02_a.log

/app/oracle/disk1/redo01_a.log

/app/oracle/disk2/redo01_b.log

/app/oracle/disk2/redo02_b.log

/app/oracle/disk2/redo03_b.log


6 rows selected.


2. DB를 종료한 후 /data/backup/close 로 백업한다. 이후 DB 오픈.

[oracle@server128 backup]$  cp /home/oracle/disk3/ctrl01.ctl /data/backup/close/

[oracle@server128 backup]$  cp /home/oracle/disk4/ctrl02.ctl /data/backup/close/

[oracle@server128 backup]$  cp /home/oracle/disk5/ctrl03.ctl /data/backup/close/

[oracle@server128 backup]$

[oracle@server128 backup]$  cp /app/oracle/disk4/system01.dbf /data/backup/close/

[oracle@server128 backup]$  cp /app/oracle/disk4/sysaux01.dbf /data/backup/close/

[oracle@server128 backup]$ cp /app/oracle/disk3/undo01.dbf /data/backup/close/

[oracle@server128 backup]$ cp /app/oracle/disk5/*.dbf /data/backup/close/

[oracle@server128 backup]$ cp /app/oracle/oradata/testdb/undo01.dbf /data/backup/close/

[oracle@server128 backup]$ cp /app/oracle/oradata/testdb/hakjum01.dbf /data/backup/close/

[oracle@server128 backup]$

[oracle@server128 backup]$ cp /app/oracle/disk1/*.log /data/backup/close/

[oracle@server128 backup]$ cp /app/oracle/disk2/*.log /data/backup/close/


컨트롤파일 장애유형 3가지

1. 파라미터와 실제 경로가 다른경우

-> 안맞는 부분을 서로 맞춰주면 끝

2. Controlfile 끼리 내용이 다른경우 (Version 에러)

-> 높은 버전의 컨트롤파일이 최신 파일이므로 복사해서 해결

3. Old Controlfile

-> 컨트롤파일 재생성 후 resetlogs / noresetlogs 모드로 오픈



유형1.

현재 경로 확인 후 경로 중 하나를 지워서 에러를 발생시키기.

SYS>select name from v$controlfile;

NAME

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

/home/oracle/disk3/ctrl01.ctl

/home/oracle/disk4/ctrl02.ctl

/home/oracle/disk5/ctrl03.ctl


SYS>alter system set control_files='/home/hahaha/hahahaha/' scope=spfile;
System altered.

-> 파라미터파일과 실제 컨트롤파일의 위치를 맞지 않게 변경

SYS>shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

SYS>startup
ORACLE instance started.

Total System Global Area  619360256 bytes
Fixed Size                  1345936 bytes
Variable Size             394266224 bytes
Database Buffers          218103808 bytes
Redo Buffers                5644288 bytes
ORA-00205: error in identifying control file, check alert log for more info

야호 에러가 발생했다.


얼럿 로그를 살펴보자.

[oracle@server128 trace]$ tail -f /app/oracle/diag/rdbms/testdb/testdb/trace/alert_testdb.log

Sat Apr 11 19:34:20 2015

ALTER DATABASE   MOUNT

ORA-00210: cannot open the specified control file

ORA-00202: control file: '/home/hahaha/hahahaha/'

ORA-27037: unable to obtain file status

Linux Error: 2: No such file or directory

Additional information: 3

ORA-205 signalled during: ALTER DATABASE   MOUNT...

Sat Apr 11 19:34:21 2015

Checker run found 1 new persistent data failures


다시 경로를 원래대로 바꿔보자.

SYS>alter system set control_files='/home/oracle/disk3/ctrl01.ctl','/home/oracle/disk4/ctrl02.ctl','/home/oracle/disk5/ctrl03.ctl' scope=spfile;

System altered.

종료 후 스타트업

SYS>shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
SYS>
SYS>startup
ORACLE instance started.

Total System Global Area  619360256 bytes
Fixed Size                  1345936 bytes
Variable Size             394266224 bytes
Database Buffers          218103808 bytes
Redo Buffers                5644288 bytes
ORA-00214: control file '/home/oracle/disk3/ctrl01.ctl' version 1247
inconsistent with file '/home/oracle/disk5/ctrl03.ctl' version 1233

에러????
아니 고맙게도 유형 2에서 쓸 버전 에러가 여기서 나타났다.
중간에 한번 경로를 아래와 같이 바꿨었기 때문에 버전이 맞지 않았던 듯 하다.

NAME
--------------------------------------------------------------------
/home/oracle/disk3/ctrl01.ctl
/home/oracle/disk4/ctrl02.ctl

이럴때는 높은 버전의 컨트롤파일을 복사해서 새로 만들면 된다.
ctrl01.ctl 의 버전이 1247로 더 높기 때문에 이걸 복사해서 02,03 생성한다.

[oracle@server128 ~]$ cp /home/oracle/disk3/ctrl01.ctl /home/oracle/disk4/ctrl02.ctl
[oracle@server128 ~]$ cp /home/oracle/disk3/ctrl01.ctl /home/oracle/disk5/ctrl03.ctl

SYS>alter database mount;
Database altered.

SYS>alter database open;
Database altered.

SYS>select name from v$controlfile;

NAME
----------------------------------------------------------------------
/home/oracle/disk3/ctrl01.ctl
/home/oracle/disk4/ctrl02.ctl
/home/oracle/disk5/ctrl03.ctl

복사 후 차례로 마운트 -> 오픈 하였다. 정상적으로 오픈 완료.


유형2.

위에서 다룸.


유형3.

Old Controlfile 에러 만들기.

백업받아놓은 예전 컨트롤파일을 복사한다.

[oracle@server128 close]$ cp /data/backup/close/ctrl01.ctl /home/oracle/disk3/ctrl01.ctl

[oracle@server128 close]$ cp /data/backup/close/ctrl01.ctl /home/oracle/disk4/ctrl02.ctl

[oracle@server128 close]$ cp /data/backup/close/ctrl01.ctl /home/oracle/disk5/ctrl03.ctl


SYS>startup

ORACLE instance started.


Total System Global Area  619360256 bytes

Fixed Size                  1345936 bytes

Variable Size             394266224 bytes

Database Buffers          218103808 bytes

Redo Buffers                5644288 bytes

Database mounted.

ORA-01122: database file 1 failed verification check

ORA-01110: data file 1: '/app/oracle/disk4/system01.dbf'

ORA-01207: file is more recent than control file - old control file


이후 스타트업 하면 에러 발생
-> 컨트롤파일 재생성 스크립트 생성

SYS>alter database backup controlfile to trace as '/home/oracle/control.sql';
Database altered.

vi control.sql

  1 STARTUP NOMOUNT
  2 CREATE CONTROLFILE REUSE DATABASE "TESTDB" NORESETLOGS  ARCHIVELOG
  3     MAXLOGFILES 16
  4     MAXLOGMEMBERS 3
  5     MAXDATAFILES 100
  6     MAXINSTANCES 8
  7     MAXLOGHISTORY 292
  8 LOGFILE
  9   GROUP 1 (
 10     '/app/oracle/disk1/redo01_a.log',
 11     '/app/oracle/disk2/redo01_b.log'
 12   ) SIZE 50M BLOCKSIZE 512,
 13   GROUP 2 (
 14     '/app/oracle/disk1/redo02_a.log',
 15     '/app/oracle/disk2/redo02_b.log'
 16   ) SIZE 50M BLOCKSIZE 512,
 17   GROUP 3 (
 18     '/app/oracle/disk1/redo03_a.log',
 19     '/app/oracle/disk2/redo03_b.log'
 20   ) SIZE 50M BLOCKSIZE 512
 21 -- STANDBY LOGFILE
 22 DATAFILE
 23   '/app/oracle/disk4/system01.dbf',
 24   '/app/oracle/disk4/sysaux01.dbf',
 25   '/app/oracle/disk3/undo01.dbf',
 26   '/app/oracle/disk5/users01.dbf',
 27   '/app/oracle/disk5/example01.dbf',
 28   '/app/oracle/oradata/testdb/undo01.dbf',
 29   '/app/oracle/oradata/testdb/hakjum01.dbf'
 30 CHARACTER SET KO16MSWIN949
 31 ;

이부분만 남기고 모두 지운다.

그리고 위에 빨간부분으로 표시된 부분은 
1. 현재 리두로그 까지 손상되었을 때 RESETLOGS
2. 아닐때는 NORESETLOGS 를 사용한다.

종료 후 컨트롤파일 재생성 스크립트 실행 후 오픈한다.

SYS>shutdown immediate;
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SYS>
SYS>
SYS>@control.sql
ORACLE instance started.

Total System Global Area  619360256 bytes
Fixed Size                  1345936 bytes
Variable Size             394266224 bytes
Database Buffers          218103808 bytes
Redo Buffers                5644288 bytes

Control file created.

SYS>select status from v$instance;

STATUS
------------
MOUNTED

SYS>alter database open;

Database altered.

끝.










'Backup&Recovery' 카테고리의 다른 글

데이터 이동하기 (Export / Import)  (1) 2015.04.20
Redo Log File 장애 case  (0) 2015.04.15
닫힌백업(cold backup / closed backup)  (0) 2015.04.13
백업대상  (0) 2015.04.13
Archive log 압축하여 저장공간 줄이기  (0) 2015.04.13

설정

트랙백

댓글

shutdown 한 후 백업하는 것.

중요한점은 모든 파일의 Checkpoint SCN 이 같아야 한다는 점.

그리고 정상적인 shutdown 이어야 한다는 점.

shutdown immediate , shutdown transactional , shutdown normal


※ 비정상 종료 (일관성 흐트러진 상태)

shutdown abort , startup force , instance crash 경우


아카이브 로그 모드 / 노 아카이브 로그 모드 모두 사용 가능

Data Files , Online Redo Log Files , Control Files 백업 가능


1. 백업대상 확인

select name , status from v$datafile;


@log


select name from v$controlfile;


!ls $ORACLE_HOME/dbs/


!ls $ORACLE_HOME/network/admin


2. DB 종료 (반드시 정상종료)

shutdown immediate;


3. 전체 파일 백업

cp /app/oracle/disk4/system01.dbf /data/backup/close/

cp /app/oracle/disk4/sysaux01.dbf /data/backup/close/ 

cp /app/oracle/disk3/undo01.dbf /data/backup/close/ 

cp /app/oracle/disk5/users01.dbf /data/backup/close/ 

cp /app/oracle/disk5/example01.dbf /data/backup/close/ 

cp /app/oracle/oradata/testdb/undo01.dbf /data/backup/close/ 

cp /app/oracle/oradata/testdb/hakjum01.dbf /data/backup/close/



cp /app/oracle/disk1/redo01_a.log /data/backup/close/ 

cp /app/oracle/disk2/redo01_b.log /data/backup/close/  

cp /app/oracle/disk1/redo02_a.log /data/backup/close/  

cp /app/oracle/disk2/redo02_b.log /data/backup/close/  

cp /app/oracle/disk1/redo03_a.log /data/backup/close/  

cp /app/oracle/disk2/redo03_b.log /data/backup/close/ 



cp /home/oracle/disk3/ctrl01.ctl /data/backup/close/

cp /home/oracle/disk4/ctrl02.ctl /data/backup/close/

cp /home/oracle/disk5/ctrl03.ctl /data/backup/close/


cp $ORACLE_HOME/dbs/*.ora /data/backup/close/

cp $ORACLE_HOME/dbs/orapwtestdb /data/backup/close/

cp $ORACLE_HOME/network/admin/* /data/backup/close/ 


4. DB OPEN


백업 내역 확인



'Backup&Recovery' 카테고리의 다른 글

Redo Log File 장애 case  (0) 2015.04.15
Controlfile 장애복구  (0) 2015.04.14
백업대상  (0) 2015.04.13
Archive log 압축하여 저장공간 줄이기  (0) 2015.04.13
Archive Log mode 로 변경하기  (0) 2015.04.13

설정

트랙백

댓글