#1 alter tablespace ts01 add datafile '/home/oracle/ts01/dbf' size 10m ; #2 alter tablespace ts01 add datafile ('/home/oracle/ts01/dbf', '/home/oracle/ts01b/dbf')
💡 현업예서 컨트롤 파일이 깨졌던 사례 !
: 테이블 스페이스에 여러개의 data file을 한번에 add할 때 컨트롤 파일이 깨지는 일이 발생합니다.위 #2번처럼..!
1. 사용자 관리 백업 : 컨트롤 파일 생성 스크립트 생성
SQL> alter database backup controlfile to trace
as '/home/oracle/create_controlfile_20231005.sql';
2. RMAN 백업
RMAN> configure controlfile autobackup on; #아래꺼 하면 컨트롤파일 자동으로 백업할게
RMAN> backup datafile 1;
RMAN> backup current controlfile; #컨트롤파일만 따로 백업받는거
과정
1. 컨트롤 파일의 위치를 확인합니다.SQL> select * from v$controlfile; SQL> save c_file.sql SQL> show parameter control_files; +DATA/orcl/controlfile/current.260.796857737 +FRA/orcl/controlfile/current.256.1148659713 /home/oracle/control03.ctl
- db를 shutdown abort로 내린다.
- 컨트롤 파일 3개중, 한개를 깨트립니다.
[orcl:~]$ ls -l control* -rw-r----- 1 oracle dba 9846784 10월 5 10:09 control03.ctl -rw-r--r-- 1 oracle dba 6375 9월 7 09:59 controlfile_text.txt [orcl:~]$ rm control03.ctl
- db를 startup으로 올린다.
ORACLE instance started. Total System Global Area 1071333376 bytes Fixed Size 1341312 bytes Variable Size 847251584 bytes Database Buffers 218103808 bytes Redo Buffers 4636672 bytes ORA-00205: error in identifying control file, check alert log for more info SYS @ orcl > @i STATUS ------------ STARTED #nomount단계
- 컨트롤 파일을 복구
(1.사용자관리 복구 / 2.RMAN 복구)
5-1. 사용자 관리 복구1. 아까 만든 create_controlfile_20231005.sql을 열고 2. NORESETLOGS case를 따로 콜론누르고 51,128 w c8.sql 해서 저장한다. 3. SYS에서 @c8.sql 돌린다.
5-2. RMAN 복구
RMAN> restore controlfile from '+DATA/orcl/controlfile/current.260.796857737'; SYS> alter database mount SYS> alter database open #한단계씩 올라가기
- db를 올립니다.
✔️ 실습 하면서 참고할 것들
MAXDATAFILES
가 100개로 되어있는데 2000개로늘리는것이 좋다. Set #1. NORESETLOGS case
: 앞으로 변경사항을 적을 리두로그 파일을 그다음 숫자로 이어서 적는다. (완전복구)Set #2. RESETLOGS case
: 앞으로 변경사항을 적을 리두로그파일을 다시 깨끗하게 비우고 1번부터 새롭게 쓰겠다. (불완전복구): set nu
: 앞에 숫자 붙이기 !💡 복구 방법 정리
1. 리두 로그 그룹의 멤버가 여러개이고, 여러개중에 1개만 깨졌을때? (초급반)정상적으로 db가 운영된다. 그리고 alert log에는 계속 메세지가 나온다. 내용은 멤버 하나가 없으니 복구해야한다는 메세지 이고 다른 정상적인 멤버로 복구를 하면 된다.
2. 리두 로그 그룹의 멤버가 모두 깨졌을 때?
- 깨진 그룹의 상태가 inactive 면? 그 그룹을 drop 시키면 된다. (얘도 쉽다.. 초급반)
- 깨진 그룹의 상태가 active나 current면? 불완전 복구 (어렵다. 고급!!)
1. 현재 리두 로그 그룹의 상태를 확인
SQL> select group#, members, status from v$log; GROUP# MEMBERS STATUS ---------- ---------- ---------------- 1 2 INACTIVE #다 썼고 버퍼 캐쉬의 변경사항이 datafile에 다 반영된 상태 2 2 INACTIVE 3 2 INACTIVE 4 2 INACTIVE 5 2 INACTIVE 6 2 CURRENT #현재 lgwr가 쓰고 있는 상태 ACTIVE #다 썼고 버퍼캐쉬의 변경사항이 datafile에 다 반영된 상태 SQL> save log.sql SQL> @log.sql SQL> alter system checkpoint; #dbwr 작동시켜서 ACTIVE를 INACTIVE로 바꾸는것 SQL> select group#, member from v$logfile; SQL> save logf.sql SQL> ed logf.sql GROUP# MEMBER ---------- --------------------------------------------- 1 +FRA/orcl/onlinelog/group_1.257.796857749 1 +DATA/orcl/onlinelog/group_1.261.796857743 2 +DATA/orcl/onlinelog/group_2.262.796857753 2 +FRA/orcl/onlinelog/group_2.258.796857757 3 +DATA/orcl/onlinelog/group_3.263.796857759 3 +FRA/orcl/onlinelog/group_3.259.796857763 4 +DATA/orcl/onlinelog/group_4.271.1146924991 4 +FRA/orcl/onlinelog/group_4.264.1146924997 5 +DATA/orcl/onlinelog/group_5.272.1146925419 5 +FRA/orcl/onlinelog/group_5.265.1146925423 6 +DATA/orcl/onlinelog/group_6.275.1148660837 GROUP# MEMBER ---------- --------------------------------------------- 6 +FRA/orcl/onlinelog/group_6.330.1148660945
2. ASM에서 1번 깨트릴것임 멤버 누군지 확인하기
1 +FRA/orcl/onlinelog/group_1.257.796857749 1 +DATA/orcl/onlinelog/group_1.261.796857743 SQL> shutdown abort ASMCMD> 리두 로그 그룹 1번의 멤버 1개를 삭제하기 ASMCMD> pwd +data/orcl/onlinelog ASMCMD> rm group_1.261.796857743 ASMCMD> ls group_2.262.796857753 group_3.263.796857759 group_4.271.1146924991 group_5.272.1146925419 group_6.275.1148660837
3. 디비 올려보기(정상적으로 올라온다)
4. 아직 1번 그룹이 있다고 나오는데alter system switch logfile;
로 로그스위치를 일으키다 보면 alert log file에 없다고 메세지 나올것이다.
로그 스위치는 원래 자동인데 우리는 빨리 메세지 보려고 수동으로 일으킴
ORA-15012: ASM file '+DATA/orcl/onlinelog/group_1.261.796857743' does not exist
5. 위 메세지를 봤다면, 복구하자!
깨진 멤버를 같은 그룹의 다른 리두 로그 멤버로 복구 합니다.
db내릴 필요 없이 그냥 새로운 멤버를 그룹1에 추가하고, 기존꺼 삭제!1 +FRA/orcl/onlinelog/group_1.257.796857749 1 +DATA/orcl/onlinelog/group_1.261.796857743 #지금 얘가없음 SQL> alter system switch logfile; SQL> alter system checkpoint; #이 두개로 지금 내가 지운게 active라면 inactive로 변경 #새로운 멤버를 그룹1에 추가합니다. SQL> alter database add logfile member '+data' to group 1; #기존에 없어진 멤버를 삭제합니다.(컨트롤 파일에서 지움) SQL> alter database drop logfile member '+DATA/orcl/onlinelog/group_1.261.796857743'; SYS> alter system switch logfile;
✅ ACTIVE 는 dbwr가 아직 작동 전이라서 메모리에 반영되었지만 디스크에 반영 안된상태 에서
lgwr가 디스크에 다 내린건 active인데(현재 쓰고있는건 current) 체크포인트가 일어나서 dbwr가 디스크에 3000->0 으로 반영하면 active가 inactive로 바뀐다.
- inactive가 누군지 확인
SQL> @log SQL> @logf GROUP# MEMBER ---------- --------------------------------------------- 1 +FRA/orcl/onlinelog/group_1.257.796857749 1 +DATA/orcl/onlinelog/group_1.261.1149421679 SQL> shutdown abort
- 모두 삭제
rm group_1.261.1149421679 cd +fra/orcl/onlinelog rm group_1.257.796857749 ASMCMD> pwd +data/orcl/onlinelog ASMCMD> rm group_1.261.1149421679 ASMCMD> ls group_2.262.796857753 group_3.263.796857759 group_4.271.1146924991 group_5.272.1146925419 group_6.275.1148660837 ASMCMD> cd +fra/orcl/onlinelog ASMCMD> ls group_1.257.796857749 group_2.258.796857757 group_3.259.796857763 group_4.264.1146924997 group_5.265.1146925423 group_6.330.1148660945 ASMCMD> rm group_1.257.796857749 SQL> startup #올라오다가 mount에서 멈추면서 다시 db가 shutdown 되어버린다. SQL> startup mount SQL>@i STATUS ------------ MOUNTED SYS @ orcl > @log GROUP# MEMBERS STATUS SEQUENCE# ---------- ---------- ---------------- ---------- 1 2 INACTIVE 146 -- 문제가 된 로그그룹이 INACTIVE 확인 2 2 INACTIVE 147 6 2 INACTIVE 148 4 2 INACTIVE 144 5 2 INACTIVE 145 3 2 CURRENT 149 SQL> alter database drop logfile group 1; SQL> alter database open; SQL> alter database add logfile group 1; SYS @ orcl > @log GROUP# MEMBERS STATUS SEQUENCE# ---------- ---------- ---------------- ---------- 1 2 UNUSED 0 2 2 INACTIVE 147 3 2 INACTIVE 149 4 2 CURRENT 150 5 2 INACTIVE 145 6 2 INACTIVE 148 SQL> alter system switch logfile; SQL> alter system checkpoint;
점심시간 문제
리두로그 그룹의 마지막 그룹인 6번을 삭제하시오!
상태가 current나 active가 아니어야 삭제된다! 로그스위치를 수동으로 일으키고 inactive로 만들고 삭제하기!
SQL> alter system switch logfile;
SQL> alter system checkpoint;
SQL> alter database drop logfile group 6;
GROUP# MEMBER
---------- ---------------------------------------------
1 /home/oracle/arch/ORCL/onlinelog/o1_mf_1_lkw9
tgov_.log
1 +DATA/orcl/onlinelog/group_1.261.1149422555
2 +DATA/orcl/onlinelog/group_2.262.796857753
2 +FRA/orcl/onlinelog/group_2.258.796857757
3 +DATA/orcl/onlinelog/group_3.263.796857759
3 +FRA/orcl/onlinelog/group_3.259.796857763
4 +DATA/orcl/onlinelog/group_4.271.1146924991
4 +FRA/orcl/onlinelog/group_4.264.1146924997
5 +DATA/orcl/onlinelog/group_5.272.1146925419
GROUP# MEMBER
---------- ---------------------------------------------
5 +FRA/orcl/onlinelog/group_5.265.1146925423
6 +DATA/orcl/onlinelog/group_6.275.1148660837
6 +FRA/orcl/onlinelog/group_6.330.1148660945
✔️ 완전 복구(archivelog 모드)
□ data file , ■ control file, ▩ redo log file □ □ □ □ □ □ □ □ -------------------------> □ -- 얘 깨졌다고 가정 ■ ■ ■ ■ ■ ■ ■ ■ ■ ▩ ▩ ▩ ▩ ▩ ▩ ▩ ▩ △△△△△△△△△△△△△△△ ▩ whole backup 월 화 수 목 금 토
✅ 월요일에 whole backup 해놓은 상태, 토요일에 데이터 파일 하나가 깨졌다고 가정하면 월요일에서 그 파일을 가져온다. 그럼 다른 데이터들과 데이터 내용이 다르므로 (△는 아카이브 로그 파일) 아카이브 로그 파일을 적용해서 토요일 내용으로 다 똑같이 맞추어준다.
❗❗❗ 그런데 NOARCHIVELOG 라면, 아카이브 로그 파일이 없으므로, 깨진거는 월요일 데이터, 다른거는 토요일 데이터이다. 다른(월)데이터를 포기하면 되지만 포기할 수 없다면 월요일 데이터를 다시 다 가져와야한다.
그리고 그 사이 백업 이후에 발생한 변경 사항들은 사람이 직접 손으로 모두 입력해야한다.
노아카이브 모드에서의 복구는 whole 백업 받았던 시점으로 db 전체를 복원하는 방법이 복구이다.
그래서 아카이브 모드로 db를 운영해야한다!!
💡 Critical한 데이터 파일이란? system tablespace
와 undo tablespace
의 파일들을 말하고, 나머지는 모두 Noncrit
ical한 데이터 파일이다. Noncritical한 파일들은 db를 내리지 않고 복구할 수 있다.
(어제는 Noncritical한 파일들을 복구하는 것을 배웠는데 ASM때문에 디비를 내렸었다.)
실습
1. ts700 테이블 스페이스를 사이즈 20m로 생성하기drop tablespace ts700 including contents and datafiles; SQL> create tablespace ts700 datafile '/home/oracle/ts700.dbf' size 20m;
- ts700 테이블 스페이스에 emp700 테이블을 생성하기
SCOTT> create table emp700 (empno number(10), ename varchar2(10) ) tablespace ts700; SCOTT> insert into emp700 values(1111,'aaaa'); SCOTT> insert into emp700 values(2222,'bbbb'); SCOTT> commit;
3. 알맨으로 ts700 테이블 스페이스를 백업받는다.
RMAN> backup tablespace ts700;
4. os에서 ts700.dbf를 삭제한다.
[orcl:~]$ rm ts700.dbf [orcl:~]$ ls -l ts700.dbf ls: ts700.dbf: 그런 파일이나 디렉토리가 없음
5. emp700 table이 조회가 되는지 확인해보기(처음에는 조회 되는데, 버퍼캐시에 메모리 올라가있어서 그렇다. 이걸 없애주면 조회 안됨!)
SCOTT> alter system flush buffer_cache; SCOTT @ orcl > select * from emp700; select * from emp700 * ERROR at line 1: ORA-01116: error in opening database file 10 ORA-01110: data file 10: '/home/oracle/ts700.dbf' ORA-27041: unable to open file Linux Error: 2: No such file or directory Additional information: 3
✅ 위 상태에서 다른 테이블들은 조회가 된다. 근데 디비를 내리면 조회되는 테이블들도 안
6. 알맨으로 ts700 테이블 스페이스를 복구한다. (offline으로 변경한 후 진행해야 한다.)SQL> alter tablespace ts700 offline immediate; # 만약 immediate를 붙히지 않고 offline시키면 ts700 tablespace에 대해 체크포인트를 # 일으키고 offline시킨다. 그런데 지금 ts700.dbf가 깨졌기 때문에 체크포인트를 일으켜도 # 내려쓸 수 없는 상태이므로 immediate를 안붙이면 에러나면서 offline이 안됩니다. RMAN> restore tablespace ts700; RMAN> recover tablespace ts700; SYS @ orcl > alter tablespace ts700 online;
7. emp700 table이 조회되는지 확인한다. (scott접속)
SCOTT @ orcl > select * from emp700; EMPNO ENAME ---------- ---------- 1111 aaaa 2222 bbbb
관련문제1.
ts800 테이블 스페이스를 사이즈 30m로 생성하고, ts800 테이블 스페이스에 dept테이블과 똑같은 테이블과 데이터로 dept800을 생성하고, ts800 테이블을 백업하기
- tablespace ts800 만들기
SQL> create tablespace ts800 datafile '/home/oracle/ts800.dbf' size 30m;
- dept800 생성하기
SCOTT> create table dept800 tablespace ts800 as select * from dept;
- 알맨으로 백업받기
RMAN> backup tablespace ts800;
관련문제2.
os에서 ts800.dbf를 삭제하고 복구하기!
1. ts800삭제
[orcl:~]$ ls -l ts800* -rw-r----- 1 oracle dba 31465472 10월 5 14:25 ts800.dbf [orcl:~]$ rm ts800.dbf [orcl:~]$ ls -l ts800* ls: ts800*: 그런 파일이나 디렉토리가 없음
2. 조회 되는지 확인
SCOTT @ orcl> alter system flush buffer_cache; SCOTT @ orcl > select * from dept800; select * from dept800 * ERROR at line 1: ORA-01116: error in opening database file 11 ORA-01110: data file 11: '/home/oracle/ts800.dbf' ORA-27041: unable to open file Linux Error: 2: No such file or directory Additional information: 3
3. 복구하기
SYS @ orcl > alter tablespace ts800 offline immediate; RMAN> restore tablespace ts800; RMAN> recover tablespace ts800; SYS @ orcl > alter tablespace ts800 online; SCOTT @ orcl > select * from dept800; DEPTNO DNAME LOC ---------- -------------- ------------- 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON