[오라클 DB백업과 복구]23.10.16

망구씨·2023년 10월 16일
0

오라클 백업과 복구

목록 보기
10/13
post-thumbnail
post-custom-banner

RMAN 으로 백업과 복구하기

백업
1. hot backup : db 운영중에 백업(v$backup;조회) - datafile, control file
2. cold backup : db shutdown 상태에서 백업 - data file, control file, redo logfile
복구

1. db가 open되지 않은 상태에서 복구 (system 파일이 손상)
2. db가 open된 상태에서 복구 (non system 파일이 손상)
3. datafile, control file이 동시에 손상되었을 때 복구방법
4. 백업본이 없는 data file이 손상되었을 때 복구방법

✔️ (RMAN) 백업본이 없는 data file이 손상되었을 때 복구방법

  • 예를들어 월요일에 풀백업을 받은 것들이 있고 아카이브 로그가 생성되었다. 그런데 딱하나, ts01.dbf를 수요일에 만들고 백업을 안받았다. 그런데 하필 걔가 토요일쯤 깨졌다고 가정하자. 이럴 경우 껍데기를 하나 만들고, ts01.dbf를 만든 다음부터의 변경 이력정보를 이 껍데기 파일에 순서대로 적용한다. 이것을 recovery라고 한다. (저번시간에 사용자관리로 해봄) 알맨으로 해보자!!

실습

  1. 아카이브 모드인지 확인한다. (아카이브 모드에서만 가능)
  2. ts200 이라는 tablespace생성
  create  tablespace  ts200
    datafile  '/home/oracle/ts200.dbf'  size 20m;
  1. scott유저에서 emp200 테이블을 ts200 tablespace에 생성한다.
 create table  emp200
    ( empno  number(10),
      ename  varchar2(20) )
     tablespace ts200;
  1. emp200에 data insert한다.
insert  into  emp200  values(1111,'aaa');
  1. commit;
  2. 로그 스위치를 일으킨다.
SYS @ orcl2 > grant alter system to scott;
SCOTT> alter  system  switch  logfile;
  1. 4 ~ 6 번 작업을 3번 반복한다.
  2. checkpoint를 수동으로 일으킨다.
alter  system  checkpoint;
  1. shutdown abort
  2. os에서 ts200.dbf를 삭제한다.
[orcl2:~]$ rm ts200.dbf
  1. startup
ORA-01157: cannot identify/lock data file 17 - see DBWR trace file
ORA-01110: data file 17: '/home/oracle/ts200.dbf'
  1. 알맨으로 복원해야할 데이터 파일 복원
$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
RMAN>  restore  datafile 17;


✅ rman이 스스로 껍데기 파일을 생성한다!
13. 복원파일을 복구

RMAN> recover datafile 17;
media recovery complete, elapsed time: 00:00:00
Finished recover at 2023/10/16:10:12:29
  1. db를 오픈한다.
SYS @ orcl2 >  alter database open;
  1. select 해보기
SQL> connect scott/tiger
SQL> select * from emp200;

문제 ts301 테이블 스페이스와 ts302 라는 테이블 스페이스 2개를 생성합니다. 둘다 사이즈는 5m! 생성한 이후에 ts301 tablespace만 rman으로 백업하고, ts302테이블 스페이스는 백업하지 않습니다. ts302 tablespace에서 emp302 테이블을 scott유저에서 생성하고 , 데이터 insert 후에 로그스위치를 일으킵니다.(위 실습처럼 3번 반복) os에서 ts301.dbf, ts302.dbf를 삭제하고 복구해보기!
1. 테이블 스페이스 생성

SYS> create  tablespace  ts301
    datafile  '/home/oracle/ts301.dbf'  size 5m;

SYS> create  tablespace  ts302
    datafile  '/home/oracle/ts302.dbf'  size 5m;
  1. ts301을 알맨으로 백업하기
RMAN> backup tablespace ts301;
Finished Control File and SPFILE Autobackup at 2023/10/16:10:20:18
  1. scott계정에서 emp302테이블을 ts302 테이블스페이스에 생성하기
create table  emp302
    ( empno  number(10),
      ename  varchar2(20) )
     tablespace ts302;
  1. insert, commit, 로그스위치 3번 반복
insert  into  emp302  values(1111,'aaa');
commit;
alter  system  switch  logfile;
  1. 체크포인트 일으키기(혹시나 해서 날리것임)
alter  system  checkpoint;
  1. shutdown abort 후에 os에서 ts301.dbf, ts302.dbf를 삭제
  2. startup
ORA-01157: cannot identify/lock data file 18 - see DBWR trace file
ORA-01110: data file 18: '/home/oracle/ts301.dbf'
  1. sctott 접속 안되는것 확인함
[orcl2:~]$ scott
SQL*Plus: Release 11.2.0.1.0 Production on Mon Oct 16 10:24:09 2023
>
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
>
ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux Error: 2: No such file or directory
Process ID: 0
Session ID: 0 Serial number: 0
  1. 알맨으로 복원,복구해보기
