상세 컨텐츠

본문 제목

2024년 1월 30일 1교시 모든 데이터파일, 컨트롤파일, 리두로그 파일이 손상되었을 때 RMAN으로 복구하기

오라클 백업 리커버리

by 병아리 엔지니어 2024. 1. 30. 10:52

본문

<<시나리오 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;

 

리두 정보 확인해보기

 

 

 

관련글 더보기