일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 쿠버네티스 컴포넌트
- terraform
- 로드밸런서 컨트롤러
- 그라파나 대시보드
- 솔데스크
- headless service
- AWS 딥레이서
- Prometheus install
- helm
- Kubernets on Jenkins
- grafana on kubernetes
- 깃허브 액션
- Aurora cluster
- 딥레이서
- Firelens
- github action 사용법
- 메탈LB
- 그라파나 시각화
- 딥레이서 보상함수
- 쿠버네티스
- blue-green
- EKS 클러스터
- Kubernetes
- EFS CSI Driver
- LoadBalancer Controller
- jenkins
- livenessPorbe
- kubernetes 동작 원리
- Solution Architecture
- SAA 합격 후기
mingming
Current Redo Log File 유실 복구 본문
Redo Log Group을 삭제 후 Log Switch를 하다보니 어느새 데이터베이스가 다운되어 버렸습니다.
sys 계정으로 로그인 후 데이터베이스 재기동을 해보니 아래와 같은 에러가 발생했습니다.
SQL> startup
ORACLE instance started.
Total System Global Area 591395496 bytes
Fixed Size 8899240 bytes
Variable Size 247463936 bytes
Database Buffers 327155712 bytes
Redo Buffers 7876608 bytes
Database mounted.
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/oracle/oradata/ORA19C/redo02.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7
redo02.log 파일을 읽을 수 없어 데이터베이스가 오픈되지 않았습니다. 다행히 마운트 상태까진 기동 되었습니다.
SQL> select status from v$instance;
STATUS
------------
MOUNTED
첫번쨰로 리두 로그 그룹 2번을 날리는 작업을 시도했습니다. 하지만 current log group 이라 삭제가 되지 않았습니다.
SQL> ALTER DATABASE DROP logfile GROUP 2;
alter database drop logfile group 2
*
ERROR at line 1:
ORA-01623: log 2 is current log for instance ORA19C (thread 1) - cannot drop
ORA-00312: online log 2 thread 1: '/oracle/oradata/ORA19C/redo02.log'
두번쨰로 손상된 리두 로그 그룹을 복구하고 아카이브되지 않도록 하는 명령어를 실행했습니다.
SQL> database clear unarchived logfile group 2;
SP2-0734: unknown command beginning "database c..." - rest of line ignored.
SQL> alter database clear unarchived logfile group 2;
alter database clear unarchived logfile group 2
*
ERROR at line 1:
ORA-01624: log 2 needed for crash recovery of instance ORA19C (thread 1)
ORA-00312: online log 2 thread 1: '/oracle/oradata/ORA19C/redo02.log'
ORA-01624
ORA-01624는 충돌 후 데이터베이스 시작 후 복구를 위해 작동하려는 리두 로그 그룹이 필요함을 의미합니다.
이는 리두 로그 그룹의 일부 변경 사항이 데이터 블록에 기록되지 않았기 때문입니다.
ORA-00312
일반적으로 로그가 손상되었음을 알리는 에러입니다.
세번째로 Database recover를 시도했습니다.
SQL> recover database until cancel;
ORA-00279: change 3377654 generated at 10/23/2023 22:52:21 needed for thread 1
ORA-00289: suggestion : /oracle/product/19.0.0/dbs/arch1_56_1125444161.dbf
ORA-00280: change 3377654 for thread 1 is in sequence #56
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/oracle/oradata/ORA19C/redo02.log
ORA-00308: cannot open archived log '/oracle/oradata/ORA19C/redo02.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7
현재 상태에서 resetlogs 옵션을 이용해 데이터베이스 오픈을 시도하면 아래와 같은 에러가 발생합니다.
system01.dbf 가 손상되었다는 의미인 것 같습니다.
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01194: file 1 needs more recovery to be consistent
ORA-01110: data file 1: '/oracle/oradata/ORA19C/system01.dbf'
datafile 1을 복구 시도했지만 여전히 같은 에러가 나오고 있습니다.
SQL> recover datafile 1;
ORA-00283: recovery session canceled due to errors
ORA-00313: open failed for members of log group 2 of thread 1
ORA-00312: online log 2 thread 1: '/oracle/oradata/ORA19C/redo02.log'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7
네번째로 pfile 히든 파라미터를 설정 후 재기동 했습니다. 이번엔 아카이브 파일이 손상되었다는 에러가 발생했습니다.
mv spfileORA19C.ora spfileORA19C.ora.orig
cp /oracle/admin/pfile/init.ora.062023235429 $ORACLE_HOME/dbs/initORA19C.ora
vi 편집기로 하단에 아래의 파라미터를 추가해줍니다.
_allow_resetlogs_corruption=true
SQL> startup
SQL> recover database until cancel;
ORA-00279: change 3377654 generated at 10/23/2023 22:52:21 needed for thread 1
ORA-00289: suggestion : /oracle/product/19.0.0/dbs/arch1_56_1125444161.dbf
ORA-00280: change 3377654 for thread 1 is in sequence #56
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
AUTO
ORA-00308: cannot open archived log
'/oracle/product/19.0.0/dbs/arch1_56_1125444161.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7
다섯번째로 컨트롤 파일을 복구해보기로 했습니다. 기본적으로 Mount 상태에서 Open이 되지 않는다는 의미는 컨트롤 파일 에서 읽어온 정보를 찾지 못해서이기 때문에 해당 정보를 일치시켜주면 될거 같다고 판단했습니다.
alter databse backup controlfile to trace as '/home/oracle/cont.sql';
vi cont.sql
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORA19C" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/oracle/oradata/ORA19C/redo01.log' SIZE 200M BLOCKSIZE 512,
GROUP 3 '/oracle/oradata/ORA19C/redo03.log' SIZE 200M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/oracle/oradata/ORA19C/system01.dbf',
'/oracle/oradata/ORA19C/sysaux01.dbf',
'/oracle/oradata/ORA19C/undotbs01.dbf',
'/oracle/oradata/ORA19C/users01.dbf'
CHARACTER SET AL32UTF8
;
로그파일의 그룹 2번을 제거 후 해당 sql 을 실행해주었습니다.
SQL> shutdown immediate;
SQL> startup nomount;
SQL> @/home/oracle/cont.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
Control file created.
해당 sql문을 실행시키면 자동으로 mount 단계로 들어갑니다. mount 단계에서 open을 시도하면 RESETOLOGS 옵션을 사용해 open 해야한다는 에러가 나오게됩니다.
SQL> alter database open
2 ;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
데이터베이스 오픈 후 로그 그룹을 확인해보면 리두 로그 그룹 2번이 제거되어 있는 것을 확인할 수 있습니다.
해당 방법으로 복구하게 되면 리두 로그 파일에 있는 정보가 유실 될 가능성이 있습니다.
SQL> ALTER DATABASE OPEN RESETLOGS;
database alterted
select a.group#, a.member, b.bytes/1024/1024 MB, b.archived, b.sequence# "SEQ#", b.status
from v$logfile a, v$log b
where a.group#=b.group#
order by 1,2;
'Database' 카테고리의 다른 글
Oracle - 데이터파일 장애 복구 (1) | 2023.10.27 |
---|---|
Oracle - Tablespace & Datafile 관리 (1) | 2023.10.27 |
Oracle - Redo Log File 관리 및 장애 복구 (0) | 2023.10.27 |
Oracle - 컨트롤파일 유실 장애 복구 시나리오 (1) | 2023.10.27 |