restore  datafile 18;
recover datafile 18;
restore  datafile 19;
recover datafile 19;

📖 오라클의 파일들이 깨졌을 때 복구기술

  1. data file
    • system data file
    • non system data file
    • temp file
    • 인덱스 테이블 스페이스의 data file이 손상되었을때
  2. control file
  3. redo log file
  4. parameter file
  5. password file

✔️ temp file이 깨졌을 때의 복구 방법 (p ws2 책의 1권 6-6페이지)

💡temp file의 용도는, 임시로 데이터를 보관하는 공간!

  1. order by (정렬 작업)
  2. create index (정렬 작업)
  3. with절
  4. 기타 정렬작업 (union, intersect, mins, sort merge join)

temp 테이블 스페이스 손상시 복구 방법 실습

  • temp 파일의 위치 확인
col  file_name  for  a45
col  tablespace_name  for a10
select tablespace_name, file_name
  from  dba_temp_files;

TABLESPACE FILE_NAME
---------- ---------------------------------------------
TEMP       /u01/app/oracle/oradata/orcl2/temp01.dbf
  • default temporary tablespace 가 무엇인지 확인
col property_name for a25
col property_value for a20

select  property_name ,property_value
from  database_properties;

PROPERTY_NAME             PROPERTY_VALUE
------------------------- --------------------
DICT.BASE                 2
DEFAULT_TEMP_TABLESPACE   TEMP
  • temp file 을 손상시키고 복구하는 방법
    1. temp file 의 위치를 확인한다.
select file_name from dba_temp_files;

FILE_NAME
---------------------------------------------
/u01/app/oracle/oradata/orcl2/temp01.dbf

2. os 에서 위에서 확인한 temp01.dbf 를 삭제한다.

$ rm /u01/app/oracle/oradata/orcl2/temp01.dbf

3. 과도한 order by 작업을 수행한다.

SH> select  * 
     from  sales
     order by amount_sold desc; --이거 했는데 우리 pga영역이 넉넉해서 수행된다. 
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory -- 이렇게 에러가 나야한다!!     
SH> select /*+ use_merge(a b) */ a.*, b.*
     from sales a, sales b
     where a.prod_id = b.prod_id; -- 얘도 됨
SH> create index sales_indx2
     on(prod_id, amount_id, promo_id); -- 얘도 됨..! 

✅ 빅데이터를 정렬할 수 있는 공간인 temp tablespace가 손상되었기 때문에 에러가 발생합니다.

4. 복구 방법 2가지
✔️ db 내리고 temp tablespace 자동으로 복구하는 방법
: db 를 그냥 내렸다 올리면 자동으로 temp01.dbf 가 생성된다.

SQL> startup  force 

alert log file 에 아래의 내용이 나온다.

Re-creating tempfile /u01/app/oracle/oradata/orcl2/temp01.dbf


✔️ db 안내리고 temp tablespace 복구하는 방법
: 새로운 temp 파일을 추가하고 os 에서 삭제된 기존 파일을 drop 한다.

-- 다시 장애를 일으킨다. 

$ rm /u01/app/oracle/oradata/orcl2/temp01.dbf

-- 과도한 order by 를 수행한다.
SQL> select * from sh.sales order by amount_sold desc; -- 에러난다. 
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory 

-- 새로운 temp 파일을 추가하고 손상된 파일을 drop 한다.
SQL> alter  tablespace temp
      add tempfile '/u01/app/oracle/oradata/orcl2/temp02.dbf' size 200m;

SQL> alter tablespace temp
       drop tempfile '/u01/app/oracle/oradata/orcl2/temp01.dbf';

문제 os에서 temp02.dbf를 삭제하고 다시 temp tablespace에서 order by가 수행될 수 있도록 복구하시오

1. temp02.dbf 삭제

$ rm /u01/app/oracle/oradata/orcl2/temp02.dbf

2. 복구해보기 (db 안내리고 해보기)

-- 새로운 temp 파일 추가하기
SYS> alter  tablespace temp
      add tempfile '/u01/app/oracle/oradata/orcl2/temp03.dbf' size 200m;
-- 손상된 파일을 drop 하기
SYS> alter  tablespace temp
      drop tempfile '/u01/app/oracle/oradata/orcl2/temp02.dbf' ;

3. 다시 temp03.dbf 삭제후 디비 내렸다 올리기(자동으로 생성)

$ rm /u01/app/oracle/oradata/orcl2/temp03.dbf
SYS> startup force 


✅ alert log file에 자동으로 re-creating 되는것을 확인

📌 참고 !

✔️ 위처럼 조회했을 때 temp 테이블이 안나오는 경우도 있지만 temp tablespace가 없는것은 아니다. 정렬이 일어나지 않아서 없어보이는 것

✔️ 인덱스 테이블 스페이스의 data file이 손상되었을때 (p ws2의 6-10 페이지)

💡 오라클에서 권장하는 데이터 저장 방법

