<<시나리오 n>>
모든 데이터파일, 컨트롤파일, 리두로그 파일이 손상되었을 때 RMAN 으로 복구하기
(백업본도 있고 백업본 이후의 아카이브도 있지만 커런트한 리두로그는 없는 경우,
백업본이 없으면 그냥 인생 끝장이라고 보면 된다. 아래는 백업본이 있다는 전제 하에 가능한 시나리오 )
1. 컨트롤파일을 백업본 가지고 새로운 위치에 리스토어하기 (새로운 위치는 pfile 에 써놓기)
2. 백업 컨트롤파일로 DB 마운트 단계까지 올린 다음 rename
3. 데이터파일 리스토어, 리커버
4. 리두가 없으므로 cancel base recovery
5. DB 리셋로그로 열기
위는 user managed backup 방식이지만 RMAN 도 원리는 똑같다.
/u01/app/oracle/oradata/ora11g/ 원래 파일이 있는 위치는 여기인데
/home/oracle/ora_data 리스토어하면서 이 위치로 옮겨 보자.
1. 여러 가지 확인 및 준비 작업
1-1. 리스토어 & 리커버 위치 정하기
[oracle@oracle ora_data]$ pwd
/home/oracle/ora_data
새로운 위치는 여기로.
1-2. 현재 DB 가 spfile 로 띄워져 있는지 아니면 pfile 로 띄워져 있는지 확인해보기
SYS@ora11g> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/product/11.2.0
.4/db_1/dbs/spfileora11g.ora
value 값이 있으면: DB 가 spfile 로 띄워져 있는 것
1-3. spfile 로부터 pfile 생성하기
SYS@ora11g> create pfile from spfile;
File created.
1-4. RMAN 으로 새로 접속하기
RMAN> exit
[oracle@oracle ~]$ rman target /
connected to target database: ORA11G (DBID=256148007)
1-5. 테이블스페이스 정보 확인하기
RMAN> report schema;
RMAN> report schema;
using target database control file instead of recovery catalog
Report of database schema for database with db_unique_name ORA11G
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1 750 SYSTEM *** /u01/app/oracle/oradata/ora11g/system01.dbf
2 730 SYSAUX *** /u01/app/oracle/oradata/ora11g/sysaux01.dbf
4 8 USERS *** /u01/app/oracle/oradata/ora11g/users01.dbf
5 338 EXAMPLE *** /u01/app/oracle/oradata/ora11g/example01.dbf
6 40 UNDOTBS *** /u01/app/oracle/oradata/ora11g/undotbs01.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1 29 TEMP 32767 /u01/app/oracle/oradata/ora11g/temp01.dbf
1-6. 백업본 확인하기
(없으면 백업 새로 받기 + 필요없는 파일들과 백업본 지우기)
RMAN> list backup;
RMAN> list backup;
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
61 Full 324.22M DISK 00:00:26 30-JAN-24
BP Key: 101 Status: AVAILABLE Compressed: YES Tag: TAG20240130T095922
Piece Name: /u01/app/oracle/fast_recovery_area/ORA11G/backupset/2024_01_30/o1_mf_nnndf_TAG20240130T095922_lvjlhc6c_.bkp
List of Datafiles in backup set 61
File LV Type Ckp SCN Ckp Time Name
---- -- ---- ---------- --------- ----
1 Full 2255794 30-JAN-24 /u01/app/oracle/oradata/ora11g/system01.dbf
2 Full 2255794 30-JAN-24 /u01/app/oracle/oradata/ora11g/sysaux01.dbf
4 Full 2255794 30-JAN-24 /u01/app/oracle/oradata/ora11g/users01.dbf
5 Full 2255794 30-JAN-24 /u01/app/oracle/oradata/ora11g/example01.dbf
6 Full 2255794 30-JAN-24 /u01/app/oracle/oradata/ora11g/undotbs01.dbf
BS Key Type LV Size Device Type Elapsed Time Completion Time
------- ---- -- ---------- ----------- ------------ ---------------
62 Full 9.95M DISK 00:00:00 30-JAN-24
BP Key: 102 Status: AVAILABLE Compressed: NO Tag: TAG20240130T095958
Piece Name: /u01/app/oracle/fast_recovery_area/ORA11G/autobackup/2024_01_30/o1_mf_s_1159610398_lvjljgct_.bkp
SPFILE Included: Modification time: 30-JAN-24
SPFILE db_unique_name: ORA11G
Control File Included: Ckp SCN: 2255821 Ckp time: 30-JAN-24
RMAN> crosscheck backupset;
백업셋에 대한 크로스체크
RMAN> crosscheck backupset;
using channel ORA_DISK_1
crosschecked backup piece: found to be 'AVAILABLE'
backup piece handle=/u01/app/oracle/fast_recovery_area/ORA11G/backupset/2024_01_30/o1_mf_nnndf_TAG20240130T095922_lvjlhc6c_.bkp RECID=101 STAMP=1159610363
crosschecked backup piece: found to be 'AVAILABLE'
backup piece handle=/u01/app/oracle/fast_recovery_area/ORA11G/autobackup/2024_01_30/o1_mf_s_1159610398_lvjljgct_.bkp RECID=102 STAMP=1159610398
Crosschecked 2 objects
RMAN> list expired backupset;
RMAN> list expired backupset;
specification does not match any backup in the repository
RMAN> delete expired backupset;
using channel ORA_DISK_1
specification does not match any backup in the repository
RMAN> report obsolete;
RMAN retention policy will be applied to the command
RMAN retention policy is set to redundancy 1
no obsolete backups found
1-7. 리두 확인하기
select a.group#, b.sequence#, a.member, b.bytes/1024/1024MB, b.archived, b.status, b.first_change#, b.next_change#
from v$logfile a, v$log b
where a.group# = b.group#
order by 1;
1-8. 로그 스위치 발생시켜서 아카이브 받고
SYS@ora11g> alter system switch logfile;
System altered.
/
/
1-9. 아카이브 확인해보기
SYS@ora11g> ! ls /home/oracle/arch1
arch_1_1_1159524370.arc arch_1_3_1159560397.arc
arch_1_2_1159560397.arc arch_1_4_1159560397.arc
arch_1_28_1158423268.arc
본격적인 실습은 이제부터...
2. 시나리오 시작
2-1. DB 내리기
SYS@ora11g> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
2-2. 모든 데이터파일, 리두로그 파일, 컨트롤파일 지워서 장애 유발하기
SYS@ora11g> ! rm /u01/app/oracle/oradata/ora11g/*.*
2-3. DB 올리면: 에러 발생
SYS@ora11g> startup
ORACLE instance started.
Total System Global Area 711430144 bytes
Fixed Size 1367004 bytes
Variable Size 448791588 bytes
Database Buffers 255852544 bytes
Redo Buffers 5419008 bytes
ORA-00205: error in identifying control file, check alert log for more info
부랴부랴 확인해보면
SYS@ora11g> ! ls /u01/app/oracle/oradata/ora11g/*.*
ls: cannot access /u01/app/oracle/oradata/ora11g/*.*: No such file or directory
파일들이 다 지워져 있는 것이 보인다.
2-4. 아카이브 확인
SYS@ora11g> ! ls /home/oracle/arch1
arch_1_1_1159524370.arc arch_1_3_1159560397.arc
arch_1_2_1159560397.arc arch_1_4_1159560397.arc
arch_1_28_1158423268.arc
천만다행으로 그래도 아카이브는 남아 있다.
2-5. DB 내리기
SYS@ora11g> shutdown abort
ORACLE instance shut down.
2-6. 컨트롤파일이 없어졌으므로 pfile 건드리기
OS 레벨로 나가서 pfile 쪽으로 가기
SYS@ora11g> !
[oracle@oracle ~]$ cd $ORACLE_HOME/dbs
[oracle@oracle dbs]$ ls
hc_clone.dat initora11g_20240116.ora orapwora11g
hc_ora11g.dat initora11g.ora snapcf_ora11g.f
initclone.ora lkCLONE spfileora11g.ora
init.ora lkORA11G
2-7. pfile 이 있는 곳으로 가서 pfile 열고 수정 작업하기
[oracle@oracle dbs]$ vi initora11g.ora
원래 컨트롤파일에 대한 내용은 맨 앞에 #을 붙여서 주석처리해 버리기 (연보라색 행)
그리고 바로 그 아래 행에 *.control_files='/home/oracle/ora_data/control01.ctl' 라는 행 추가
(컨트롤파일이 복원될 새로운 위치를 지정한 것)
#*.control_files='/u01/app/oracle/oradata/ora11g/control01.ctl'#Restore Controlfile ← 원래 위치 주석처리
*.control_files='/home/oracle/ora_data/control01.ctl' ← 컨트롤파일을 복원할 새로운 위치 지정
[oracle@oracle dbs]$ exit
2-8. pfile 로 DB 띄우기
SYS@ora11g> startup pfile=$ORACLE_HOME/dbs/initora11g.ora nomount
방금은 퍼티 sys 계정에서 했는데
RMAN 에서도 할 수 있다는 것을 보기 위해 다시 shutdown abort 하고
RMAN 에서 해보도록 하자.
SYS@ora11g> shutdown abort
ORACLE instance shut down.
RMAN 으로 다시 접속 > pfile 을 이용해서 DB 띄우기
RMAN> exit
[oracle@oracle ~]$ rman target /
RMAN> startup pfile=$ORACLE_HOME/dbs/initora11g.ora nomount
Oracle instance started
Total System Global Area 711430144 bytes
Fixed Size 1367004 bytes
Variable Size 448791588 bytes
Database Buffers 255852544 bytes
Redo Buffers 5419008 bytes
2-9. pfile 이 가지고 있는 위치에 복원 작업하기
RMAN> restore controlfile from autobackup;
RMAN> restore controlfile from autobackup;
Starting restore at 30-JAN-24
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=11 device type=DISK
recovery area destination: /u01/app/oracle/fast_recovery_area
database name (or database unique name) used for search: ORA11G
channel ORA_DISK_1: AUTOBACKUP /u01/app/oracle/fast_recovery_area/ORA11G/autobackup/2024_01_30/o1_mf_s_1159610398_lvjljgct_.bkp found in the recovery area
AUTOBACKUP search with format "%F" not attempted because DBID was not set
channel ORA_DISK_1: restoring control file from AUTOBACKUP /u01/app/oracle/fast_recovery_area/ORA11G/autobackup/2024_01_30/o1_mf_s_1159610398_lvjljgct_.bkp
channel ORA_DISK_1: control file restore from AUTOBACKUP complete
output file name=/home/oracle/ora_data/control01.ctl --- 컨트롤파일이 새로운 위치에 복구되었다고 나온다.
Finished restore at 30-JAN-24
2-10. 복구한 백업 컨트롤파일을 이용해 DB 마운트 단계까지 올리기
RMAN> alter database mount;
database mounted
released channel: ORA_DISK_1
2-11. 데이터파일과 리두로그파일, 템프 파일을 복구하되 위치를 바꾸어서 복구해주기
데이터파일과 템프 파일은 set newname for ... 하면 되지만
리두는 백업 정책에 포함되지 않았으므로 SQL 문장으로 rename 해야 한다.
RMAN>
run {
sql "alter database rename file ''/u01/app/oracle/oradata/ora11g/redo01.log'' to ''/home/oracle/ora_data/redo01.log''";
sql "alter database rename file ''/u01/app/oracle/oradata/ora11g/redo02.log'' to ''/home/oracle/ora_data/redo02.log''";
sql "alter database rename file ''/u01/app/oracle/oradata/ora11g/redo03.log'' to ''/home/oracle/ora_data/redo03.log''";
set newname for datafile 1 to '/home/oracle/ora_data/system01.dbf';
set newname for datafile 2 to '/home/oracle/ora_data/sysaux01.dbf';
set newname for datafile 4 to '/home/oracle/ora_data/users01.dbf';
set newname for datafile 5 to '/home/oracle/ora_data/example01.dbf';
set newname for datafile 6 to '/home/oracle/ora_data/undotbs01.dbf';
set newname for tempfile 1 to '/home/oracle/ora_data/temp01.dbf';
restore database;
switch datafile all;
switch tempfile all;
recover database;
alter database open resetlogs;
}
빈 껍데기 리두 만들기 + 데이터파일 만들기 + 템프파일 만들기
잘 돌아가다 말고 중간에 오류가 난다. (커런트한 리두가 없어졌기 때문)
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 01/30/2024 10:34:44
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 5 and starting SCN of 2256473
오류 발생!
완전한 리커버리를 위해서는 저 SCN 번호부터 리두가 필요하다는 메시지가 나온다.
그런데 우리는 커런트한 리두가 없으므로 저 SCN 번호까지만 복구해달라는 소망을 담아서
RMAN>
run {
sql "alter database rename file ''/u01/app/oracle/oradata/ora11g/redo01.log'' to ''/home/oracle/ora_data/redo01.log''";
sql "alter database rename file ''/u01/app/oracle/oradata/ora11g/redo02.log'' to ''/home/oracle/ora_data/redo02.log''";
sql "alter database rename file ''/u01/app/oracle/oradata/ora11g/redo03.log'' to ''/home/oracle/ora_data/redo03.log''";
set newname for datafile 1 to '/home/oracle/ora_data/system01.dbf';
set newname for datafile 2 to '/home/oracle/ora_data/sysaux01.dbf';
set newname for datafile 4 to '/home/oracle/ora_data/users01.dbf';
set newname for datafile 5 to '/home/oracle/ora_data/example01.dbf';
set newname for datafile 6 to '/home/oracle/ora_data/undotbs01.dbf';
set newname for tempfile 1 to '/home/oracle/ora_data/temp01.dbf';
restore database;
switch datafile all;
switch tempfile all;
set until scn=2256473;
recover database;
alter database open resetlogs;
}
run 구문을 고쳐놓고
RMAN 에서 위의 문장을 다시 수행하면
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of sql command on default channel at 01/30/2024 10:39:39
RMAN-11003: failure during parse/execution of SQL statement: alter database rename file '/u01/app/oracle/oradata/ora11g/redo01.log' to '/home/oracle/ora_data/redo01.log'
ORA-01511: error in renaming log/data files
ORA-01516: nonexistent log file, data file, or temporary file "/u01/app/oracle/oradata/ora11g/redo01.log"
이미 파일들이 존재한다는 메시지가 나온다.
(아까 run 문장을 돌렸을 때 이미 만들어진 파일들이 있는데
새로 만들려니 이미 있는 파일들과 상충해서 그렇다고 함)
2-12. 그러면 RMAN 말고 퍼티 SYS 창으로 나와서
SYS@ora11g> !
[oracle@oracle ora_data]$ ls
control01.ctl redo02.log system01.dbf users01.dbf
example01.dbf redo03.log temp01.dbf
redo01.log sysaux01.dbf undotbs01.dbf
[oracle@oracle ora_data]$ rm *.*
새로 파일을 만들려는 위치에 있는 파일들 몽땅 지우고 새로 시작하기
이제 다시 새로 시작하면 된다.
2-13. DB 내리고
SYS@ora11g> shutdown abort
ORACLE instance shut down.
2-14. 다시 pfile 생성하고, 백업본으로 컨트롤파일 만들고, DB 마운트 단계까지 올린 다음
SYS@ora11g> startup pfile=$ORACLE_HOME/dbs/initora11g.ora nomount
RMAN> restore controlfile from autobackup;
RMAN> alter database mount;
2-15. RMAN 에서 아래 run 구문 수행하기
RMAN>
run {
sql "alter database rename file ''/u01/app/oracle/oradata/ora11g/redo01.log'' to ''/home/oracle/ora_data/redo01.log''";
sql "alter database rename file ''/u01/app/oracle/oradata/ora11g/redo02.log'' to ''/home/oracle/ora_data/redo02.log''";
sql "alter database rename file ''/u01/app/oracle/oradata/ora11g/redo03.log'' to ''/home/oracle/ora_data/redo03.log''";
set newname for datafile 1 to '/home/oracle/ora_data/system01.dbf';
set newname for datafile 2 to '/home/oracle/ora_data/sysaux01.dbf';
set newname for datafile 4 to '/home/oracle/ora_data/users01.dbf';
set newname for datafile 5 to '/home/oracle/ora_data/example01.dbf';
set newname for datafile 6 to '/home/oracle/ora_data/undotbs01.dbf';
set newname for tempfile 1 to '/home/oracle/ora_data/temp01.dbf';
restore database;
switch datafile all;
switch tempfile all;
set until scn=2256473;
recover database;
alter database open resetlogs;
}
그러면 아나콘다같이 기~~~~~ 다란 메시지가 나오면서 창이 지혼자 막 올라가는데
media recovery complete, elapsed time: 00:00:03
Finished recover at 30-JAN-24
database opened
앞에 건 다 됐고 맨 끝에 위와 같은 메시지가 뜨면 복구에 성공한 것 (와! ♡)
RMAN> report schema;
새로운 위치로 복구 작업 완료되었는지 확인해보기
RMAN> report schema;
Report of database schema for database with db_unique_name ORA11G
List of Permanent Datafiles
===========================
File Size(MB) Tablespace RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1 750 SYSTEM *** /home/oracle/ora_data/system01.dbf
2 730 SYSAUX *** /home/oracle/ora_data/sysaux01.dbf
4 8 USERS *** /home/oracle/ora_data/users01.dbf
5 338 EXAMPLE *** /home/oracle/ora_data/example01.dbf
6 40 UNDOTBS *** /home/oracle/ora_data/undotbs01.dbf
List of Temporary Files
=======================
File Size(MB) Tablespace Maxsize(MB) Tempfile Name
---- -------- -------------------- ----------- --------------------
1 29 TEMP 32767 /home/oracle/ora_data/temp01.dbf
2-16. 여러 가지 확인 작업
SYS@ora11g> select status from v$instance;
STATUS
------------
OPEN
DB 열려 있는지 보고
SYS@ora11g> select name from v$controlfile;
NAME
--------------------------------------------------------------------------------
/home/oracle/ora_data/control01.ctl
SYS@ora11g> select name from v$datafile;
NAME
--------------------------------------------------------------------------------
/home/oracle/ora_data/system01.dbf
/home/oracle/ora_data/sysaux01.dbf
/home/oracle/ora_data/users01.dbf
/home/oracle/ora_data/example01.dbf
/home/oracle/ora_data/undotbs01.dbf
SYS@ora11g> select member from v$logfile;
MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/ora11g/redo01.log
/u01/app/oracle/oradata/ora11g/redo03.log
/u01/app/oracle/oradata/ora11g/redo02.log
파일들이 새로 바꾼 위치에 잘 들어가 있는 것이 보인다.
select a.group#, b.sequence#, a.member, b.bytes/1024/1024MB, b.archived, b.status, b.first_change#, b.next_change#
from v$logfile a, v$log b
where a.group# = b.group#
order by 1;
리두 정보 확인해보기
2024년 1월 30일 3교시 RMAN 풀 백업, 인크레멘털 백업 (0) | 2024.01.30 |
---|---|
2024년 1월 30일 2교시 : 1교시 때 했던 것 원복하기 (데이터 파일 이관작업) (0) | 2024.01.30 |
2024년 1월 29일 5교시 백업셋과 백업피스 크기 제한하기, 이미지 카피 백업 (0) | 2024.01.29 |
2024년 1월 29일 4교시+5교시 앞부분 : 컨트롤파일과 데이터파일들이 몽땅 깨졌을 때 RMAN으로 복구하기 / 컨트롤파일과 리두로그 파일이 깨졌을 때 RMAN으로 복구하기 (0) | 2024.01.29 |
2024년 1월 29일 3교시 RMAN advise failure, repair failure (0) | 2024.01.29 |