1. 테이블 -----> 테이블만 두는 tablespace에 두기
2. 인덱스 -----> 인덱스만 두는 tablespace에 두기

✅ 테이블과 인덱스를 하나의 테이블 스페이스에 두지 않습니다. 같이 두면 하나의 테이블 스페이스 I/O가 몰려서 서로 분리를 합니다.

⭐ table을 위한 테이블 스페이스 만들기

 create tablespace ts432
  datafile '/u01/app/oracle/oradata/orcl2/ts432.dbf' size 10m;

✔️ scott 유저로 접속해서

create table emp432
 (ename  varchar2(10),
  sal    number(10) )
  tablespace ts432;
 
insert into emp432 values ('scott', 3000);
commit;

✅ 위 데이터는 테이블을 위한 전용 스페이스인 ts432로 들어간다 !

⭐ index를 위한 테이블 스페이스 만들기

 create tablespace indx432
  datafile '/u01/app/oracle/oradata/orcl2/indx432.dbf' size 10m;

✔️ scott 유저로 접속해서

create index emp432_sal
  on emp432(sal)
  tablespace indx432;

✅ 이렇게하면 테이블을 ts432에 저장되고, 인덱스는 indx432에 저장된다!

⭐ 아래처럼 조회하면 테이블과 인덱스를 서로 다른 테이블 스페이스에 분리해놨기 때문에 한군데로 i/o가 몰리지 않는다.

select /*+ index(emp432 emp432_sal) */ ename, sal
  from emp432
  where sal=3000;


I/O는 읽고 쓰는건데, 이렇게 인덱스랑 테이블을 서로 분리하면 I/O가 분산된다. 그러면 I/O가 한군데에 몰리는 것 보다 성능이 좋아진다.

❗ I/O가 분산되면 성능도 좋아지지만 복구도 좋아진다!

: 테이블은 있으니까 인덱스 스페이스 그냥 재생성 하면 된다!
ex) 만약 indx432.dbf가 깨졌으면 백업받은 파일이 있을때는 복원, 복구를 하고 없다면 그냥 새로 테이블 스페이스를 만들고 인덱스를 다시 생성해주면 된다. 그리고 기존의 indx432 테이블 스페이스는 drop합니다.

다시 인덱스를 생성할때는, 다음과 같이 parallel, nologging옵션을 사용해서 빠르게 인덱스를 생성할 수 있게 해준다.


✔️ 테이블 스페이스 명에 indx라는 단어가 포함된 테이블 스페이스들을 나중에 현업에서 볼 수 있을것이다.

실습

1. 인덱스 테이블 스페이스를 rman으로 백업받기

[orcl2:~]$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
RMAN> report schema;
RMAN> report need backup;
File #bkps Name
---- ----- -----------------------------------------------------
17   0     /home/oracle/ts200.dbf
19   0     /home/oracle/ts302.dbf
20   0     /u01/app/oracle/oradata/orcl2/indx432.dbf
21   0     /u01/app/oracle/oradata/orcl2/ts432.dbf

RMAN> backup datafile 17;
RMAN> backup datafile 19;
RMAN> backup datafile 20;
RMAN> backup datafile 21;

2. indx432.dbf 삭제

$ rm /u01/app/oracle/oradata/orcl2/indx432.dbf

3. 메모리를 flush 시킵니다.

SYS > @flush

4. scott유저에서 아래의 sql을 수행합니다.

select /*+ index(emp432 emp432_sal) */ ename, sal
  from emp432
  where sal=3000;

ERROR at line 2:
ORA-01116: error in opening database file 20
ORA-01110: data file 20: '/u01/app/oracle/oradata/orcl2/indx432.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

5. 복구하려는 테이블 스페이스를 offline 시키고 복구해야한다.

SYS> alter tablespace indx432 offline immediate;

6. rman으로 20번 파일을 복원합니다.

RMAN> restore datafile 20;
or
RMAN> restore tablespace indx20

7. rman으로 20번 파일을 복구합니다.

RMAN> recover datafile 20;
or
RMAN> recover tablespace indx20;

8. index432 테이블 스페이스를 온라인 시킵니다.

SYS> alter tablespace indx432 online;

9. scott에서 select 해보기

select /*+ index(emp432 emp432_sal) */ ename, sal
  from emp432
  where sal=3000;

문제 위 방법으로 복구하지 말고 책에서 추천하는 방법으로 복구하기
(indx432테이블 스페이스의 백업본이 없었을 때의 복구방법)

1. 다시 os에서 indx432.dbf를 삭제

$ rm /u01/app/oracle/oradata/orcl2/indx432.dbf

2. 메모리 flush 시키기
3. scott 유저에서 다음의 SQL을 실행해서 잘 되는지 확인 ->에러날것

select /*+ index(emp432 emp432_sal) */ ename, sal
  from emp432
  where sal=3000;

ERROR at line 2:
ORA-01116: error in opening database file 20
ORA-01110: data file 20: '/u01/app/oracle/oradata/orcl2/indx432.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

4. 해당 indx432 테이블 스페이스를 offline 시킨다.

SYS> alter tablespace indx432 offline immediate;

✅ immediate를 쓰면 체크포인트를 일으키지 않고 offline 됩니다.

5. 해당 indx432 테이블 스페이스를 drop한다. (테이블이 들어있는 테이블스페이스는 안된다.)

SYS @ orcl2 > drop tablespace indx432 including contents and datafiles;
Tablespace dropped.

6. 인덱스를 저장할 테이블 스페이스를 다시 생성한다.

SYS> create tablespace indx432
      datafile '/u01/app/oracle/oradata/orcl2/indx432.dbf' size 10m;

7. emp432_sal인덱스를 다시 생성한다. (nologging, parallel을 사용하기)

SCOTT> create index emp432_sal
        on emp432(sal)
        tablespace indx432
        nologging
        parallel 4;

✅ 위와같이 생성하면 아주 빠르게 인덱스가 생성됩니다.
8. 병렬도 다시 1로 변경하고 select 해봅시다

SCOTT> alter index emp432_sal parallel 1;
SCOTT @ orcl2 > select /*+ index(emp432 emp432_sal) */ ename, sal
  from emp432
  where sal=3000;  2    3

ENAME             SAL
---------- ----------
scott            3000

문제 위에서 생성한 indx432 테이블 스페이스를 rman 백업이 아닌 사용자 관리 백업으로 수행하는데, 이 indx432 테이블 스페이스만 hot backup 하세요.

hot backup 순서 - db를 내리지 않고 백업하기 !
1. begin backup

SYS> alter tablespace indx432 begin backup;
SYS> select * from v$backup;

2. /u01/app/oracle/oradata/orcl2/indx432.dbf를 /home/oracle/orcl2_hot 디렉토리에 복사합니다.

$ cp /u01/app/oracle/oradata/orcl2/indx432.dbf /home/oracle/orcl2_hot/indx432.dbf

3. end backup

SYS> alter tablespace indx432 end backup;
SYS @ orcl2 > select * from v$backup;
20 NOT ACTIVE            1630279 2023/10/16:14:18:41

문제 os에서 indx432.dbf를 삭제하고 rman으로 복구하지 말고 사용자관리로 복구하시오

1. 삭제하기

$ rm /u01/app/oracle/oradata/orcl2/indx432.dbf

2. scott에서 확인해보기

SYS @ orcl2 > @flush

SYS @ orcl2 > conn scott/tiger
Connected.
SCOTT @ orcl2 > select /*+ index(emp432 emp432_sal) */ ename, sal
  from emp432
  where sal=3000;  
  from emp432
       *
ERROR at line 2:
ORA-01116: error in opening database file 20
ORA-01110: data file 20: '/u01/app/oracle/oradata/orcl2/indx432.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

3. indx432를 offline시키기

SYS> alter tablespace indx432 offline immediate;

4. 복원하기

$ cp /home/oracle/orcl2_hot/indx432.dbf /u01/app/oracle/oradata/orcl2/indx432.dbf

3. 복구하기

SYS @ orcl2 > recover tablespace indx432;
Media recovery complete.

4. indx432를 online

SYS> alter tablespace indx432 online;

5. scott에서 select 해보기

SCOTT @ orcl2 > select /*+ index(emp432 emp432_sal) */ ename, sal
  from emp432
  where sal=3000;    2    3

ENAME             SAL
---------- ----------
scott            3000

💡 offline -> 복원/복구 -> online


✔️ parameter file이 깨졌을 때의 복구 방법

1. 사용자 관리 백업

cd $ORACLE_HOME/dbs
$ ls -l *.ora
SYS> create pfile from spfile; --pfile이 없어서 생성했다
-rw-r--r-- 1 oracle dba      1059 10월 16 14:49 initorcl2.ora -- pfile
-rw-r----- 1 oracle dba      3584 10월 16 11:24 spfileorcl2.ora
-rw-r----- 1 oracle dba      2560 10월 16 09:40 spfileorcl3.ora

2. RMAN 백업

[orcl2:~]$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
RMAN> show all; -- 알맨 셋팅 환경정보를 알 수 있다.
CONFIGURE CONTROLFILE AUTOBACKUP ON; -- 켜있는지 확인합니다!!
RMAN> backup datafile 1;
Starting Control File and SPFILE Autobackup at 2023/10/16:14:53:25
piece handle=/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_16/o1_mf_s_1150383205_llsmyows_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2023/10/16:14:53:26


3. 백업이 잘 되었는지 확인

RMAN> list backup of spfile;

1. 사용자 관리 복구 방법으로 spfile 복구하기

  1. os에서 spfile을 삭제합니다.
$ cd $ORACLE_HOME/dbs
$ rm spfileorcl2.ora
  1. 지금 당장은 문제가 없지만 앞으로 db를 올렸다 올릴때 spfile로 인스턴스를 구성하지 못한다. 또 alter system 명령어로 spfile안의 파라미터를 변경할 수도 없습니다.
  2. db shutdown immediate
  3. 기존 pfile로 spfile 생성하기
create spfile from pfile;
  1. os에서 spfile이 잘 생성되었는지 확인
[orcl2:dbs]$ ls -l spfile*
-rw-r----- 1 oracle dba 3584 10월 16 14:59 spfileorcl2.ora
-rw-r----- 1 oracle dba 2560 10월 16 09:40 spfileorcl3.ora

문제 cp 명령어로 /home/orace/orcl2_hot2밑에 spfile을 백업하기

$ cp $ORACLE_HOME/dbs/spfileorcl2.ora /home/oracle/orcl2_hot/spfileorcl2.ora

2. RMAN으로 spfile만 별도로 백업 받을 수 있음

RMAN> backup spfile;

⭐ spfile, pfile이 둘다 삭제 되었을 때 RMAN 복구방법

  1. DB의 ID확인
SYS> select dbid from v$database;
      DBID
----------
1130331177
  1. os에서 spfile, pfile을 둘다 삭제
$ rm $ORACLE_HOME/dbs/spfileorcl2.ora
$ rm $ORACLE_HOME/dbs/initorcl2.ora
  1. shutdown abort
  2. startup : 아예 에러난다. 안올라옴!
ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/initorcl2.ora'
  1. rman 접속!!
[orcl2:~]$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3 -- 접속안댐
  1. 다음과 같이 rman으로 접속 (shutdown된 상태에서 접속)
[orcl2:~]$ rman target / nocatalog
  1. 가상으로 오라클을 nomount로 올린다.
RMAN> startup nomount


8. 백업받은 spfile을 복원합니다.

RMAN> set dbid=1130331177;
RMAN> restore spfile from autobackup;
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of restore command at 10/16/2023 15:15:18
RMAN-06172: no AUTOBACKUP found or specified handle is not a valid copy or piece
  1. 위 작업이 에러난다면?
RMAN> restore spfile from '위에서 확인한 백업위치와 이름';
/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_16/o1_mf_s_1150383205_llsmyows_.bkp

RMAN> restore spfile from '/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_16/o1_mf_s_1150383205_llsmyows_.bkp';
RMAN> startup force;


10. 만약에 백업받고 저거 경로 안적어놨다면 아래경로에서 저기 파일 하나씩 다 대입해서 복구해본다.

[orcl2:2023_10_16]$ pwd
/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_16
[orcl2:2023_10_16]$ ls
o1_mf_s_1150366480_lls3n0bx_.bkp  o1_mf_s_1150379232_llsj2k1c_.bkp  o1_mf_s_1150381326_llsl3z1w_.bkp
o1_mf_s_1150366816_lls3yk2m_.bkp  o1_mf_s_1150379238_llsj2pop_.bkp  o1_mf_s_1150382238_llsm0gy1_.bkp
o1_mf_s_1150370968_lls808qq_.bkp  o1_mf_s_1150379245_llsj2x2y_.bkp  o1_mf_s_1150383205_llsmyows_.bkp
o1_mf_s_1150373401_llsbd91c_.bkp  o1_mf_s_1150379251_llsj3348_.bkp  o1_mf_s_1150383951_llsnp02p_.bkp

문제 orcl2 의 spfile로 pfile을 생성한 후에 cat으로 pfile을 열고 별도로 그 내용을 백업하기

orcl2.__db_cache_size=436207616
orcl2.__java_pool_size=16777216
orcl2.__large_pool_size=16777216
orcl2.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
orcl2.__pga_aggregate_target=603979776
orcl2.__sga_target=889192448
orcl2.__shared_io_pool_size=0
orcl2.__shared_pool_size=369098752
orcl2.__streams_pool_size=33554432
*.audit_file_dest='/u01/app/oracle/admin/orcl2/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/u01/app/oracle/oradata/orcl2/control01.ctl','/u01/app/oracle/flash_recovery_area/orcl2/control02.ctl','/u01/app/oracle/oradata/orcl2/control03.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl2'
*.db_recovery_file_dest_size=10737418240
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orcl2XDB)'
*.log_archive_dest=''
*.log_archive_duplex_dest=''
*.log_archive_min_succeed_dest=1
*.memory_target=1485832192
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'

✔️ password file 삭제시 복구 방법(workshop2 책의 p6-14)


💡 password file의 역할 : 원격에서 리스너를 통해 sys 유저로 접속을 하기 위한 파일

  1. 리스너가 정상인지 확인
    $ lsnrctl status
    확인해야 하는 내용 3가지
  • host이름 : edydr1p0.us.oracle.com
  • 포트번호 : 1521
  • 서비스 이름 : orcl2
  1. 리스너 통해서 scott 유저로 접속을 시도한다.
 $ sqlplus scott/tiger@edydr1p0.us.oracle.com:1521/orcl2
                           ip주소              포트번호  서비스이름

또는

$ sqlplus scott/tiger@orcl2 -- tns alias
$ cd $ORACLE_HOME/network/admin
$ ls

$ cat tnsnames.ora


3. 리스너를 내리고 위와 같이 접속하면 접속이 되는지 확인해보기

$ lsnrctl stop
[orcl2:~]$ sqlplus scott/tiger@orcl2
SQL*Plus: Release 11.2.0.1.0 Production on Mon Oct 16 15:59:57 2023

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

ERROR:
ORA-12541: TNS:no listener


얘는 리스너 업이 들어간것이다!
4. 리스너 다시 올리기

$ lsnrctl start

➡️ sqlplus scott/tiger@orcl2로 접속이 잘 되는 이유는 아래의 2가지가 정상이어서 그렇다.
1. 리스너가 정상적으로 올라와져 있다
2. 패스워드 파일이 존재해서 (scott은 되지만 sys는 접속이 안된다.)

sqlplus sys/oracle@edydr1p0.us.oracle.com:1521/orcl2 as sysdba
Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

❓ 그렇다면 패스워드 파일을 삭제하고 다시 접속해보면?

$ cd $ORACLE_HOME/dbs
$ rm orapworcl2 
$ sqlplus sys/oracle@edydr1p0.us.oracle.com:1521/orcl2 as sysdba
ERROR:
ORA-01031: insufficient privileges

패스워드 파일 복구방법

: 패스워드 파일을 생성하면 된다.

$ orapwd file=$ORACLE_HOME/dbs/orapworcl2 password=oracle entries=5
[orcl2:dbs]$ ls -l orap*
-rw-r----- 1 oracle oinstall 2048 10월 16 16:10 orapworcl2
sqlplus sys/oracle@edydr1p0.us.oracle.com:1521/orcl2 as sysdba -- 잘 접속된다.

✅ entries는 패스워드 파일에 등록될 유저의 갯수! 5명을 넘기지 못한다.


불완전 복구 (workshop2 p6-16)

  • 복구의 종류 2가지
  1. 완전 복구 (complete recovery)
➡️ 장애(failure)가 나기전에 마지막 commit 시점으로 복구하는것
  1. 불완전 복구 (incomplete recovery)
➡️ 과거의 특정 시점으로 복구하는것
* time base 불완전 복구 : 특정시간으로 db를 되돌리는 것
  - 사용자 관리 불완전 복구
  - 알맨을 이용한 불완전 복구
  
* cancel base  불완전 복구 : 과거로 db를 되돌리는데 복원 파일에 아카이브 로그 파일을 적용하다가 
                           끝까지 적용하지 않고  cancle을 해서 과거로 되돌린다. 

✔️ time base 방식의 사용자 관리 불완전 복구

  1. 아래의 테이블 스페이스만 두고 나머지는 모두 drop 하시오 !
    system, sysaux, undo, users, example, ts01, temp
select  tablespace_name  from  dba_tablespaces; 
drop  tablespace  TSYSH including contents and datafiles;
drop  tablespace TS100 including contents and datafiles;
drop  tablespace TS2000 including contents and datafiles;
drop  tablespace TS3000 including contents and datafiles;
drop  tablespace TS01 including contents and datafiles;
drop  tablespace TS500 including contents and datafiles;
drop  tablespace TS5001 including contents and datafiles;
drop  tablespace TS701 including contents and datafiles;
drop  tablespace USERS27 including contents and datafiles;
drop  tablespace USERS28 including contents and datafiles;
drop  tablespace USERS28 including contents and datafiles;
drop  tablespace TS200 including contents and datafiles;
drop  tablespace TS401 including contents and datafiles;
drop  tablespace TS302 including contents and datafiles;
drop  tablespace INDX432 including contents and datafiles;
drop  tablespace TS432 including contents and datafiles;

col  file_name  for  a45
col  tablespace_name for a10
select tablespace_name, file_name
   from dba_data_files;
  1. ts01 테이블 스페이스를 생성
SYS> create tablespace ts01
       datafile '/u01/app/oracle/oradata/orcl2/ts01.dbf' size 20m;
  1. cold backup 을 수행한다.
SQL> shutdown  immediate

$ mkdir  coldbackup2

$ cp /u01/app/oracle/oradata/orcl2/*.dbf  /home/oracle/coldbackup2/
SQL> startup  
  1. 로그 스위치를 5번 수행한다.
alter  system  switch  logfile;
  1. 체크 포인트도 일으킨다.
alter  system  checkpoint;  
  1. scott 으로 접속해서 현재 시간을 확인한다.
alter session  set  nls_date_format='RRRR/MM/DD:HH24:MI:SS';

select  sysdate  from  dual;  

SYSDATE
-------------------
2023/10/17:10:13:10 <--------- 시간을 따로 잘 적어둔다. 
  1. 로그 스위치를 3번 일으키고 체크포인트를 일으킨다.
alter  system  switch  logfile;
alter  system  checkpoint;  
  1. sh 계정의 sales 테이블을 drop 하시오 !
drop   table   sh.sales  purge;  
                           ↑
                          휴지통에 넣지말고 삭제 
  • 불완전 복구 수행
  1. shutdown immediate

  2. 기존 원본 data file 들을 모두 삭제하고 백업받은 모든 data file들을 복원한다.
    ❗ 단 controlfile 과 redo logfile 은 복원하지 않는다. data file 만 삭제하고 백업받은 파일 복원한다.

$ cd /u01/app/oracle/oradata/orcl2
ls *.dbf
rm *.dbf
$ cp /home/oracle/coldbackup2/*.dbf /u01/app/oracle/oradata/orcl2/
-- $ cp /home/oracle/coldbackup2/*.dbf /home/oracle/ 
  1. startup mount , select name from v$datafile;
  2. alter session set nls_date_format='RRRR/MM/DD:HH24:MI:SS';
  3. 복구할 때 아카이브 로그파일 적용하는거 안물어보고 자동으로 다 적용되게끔 아래 키고
SYS> set autorecovery  on
  1. 복구
SYS> recover database  until  time  '2023/10/17:10:13:04';

✅ 위에서 확인했던 시간에서 한 5~6초전으로 적는다.
14. 리두로그파일 초기화

SYS> alter database open resetlogs ;
  1. select * from sh.sales;
    ✅ resetlogs로 오픈했으면 다시 fullbackup 해야한다!
alter system switch logfile;
alter system switch logfile;
alter system switch logfile;
alter system checkpoint;

shutdown immediate
$ mkdir coldbackup3
$ cp /home/oracle/coldbackup2/*.dbf /home/oracle/coldbackup3/
startup

오늘의 마지막 문제 password file, parameter file, index tablespace, temp file중, 2가지 파일을 골라서 2개를 동시에 깨트리고 복구하기
parameter file, index tablespace

백업 먼저 진행

💡 parameter file 백업
1. 사용자 관리 백업

cd $ORACLE_HOME/dbs
$ ls -l *.ora
SYS> create pfile from spfile; --pfile이 없어서 생성했다
-rw-r--r-- 1 oracle dba      1059 10월 16 14:49 initorcl2.ora -- pfile
-rw-r----- 1 oracle dba      3584 10월 16 11:24 spfileorcl2.ora
-rw-r----- 1 oracle dba      2560 10월 16 09:40 spfileorcl3.ora
  1. RMAN 백업
[orcl2:~]$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
RMAN> show all; -- 알맨 셋팅 환경정보를 알 수 있다.
CONFIGURE CONTROLFILE AUTOBACKUP ON; -- 켜있는지 확인합니다!!
RMAN> backup datafile 1;

💡 인덱스 테이블 스페이스 생성, hot backup 하기
hot backup 순서 - db를 내리지 않고 백업하기 !
1. begin backup

SYS> alter tablespace indx432 begin backup;
SYS> select * from v$backup;
  1. /u01/app/oracle/oradata/orcl2/indx432.dbf를 /home/oracle/orcl2_hot 디렉토리에 복사합니다.
$ cp /u01/app/oracle/oradata/orcl2/indx432.dbf /home/oracle/orcl2_hot/indx432.dbf
  1. end backup
SYS> alter tablespace indx432 end backup;
SYS @ orcl2 > select * from v$backup;

사용자 관리 복구 방법으로 spfile 복구

  1. 파라미터 파일 깨트리기
$ cd $ORACLE_HOME/dbs
$ rm spfileorcl2.ora
  1. db shutdown immediate
  2. 기존 pfile로 spfile 생성하기
create spfile from pfile;
  1. os에서 spfile이 잘 생성되었는지 확인
[orcl2:dbs]$ ls -l spfile*

사용자 관리 복구 방법으로 인덱스 테이블스페이스 복구

  1. 삭제하기
$ rm /u01/app/oracle/oradata/orcl2/indx432.dbf
  1. scott에서 확인해보기
SYS @ orcl2 > @flush

SYS @ orcl2 > conn scott/tiger
Connected.
SCOTT @ orcl2 > select /*+ index(emp432 emp432_sal) */ ename, sal
  from emp432
  where sal=3000;  
  from emp432
       *
ERROR at line 2:
ORA-01116: error in opening database file 20
ORA-01110: data file 20: '/u01/app/oracle/oradata/orcl2/indx432.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3
  1. indx432를 offline시키기
SYS> alter tablespace indx432 offline immediate;
  1. 복원하기
$ cp /home/oracle/orcl2_hot/indx432.dbf /u01/app/oracle/oradata/orcl2/indx432.dbf
  1. 복구하기
SYS @ orcl2 > recover tablespace indx432;
Media recovery complete.
  1. indx432를 online
SYS> alter tablespace indx432 online;
  1. scott에서 select 해보기
SCOTT @ orcl2 > select /*+ index(emp432 emp432_sal) */ ename, sal
  from emp432
  where sal=3000;    2    3

1. 삭제해야할 index tablespace를 위해 준비
⭐ table을 위한 테이블 스페이스 만들기

 create tablespace ts101
  datafile '/u01/app/oracle/oradata/orcl2/ts101.dbf' size 10m;

✔️ scott 유저로 접속해서

create table emp101
 (ename  varchar2(10),
  sal    number(10) )
  tablespace ts101;

insert into emp101 values ('scott', 3000);
commit;

⭐ index를 위한 테이블 스페이스 만들기

 create tablespace indx101
  datafile '/u01/app/oracle/oradata/orcl2/indx101.dbf' size 10m;

✔️ scott 유저로 접속해서

create index emp101_sal
  on emp101(sal)
  tablespace indx101;

2. parameter file 사용자 관리 백업, 알맨 백업

-- 1. 사용자 관리 백업spfile, pfile이 모두 있는지 확인하기
cd $ORACLE_HOME/dbs 
$ ls -l *.ora
[orcl2:dbs]$ ls -l *.ora
-rw-r--r-- 1 oracle oinstall 2851  5월 15  2009 init.ora
-rw-r--r-- 1 oracle dba      1059 10월 16 15:23 initorcl2.ora
-rw-r----- 1 oracle dba      3584 10월 16 16:57 spfileorcl2.ora
-rw-r----- 1 oracle dba      2560 10월 16 16:53 spfileorcl3.ora

-- 2. 알맨 백업
```sql
[orcl2:~]$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
RMAN> show all; -- 알맨 셋팅 환경정보를 알 수 있다.
CONFIGURE CONTROLFILE AUTOBACKUP ON; -- 켜있는지 확인합니다!!
RMAN> backup datafile 1; -- 주소 적어놓기
Starting Control File and SPFILE Autobackup at 2023/10/16:17:28:12
piece handle=/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_16/o1_mf_s_1150392493_llsx0xk8_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 2023/10/16:17:28:14

3. 위에서 만든 인덱스 테이블 스페이스 hot backup 진행

--1. begin backup

SYS> alter tablespace indx101 begin backup;
SYS> select * from v$backup;
8 ACTIVE                1660239 2023/10/16:17:28:57

-- 2. /u01/app/oracle/oradata/orcl2/indx101.dbf를 /home/oracle/orcl2_hot 디렉토리에 복사합니다.
$ cp /u01/app/oracle/oradata/orcl2/indx101.dbf /home/oracle/orcl2_hot/indx101.dbf

-- 3. end backup
SYS> alter tablespace indx101 end backup;
SYS @ orcl2 > select * from v$backup;
8 NOT ACTIVE            1660239 2023/10/16:17:28:57

4. (손상) 파라미터 파일, 인덱스 테이블 스페이스 깨트리기

[orcl2:~]$  cd $ORACLE_HOME/dbs
[orcl2:dbs]$ ls *.ora
init.ora  initorcl2.ora  spfileorcl2.ora  spfileorcl3.ora
$ rm $ORACLE_HOME/dbs/spfileorcl2.ora
$ rm $ORACLE_HOME/dbs/initorcl2.ora
[orcl2:orcl2]$ rm /u01/app/oracle/oradata/orcl2/indx101.dbf

✅ 파라미터 파일을 pfile->spfile로 사용자 복구를 해주려면 디비 내려야하고 db가 올라올 때 파라미터 파일이 없다는 에러메세지를 확인하려면 db 내렸다 올려야하니까 그전에 scott 계정에서 table 조회 에러가 나는지 확인하기
5. scott 계정에서 table select 해보기 -> 에러나야함

select /*+ index(emp101 emp101_sal) */ ename, sal
  from emp101
  where sal=3000;


6. (index tablespace 복구) indx101를 offline시키기

SYS> alter tablespace indx101 offline immediate;

7. 복원하기

$ cp /home/oracle/orcl2_hot/indx101.dbf /u01/app/oracle/oradata/orcl2/indx101.dbf

8. 복구하기

SYS @ orcl2 > recover tablespace indx101;
Media recovery complete.

9. indx432를 online

SYS> alter tablespace indx101 online;

10. scott에서 select 해보기

SCOTT @ orcl2 > select /*+ index(emp101 emp101_sal) */ ename, sal
  from emp101
  where sal=3000;   


11. db shutdown immediate
12. (parameter file 복구) start up

ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/11.2.0/dbhome_1/dbs/initorcl2.ora'

13. rman 접속!!

[orcl2:~]$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3 -- 접속안댐

14. 다음과 같이 rman으로 접속 (shutdown된 상태에서 접속)

[orcl2:~]$ rman target / nocatalog

15. 가상으로 오라클을 nomount로 올린다.

RMAN> startup nomount

16. 백업받은 spfile을 복원합니다.

RMAN> set dbid=1130331177; -- 안된다!

17. 위 작업이 에러난다면?

RMAN> restore spfile from '위에서 확인한 백업위치와 이름';
RMAN> restore spfile from '/u01/app/oracle/flash_recovery_area/ORCL2/autobackup/2023_10_16/o1_mf_s_1150392493_llsx0xk8_.bkp';

❗ 실습하면서 orcl3의 spfile지웠다.. 백업 안했ㅇㅁ

profile
Slow and steady wins the race.
post-custom-banner

0개의 댓글