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

망구씨·2023년 10월 13일
0
post-thumbnail

➡️ 어제 우리 마지막문제 실습하다가 블록이 깨져있었다. 그래서 오늘 실습때도 깨져서 복구 못할 가능성이 있으니, redo file까지 백업 받은 후에 실습 시작함!

사용자 관리 백업 (cold backup)

💡 db 내려져있는 상태에서 백업! 장점은 모든 파일이 전부 다 같은시점의 파일임이 확실하다. 디비가 내려가져있는 상태니까. 반면에 hot backup은 디비가 운영중에 백업한거라 모두 같은시점이 아닐 수 있음.
실습 data file, control file, redo file을 모두 cold backup 받기
1. /home/oracle밑에 coldbackup2_orcl2 만들었다.
2. 아래를 vi coldbackup.sh 안에 넣었다.

cp /u01/app/oracle/oradata/orcl2/users01.dbf /home/oracle/coldbackup2_orcl2/users01.dbf 
cp /u01/app/oracle/oradata/orcl2/undotbs01.dbf /home/oracle/coldbackup2_orcl2/undotbs01.dbf
cp /u01/app/oracle/oradata/orcl2/sysaux01.dbf /home/oracle/coldbackup2_orcl2/sysaux01.dbf 
cp /u01/app/oracle/oradata/orcl2/system01.dbf /home/oracle/coldbackup2_orcl2/system01.dbf
cp /u01/app/oracle/oradata/orcl2/example01.dbf /home/oracle/coldbackup2_orcl2/example01.dbf 
cp /home/oracle/ts100.dbf /home/oracle/coldbackup2_orcl2/ts100.dbf
cp /home/oracle/tsysh.dbf /home/oracle/coldbackup2_orcl2/tsysh.dbf
cp /u01/app/oracle/oradata/orcl2/ts2000.dbf /home/oracle/coldbackup2_orcl2/ts2000.dbf
cp /u01/app/oracle/oradata/orcl2/ts3000.dbf /home/oracle/coldbackup2_orcl2/ts3000.dbf
cp /home/oracle/ysh/ts01.dbf /home/oracle/coldbackup2_orcl2/ts01.dbf
cp /home/oracle/ts500.dbf /home/oracle/coldbackup2_orcl2/ts500.dbf
cp /u01/app/oracle/oradata/orcl2/control01.ctl  /home/oracle/coldbackup2_orcl2/control01.ctl
cp /u01/app/oracle/flash_recovery_area/orcl2/control02.ctl  /home/oracle/coldbackup2_orcl2/control02.ctl 
cp /u01/app/oracle/oradata/orcl2/control03.ctl  /home/oracle/coldbackup2_orcl2/control03.ctl
cp /u01/app/oracle/oradata/orcl2/redo01.log /home/oracle/coldbackup2_orcl2/redo01.log 
cp /u01/app/oracle/oradata/orcl2/redo01b.log /home/oracle/coldbackup2_orcl2/redo01b.log 
cp /u01/app/oracle/oradata/orcl2/redo02b.log /home/oracle/coldbackup2_orcl2/redo02b.log 
cp /u01/app/oracle/oradata/orcl2/redo02.log /home/oracle/coldbackup2_orcl2/redo02.log 
cp /u01/app/oracle/oradata/orcl2/redo03b.log /home/oracle/coldbackup2_orcl2/redo03b.log 
cp /u01/app/oracle/oradata/orcl2/redo03.log /home/oracle/coldbackup2_orcl2/redo03.log 
-- 데이터 파일 위치 확인
SYS @ orcl2 > select file_name from dba_data_files;

--컨트롤 파일 위치 확인
SYS @ orcl2 > select name from v$controlfile;

--리두로그파일 위치 확인
SYS @ orcl2 > select group#, member
       from v$logfile
       order by group# asc

3. 디비를 내리고

SYS> shutdown immediate

4. 스크립트 돌리기, startup

$ sh coldbackup.sh 
SYS> startup

✔️ 사용자 관리 복구 (db가 close된 상태에서 복구)

💡 사용자 관리 복구 2가지가 있다.
1. system file이 깨졌을때의 복구 ➡️ DB mount 상태 에서 복구 가능
(system tablespace, undo tablespace)
2. non system file이 깨졌을 때의 복구 ➡️ DB mount / open 상태 에서 복구 가능
✔️ 가급적 디비가 open 상태에서 복구할 수 있어야 운영이 되니까 좋긴하지만 1번이 깨진것은 어쩔수가 없다.

1. non system file이 깨졌을 때의 사용자 관리 복구

✅ db 안내리고 복구!

1. ts5001이라는 테이블 스페이스를 생성한다.

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

2. ts5001 테이블 스페이스에 emp테이블과 똑같은 emp5001을 생성한다.

SCOTT> create table emp5001
        tablespace ts5001
        as select * from emp;

3. ts5001 테이블 스페이스를 백업합니다. hot backup - db운영중 백업

SYS> alter tablespace ts5001 begin backup;
-- 이 테이블 스페이스가 멈춘다. select, insert, update DDL모두 다 되지만 안내려써진다. 

4. os에서 ts5001.dbf를 /home/oracle/orcl2_hot/밑에 카피합니다.

$ mkdir orcl2_hot -- orcl2_hot폴더 만들기
$ cp /u01/app/oracle/oradata/orcl2/ts5001.dbf /home/oracle/orcl2_hot/ts5001.dbf

5. end backup 해준다.

SYS> alter tablespace ts5001 end backup;

6. os에서 rm으로 ts5001.dbf를 삭제한다.

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

7. emp5001을 select해본다 ➡️ 에러날 것!

SYS > alter system flush buffer_cache; --메모리 한번 날려준다
SYS > alter system flush shared_pool;
SCOTT> select * from emp5001;


8. ts5001 테이블 스페이스를 offline immediate합니다.

SYS> alter tablespace ts5001 offline immediate;

immediate를 해주어야 하는 이유는 지금 datafile이 없기때문에 체크포인트를 일으킬 수 없어서 immediate로 오프라인 시켜야합니다.
9. 백업받은 ts5001.dbf를 복원합니다.

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

10. 복원한 ts5001.dbf를 복구합니다.

SYS> recover tablespace ts5001;
or
SYS> recover datafile 데이터파일번호;

11. ts5001테이블 스페이스를 online 시킵니다.

SYS> alter tablespace ts5001 online;
SYS> select tablespace_name, status from dba_tablespaces;

12. emp5001 테이블을 select합니다.

SCOTT> select * from emp5001;

2. system file이 깨졌을때의 사용자 관리 복구

1. 모든 datafile들에 대해 hot backup을 수행한다. - Temp는 뺐다.

SQL> select 'alter tablespace ' || tablespace_name || ' begin backup;' from dba_tablespaces;

'ALTERTABLESPACE'||TABLESPACE_NAME||'BEGINBACKUP;'
-------------------------------------------------------------
alter tablespace SYSTEM begin backup;
alter tablespace SYSAUX begin backup;
alter tablespace UNDOTBS1 begin backup;
alter tablespace USERS begin backup;
alter tablespace EXAMPLE begin backup;
alter tablespace TSYSH begin backup;
alter tablespace TS100 begin backup;
alter tablespace TS2000 begin backup;
alter tablespace TS3000 begin backup;
alter tablespace TS01 begin backup;
alter tablespace TS500 begin backup;
alter tablespace TS5001 begin backup;

SYS> select 'cp ' || FILE_NAME || ' /home/oracle/orcl2_hot2'|| substr(file_name,instr(file_name,'/',-1)) from dba_data_files;

'CP'||FILE_NAME||'/HOME/ORACLE/ORCL2_HOT2'||SUBSTR(FILE_NAME,INSTR(FILE_NAME,'/'
------------------------------------------------------------------
cp /u01/app/oracle/oradata/orcl2/users01.dbf /home/oracle/orcl2_hot2/users01.dbf
cp /u01/app/oracle/oradata/orcl2/undotbs01.dbf /home/oracle/orcl2_hot2/undotbs01.dbf
cp /u01/app/oracle/oradata/orcl2/sysaux01.dbf /home/oracle/orcl2_hot2/sysaux01.dbf
cp /u01/app/oracle/oradata/orcl2/system01.dbf /home/oracle/orcl2_hot2/system01.dbf
cp /u01/app/oracle/oradata/orcl2/example01.dbf /home/oracle/orcl2_hot2/example01.dbf
cp /home/oracle/ts100.dbf /home/oracle/orcl2_hot2/ts100.dbf
cp /home/oracle/tsysh.dbf /home/oracle/orcl2_hot2/tsysh.dbf
cp /u01/app/oracle/oradata/orcl2/ts2000.dbf /home/oracle/orcl2_hot2/ts2000.dbf
cp /u01/app/oracle/oradata/orcl2/ts3000.dbf /home/oracle/orcl2_hot2/ts3000.dbf
cp /home/oracle/ysh/ts01.dbf /home/oracle/orcl2_hot2/ts01.dbf
cp /home/oracle/ts500.dbf /home/oracle/orcl2_hot2/ts500.dbf
cp /u01/app/oracle/oradata/orcl2/ts5001.dbf /home/oracle/orcl2_hot2/ts5001.dbf

SQL> select 'alter tablespace ' || tablespace_name || ' end backup;' from dba_tablespaces;

'ALTERTABLESPACE'||TABLESPACE_NAME||'ENDBACKUP;'
-----------------------------------------------------------
alter tablespace SYSTEM end backup;
alter tablespace SYSAUX end backup;
alter tablespace UNDOTBS1 end backup;
alter tablespace USERS end backup;
alter tablespace EXAMPLE end backup;
alter tablespace TSYSH end backup;
alter tablespace TS100 end backup;
alter tablespace TS2000 end backup;
alter tablespace TS3000 end backup;
alter tablespace TS01 end backup;
alter tablespace TS500 end backup;
alter tablespace TS5001 end backup;

2. orcl2_hot2를 만들고 위 스크립트 돌리기
✔️ 순서는 begin backup -> orcl2_hot2에 복사 -> end backup

$ mkdir orcl2_hot2
SYS @ orcl2 > ed begin_backup.sql -- 쉘스크립트 만들어서 돌림
SYS @ orcl2 > @begin_backup
[orcl2:~]$ vi orcl2_hot2_copy 
[orcl2:~]$ sh orcl2_hot2_copy
SYS @ orcl2 > ed endbackup.sql
SYS @ orcl2 > @endbackup
★★★ SYS> select file#, status from v$backup; -- NOT ACTIVE상태여야함 ★★★

3. 로그스위치를 일으키고 체크포인트도 일으킨다.

SYS> alter system switch logfile;
SYS> alter system checkpoint;
SYS> alter system switch logfile;

4. os에서 system01.dbf를 삭제한다.

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

3. 메모리의 내용을 flush 시킵니다.

SYS > alter system flush buffer_cache; 
SYS > alter system flush shared_pool;

4. scott계정에서 emp 테이블을 select합니다. ➡️ 에러날것!

SCOTT> select * from emp;

5. system table space, undo tablespace는 offline을 시킬 수 없으므로 DB를 내립니다.

SYS> shutdown abort

6. startup mount
7. 복구가 필요한 데이터파일 확인

SYS>  select  d.file#, d.name
       from  v$recover_file   r,  v$datafile  d
       where  r.file# = d.file#
      and  error='FILE NOT FOUND';
SYS> save need_recovery.sql
-------------------------------------------------------------------
         1
/u01/app/oracle/oradata/orcl2/system01.dbf

8. 백업받은 system01.dbf를 복원합니다.

$ cp /home/oracle/orcl2_hot2/system01.dbf /u01/app/oracle/oradata/orcl2/system01.dbf

9. system01.dbf를 복구합니다.

SYS> recover tablespace system;  또는 recover datafile 1;
Media recovery complete.

10. alter database open;

SYS @ orcl2 > alter database open;
Database altered.

11. scott계정에서 emp 테이블이 잘 select 되는지 확인합니다. (잘보임)

문제 undotbs01.dbf를 삭제하고 복구하기

4. os에서 undotbs01.dbf를 삭제한다.

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

3. 메모리의 내용을 flush 시킵니다.

SYS > alter system flush buffer_cache; 
SYS > alter system flush shared_pool;

4. scott계정에서 emp 테이블을 select합니다. ➡️ 에러날것! 접속 자체가 안됨

SCOTT> select * from emp;
SYS @ orcl2 > conn scott/tiger
ERROR:
ORA-00604: error occurred at recursive SQL level 1
ORA-01116: error in opening database file 3
ORA-01110: data file 3: '/u01/app/oracle/oradata/orcl2/undotbs01.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
Additional information: 3

Warning: You are no longer connected to ORACLE.

5. system table space, undo tablespace는 offline을 시킬 수 없으므로 DB를 내립니다.

SYS> shutdown abort

6. startup mount
7. 복구가 필요한 데이터파일 확인

SYS>  select  d.file#, d.name
       from  v$recover_file   r,  v$datafile  d
       where  r.file# = d.file#
      and  error='FILE NOT FOUND';
    
         3
/u01/app/oracle/oradata/orcl2/undotbs01.dbf

8. 백업받은 system01.dbf를 복원합니다.

$ cp /home/oracle/orcl2_hot2/undotbs01.dbf /u01/app/oracle/oradata/orcl2/undotbs01.dbf

9. undotbs01.dbf 를 복구합니다.

SYS> recover tablespace undo???;  또는 recover datafile 3;
Media recovery complete.

10. alter database open;

SYS @ orcl2 > alter database open;
Database altered.

11. scott계정에서 emp 테이블이 잘 select 되는지 확인합니다. (잘보임)

💡 참고할점!!

select file#, status from v$backup;

STATUS <- NOT ACTIVE 가 end backup 상태입니다. 액티브 상태이면 디비 안올라옵니다!! 파일 지우기전에 확인하기

⭐ 사용자 관리 백업과 복구

백업
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이 손상되었을 때 복구방법

✔️ 사용자 관리 방법으로 control file 백업하기

  1. binary file 형태로 백업
  2. text file 형태로 백업 (컨트롤 파일을 생성하는 스크립트 생성)

실습
1. binary file 형태로 백업

SYS> alter database backup controlfile to '/home/oracle/orcl2_hot2/control01.ctl' ;

2. text file 형태로 백업 (컨트롤 파일을 생성하는 스크립트 생성)

SYS> alter database backup controlfile to trace 
      as '/home/oracle/orcl2_hot2/cre_control01.sql';

✔️ control file이 손상되었을 때 복구방법(사용자관리)

순서
1. controlfile을 두가지 방법으로 백업받습니다.
2. os 에서 control file을 다중화 된 것 까지 전부 삭제합니다.
3. 메모리를 전부 flush 시킵니다.
4. scott 계정에서 emp 테이블을 select 해봅니다.
5. 체크포인트를 수동으로 일으킵니다.
6. shutdown abort
7. startup ➡️ 에러남! nomount에서 멈출것이다.
8. 백업받은 control file 복원복구 합니다.
(/home/oracle/orcl2_hot2/cre_control01.sql) 이 스크립트를 수정해서 하기.
이 스크립트 안에 컨트롤 파일을 생성하고 복구하고 db를 open하는것까지 모두 있다.

실습과정

  1. controlfile을 두가지 방법으로 백업받습니다. (위에서했음)
  2. os 에서 control file을 다중화 된 것 까지 전부 삭제합니다.
SYS> select name from v$controlfile;
/u01/app/oracle/oradata/orcl2/control01.ctl
/u01/app/oracle/flash_recovery_area/orcl2/control02.ctl
/u01/app/oracle/oradata/orcl2/control03.ctl

$ rm /u01/app/oracle/oradata/orcl2/control01.ctl
$ rm /u01/app/oracle/flash_recovery_area/orcl2/control02.ctl
$ rm /u01/app/oracle/oradata/orcl2/control03.ctl
  1. 메모리를 전부 flush 시킵니다.
alter system flush buffer_cache; 
alter system flush shared_pool;
SYS @ orcl2 > @flush
  1. scott 계정에서 emp 테이블을 select 해봅니다.
  2. 체크포인트를 수동으로 일으킵니다.
SYS> alter system switch logfile;
SYS> alter system checkpoint;
SYS> alter system switch logfile;
  1. shutdown abort
  2. startup ➡️ 에러남! nomount에서 멈출것이다.
Total System Global Area 1489829888 bytes
Fixed Size                  1336624 bytes
Variable Size            1040190160 bytes
Database Buffers          436207616 bytes
Redo Buffers               12095488 bytes
ORA-00205: error in identifying control file, check alert log for more info
  1. 백업받은 control file 복원복구 합니다.
$ cd orcl2_hot2
$ vi cre_control01.sql
:set nu
:37,102 w c10.sql
$ vi c10.sql 해서 아래 이미지처럼 두줄 지우기
SYS> @c10 하면 mount 상태로 올라온다. 
  1. DB올리기 ( ★ 여기서 에러났었는데 확인하기 )
SYS> alter database open; 

에러확인

HOTBACKUP 프로시저 생성하기

1. begin backup 프로시저 생성, 수행

SYS> create or replace procedure begin_backup
is
begin
    for  i in ( select tablespace_name as tname
                           from  dba_tablespaces 
                           where tablespace_name <> 'TEMP') loop
 
  execute immediate  ' alter  tablespace  ' || i.tname || ' begin backup';

   end loop;
end;
/

SYS @ orcl2 > exec begin_backup;
PL/SQL procedure successfully completed.
SYS @ orcl2 > select file#, status from v$backup;

2. end_backup 프로시저 생성, 수행

create or replace procedure end_backup
is
begin
    for  i in ( select tablespace_name as tname
                           from  dba_tablespaces 
                           where tablespace_name <> 'TEMP') loop
 
  execute immediate  ' alter  tablespace  ' || i.tname || ' end backup';

   end loop;
end;
/

SYS @ orcl2 > exec end_backup;
select file#, status from v$backup;
SYS @ orcl2 > save backup.sql
Created file backup.sql
SYS @ orcl2 > @backup

✔️ controlfile, data file이 동시에 손상되었을 때 복구방법

➡️ 백업하기

  1. controlfile을 백업하기

➡️ 손상시키기
2. os에서 controlfile 전부 삭제
3. os에서 system01.dbf, user01.dbf를 삭제
4. 메모리 flush

  1. scott유저로 접속 <- 에러발생

➡️ 복구하기
6. shutdown abort
7. startup <- nomount에서 멈출것임!
8. @i.sql
9. controlfile 생성하는 스크립트를 편집해서 수행하고 controlfile을 생성(mount상태 까지만)
10. @i.sql <- mount인지 확인하기
11. alter database open; <- 에러가 날것이다! alert log를 확인하기
12. backup본인 system01.dbf, users01.dbf를 복원
13. 복구
14. db올리기

실습

✔️ 실습 전 해야할 것
checkpoint를 일으키고

alter system checkpoint;

아카이브 로그파일이 전부 생성되게 합니다.

SYS> alter system archive log current;
SYS> select group#, sequence#, archived from v$log;
    GROUP#  SEQUENCE# ARC
---------- ---------- ---
         1         76 NO
         2         74 YES
         3         75 YES

➡️ 백업하기
1. controlfile을 백업하기

SYS > alter database backup controlfile to trace 
      as '/home/oracle/orcl2_hot2/cre_con02.sql';

➡️ 손상시키기
2. os에서 controlfile 전부 삭제

SYS @ orcl2 > select name from v$controlfile;
/u01/app/oracle/oradata/orcl2/control01.ctl
/u01/app/oracle/flash_recovery_area/orcl2/control02.ctl
/u01/app/oracle/oradata/orcl2/control03.ctl

$ rm /u01/app/oracle/oradata/orcl2/control01.ctl
$ rm /u01/app/oracle/flash_recovery_area/orcl2/control02.ctl
$ rm /u01/app/oracle/oradata/orcl2/control03.ctl

SYS> @ts -- 아마 안될수 있음 위에꺼 날라가서
SYSTEM     /u01/app/oracle/oradata/orcl2/system01.dbf
USERS      /u01/app/oracle/oradata/orcl2/users01.dbf
  1. os에서 system01.dbf, user01.dbf를 삭제
$ rm /u01/app/oracle/oradata/orcl2/system01.dbf
$ rm /u01/app/oracle/oradata/orcl2/users01.dbf
  1. 메모리 flush
SYS> @flush
  1. scott유저로 접속 <- 에러발생

➡️ 복구하기
6. shutdown abort(이미 다운되어있을 것)
7. startup <- nomount에서 멈출것임! (여기부터 alert log 보면서 하기
8. @i.sql <- started로 나와야함

STATUS
------------
STARTED
  1. backup본인 system01.dbf, users01.dbf를 복원(orcl2_hot2에서 실행)
cp system01.dbf /u01/app/oracle/oradata/orcl2/system01.dbf
cp users01.dbf /u01/app/oracle/oradata/orcl2/users01.dbf
  1. controlfile 생성하는 스크립트를 편집해서 수행하고 controlfile을 생성(mount상태 까지만) recover database 전까지. 52~80번까지
$ vi cre_con02.sql
:set nu
:52, 80 w cc2.sql -- 지우기 80이 아닌듯 나는 
:52, 93 w cc1.sql 
SYS @ orcl2 > @ccc.sql
Control file created.
PL/SQL procedure successfully completed.
PL/SQL procedure successfully completed.
  1. @i.sql <- mount인지 확인하기
  2. alter database open; <- 에러가 날것이다! alert log를 확인하기
  3. 복구
SYS> recover database using backup controlfile;
-- 엔터 엔터 치다가 끝까지 엔터를 쳤을 때 복구가 완료되었다고 나오면 잘 된것.
-- 만약 특정 아카이브 로그파일을 못찾는다고 나오면 아직 아카이빌 안된 로그파일을 찾는것이므로, 
해당 시퀀스번호에 해당하는 리두로그파일을 위치와 함께 적어주면 된다. 
-- 복구할 때 찾는 로그 시퀀스 번호의 그룹번호를 확인하고
SYS>  select group#, sequence#, archived from v$log;
    GROUP#  SEQUENCE# ARC
---------- ---------- ---
         1         76 NO
         3         75 NO
         2         74 NO
-- 그 그룹번호의 member가 무엇인지 확인
SYS> select group#, member from v$logfile order by group#;
         1
/u01/app/oracle/oradata/orcl2/redo01b.log
-- 그 멤버를 아래에서 복구할 때 넣어주어야 한다. 

cd /u01/app/oracle/flash_recovery_area/ORCL2/archivelog/2023_10_13/


⭐ 위 주소 넣고 다시 복구해보기 !!!

SYS @ orcl2 > recover database using backup controlfile;
ORA-00279: change 1454085 generated at 10/13/2023 14:26:23 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/flash_recovery_area/ORCL2/archivelog/2023_10_13/o1_mf_1_76_%u_.a
rc
ORA-00280: change 1454085 for thread 1 is in sequence #76

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/oradata/orcl2/redo01b.log
Log applied.
Media recovery complete.
  1. db올리기
SYS> alter database open resetlogs;

⭐resetlogs로 오픈 시키겠다는 얘기는 리두 로그 파일을 다시 초기화하겠다.

  1. temp 테이블 스페이스에 파일을 추가합니다.
SYS @ orcl2 > ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/orcl2/temp01.dbf'
     SIZE 38797312  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;

SYS @ orcl2 >
SYS @ orcl2 > select file_name from dba_temp_files;
FILE_NAME
-----------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl2/temp01.dbf
  1. 다시 전체 백업을 꼭 해야합니다. -> 아래 한번에 돌리는 쉘 있음
--디비를 내리고
SYS> shutdown immediate
--스크립트 돌리기, startup
$ sh coldbackup.sh 
SYS> startup

💡 실행중 에러
1. 아카이브로그 파일 못찾음 아래처럼 뜨는데 경로 찾아서 들어가서 진짜 없는지 확인해보자.

cannot open archived log
sequence #40 ...
SYS> @/home/oracle/logfile.sql
SYS> select group#, sequence#, archived from v$log;
    GROUP#  SEQUENCE# ARC
---------- ---------- ---
         1         73 YES
         2         74 NO
         3         72 YES
SYS> recover database using backup controlfile;
SYS> alter database open resetlogs; --redo log file에 변경사항 적어놨던거 초기화
SYS> select group#, status from v$log;

sys에 접속이 안되면
ps -ef | grep pmon 해서 orcl2의 pmon을 죽이기

💡 사용자 관리 복구 방법 스크립트

set lines 5000
select 'cp ' || FILE_NAME || ' /home/oracle/coldbackup_orcl2'|| substr(file_name,instr(file_name,'/',-1)) from dba_data_files; SYS> select 'cp ' || member || ' /home/oracle/coldbackup_orcl2'|| substr(member,instr(member,'/',-1)) from v$logfile;

💡 cold backup (vi full.sh)

주소만 반대로 해서 복구하는것도 만들기

sqlplus -s "/ as sysdba" << EOF

set long 50000
set lines 30000
set pages 5000
set linesize 30000
set trimspool on
set head off
set feedback off
spool on
spool cold.sh

select 'cp -b ' || FILE_NAME || ' /home/oracle/coldbackup2_orcl2'|| substr(file_name,instr(file_name,'/',-1))
from dba_data_files;

select 'cp -b ' || FILE_NAME || ' /home/oracle/coldbackup2_orcl2'|| substr(file_name,instr(file_name,'/',-1))
from dba_temp_files;

select 'cp -b ' || NAME || ' /home/oracle/coldbackup2_orcl2'|| substr(name,instr(name,'/',-1))
from v\$controlfile;

select 'cp -b ' || member || ' /home/oracle/coldbackup2_orcl2'|| substr(member,instr(member,'/',-1))
from v\$logfile;

spool off

shutdown immediate

!sh cold.sh

startup
EOF

✔️ 백업본이 없는 datafile이 손상되었을 때 사용자관리 복구방법

💡 전제조건: 반드시 아카이브 모드여야지만 가능합니다.

1) create tablespace users27 datafile ‘/경로/users27.dbf’size 1m; -> temp ta

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

2) conn scott/tiger
3) emp27 table 만들기

create table emp27
(empno number(10),
ename char(20))
tablespace users27;

4) insert into emp27 values(1, 'ann');
5) commit;
6) alter system switch logfile;
7) 4) ~ 6)을 3번 반복 -> 아카이브 로그 파일 생성되도록 하는것임!
8) shutdown immediate
9) os에서 users27.dbf를 삭제 (지금 위에서 백업한적 없어서 백업본이 없다!)

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

10) startup -> datafile없어서 디비 안올라옴

ORA-01157: cannot identify/lock data file 13 - see DBWR trace file
ORA-01110: data file 13: '/u01/app/oracle/oradata/orcl2/users27.dbf'

11) select * from v$recover_file; -> 복구해야할 파일 번호 확인하기

SYS> select * from v$recover_file;
13 ONLINE  ONLINE
FILE NOT FOUND 

12) 아래처럼 하면 빈 껍데기 파일이 생성된다.

 alter database create
     datafile '/u01/app/oracle/oradata/orcl2/users27.dbf' as 
              '/u01/app/oracle/oradata/orcl2/users27b.dbf';

13) select * from v$recover_file;
14) 일단 DB를 open시키기 위해 문제가된 해당 데이터파일을 offline 시킨다.

alter database datafile '/u01/app/oracle/oradata/orcl2/users27.dbf/users27b.dbf' offline;

15) alter database open;
16) 테이블 스페이스 레벨로 복구

recover tablespace users27;

17) 온라인시킨다

 alter database datafile '/u01/app/oracle/oradata/orcl2/users27b.dbf' online;

18) scott에서 select해보기

select * from emp27;

문제 테이블 스페이스를 users28로 해서 다시 수행하는데 db를 내리지 말고 open상태에서 복구하기

1) create tablespace users28 datafile '/경로/users28.dbf' size 10m; -> temp ta

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

2) conn scott/tiger
3) emp28 table 만들기

create table emp28
(empno number(10),
ename char(20))
tablespace users28;

4) insert into emp28 values(1, 'ann');
5) commit;
6) alter system switch logfile;
7) 4) ~ 6)을 3번 반복 -> 아카이브 로그 파일 생성되도록 하는것임!
9) os에서 users28.dbf를 삭제 (지금 위에서 백업한적 없어서 백업본이 없다!)

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

11) select * from v$recover_file;

SYS> select * from v$recover_file;
no row selects

12) 아래처럼 하면 빈 껍데기 파일이 생성된다. --여기부터 에러. 참고만하고 아래 확인

 alter database create
     datafile '/u01/app/oracle/oradata/orcl2/users28.dbf' as 
              '/u01/app/oracle/oradata/orcl2/users28b.dbf';
ERROR at line 1:
ORA-01182: cannot create database file 14 - file is in use or recovery
ORA-01110: data file 14: '/u01/app/oracle/oradata/orcl2/users28.dbf'
★ 계속 에러가 났다 !!!!!!!!!!!!!!!!!!!              

13) select * from v$recover_file; -> no row selects
14) 일단 DB를 open시키기 위해 문제가된 해당 데이터파일을 offline 시킨다.

alter database datafile '/u01/app/oracle/oradata/orcl2/users28.dbf' offline;

16) 테이블 스페이스 레벨로 복구

recover tablespace users28;

17) 온라인시킨다

 alter database datafile '/u01/app/oracle/oradata/orcl2/users28b.dbf' online;

18) scott에서 select해보기

select * from emp28;

빈껍데기가 생성이 안되어서 테이블스페이스 단위로 offline 시키고 진행했다.
1. tablespace단위로 offline
2. 빈껍데기 만들기
3. offline시킨거 online
4. emp28 select

SYS @ orcl2 > alter tablespace users28 offline immediate;

Tablespace altered.

SYS @ orcl2 >  alter database create datafile '/u01/app/oracle/oradata/orcl2/users28.dbf' as
  2   '/u01/app/oracle/oradata/orcl2/users28bb.dbf';

Database altered.

SYS @ orcl2 > recover tablespace users28;
ORA-00279: change 1463530 generated at 10/13/2023 16:06:18 needed for thread 1
ORA-00289: suggestion :
/u01/app/oracle/flash_recovery_area/ORCL2/archivelog/2023_10_13/o1_mf_1_5_llkv4l
37_.arc
ORA-00280: change 1463530 for thread 1 is in sequence #5


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}

Log applied.
Media recovery complete.
SYS @ orcl2 >
SYS @ orcl2 >
SYS @ orcl2 > connect scott/tiger
Connected.
SCOTT @ orcl2 >
SCOTT @ orcl2 > select * from emp28;
select * from emp28
              *
ERROR at line 1:
ORA-00376: file 14 cannot be read at this time
ORA-01110: data file 14: '/u01/app/oracle/oradata/orcl2/users28bb.dbf'


SCOTT @ orcl2 > connect /as sysdba
Connected.
SYS @ orcl2 >
SYS @ orcl2 > alter tablespace users28 online;

Tablespace altered.

SYS @ orcl2 > connect scott/tiger
Connected.
SCOTT @ orcl2 >
SCOTT @ orcl2 > select * from emp28;

     EMPNO ENAME
---------- --------------------
         1 ann
         1 ann
         1 ann

💡위 실습은 이미 shutdown 상태여서 테이블스페이스 레벨로 offline 안해도됨

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으로 핫백업 하기(전체)

1. recovery catalog를 사용한 알맨으로 접속합니다.

$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3

2. hot backup -> 사용자관리는 begin, cp하고 end백업 다 했는데 이거는 이렇게만 하면 됨

rman> backup database include current controlfile;

✔️ RMAN으로 핫백업 하기(특정ts)

문제 사이즈 5m로 ts701 이라는 tablespace를 생성하고, rman으로 백업하시오!

1. ts701 만들기

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

2. rman으로 ts701만 hot backup

$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
rman> backup tablespace ts701;
or
rman> report schema; -- 해서 데이터 파일번호 알아내고
rman> backup datafile 데이터파일번호;
or
rman> report need backup; -- 백업이 필요한거 알려줘 !
rman> backup datafile 11;

✔️ RMAN으로 cold backup

SYS> shutdown immediate
SYS> startup mount -- rman은 mount로 열려는 있어야한다. 사용자관리 백업은 아예 내려가져있는 상태에서 했다. 
$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
rman> backup database include current controlfile;

⭐ redo log file은 rman이 백업 안받는다. 리두로그파일은 백업본이 없어도 복구가 가능하기 때문임!

✔️ RMAN으로 db가 open되지 않은 상태에서 복구 (system 파일이 손상)

  1. os에서 system01.dbf를 삭제
$ rm /u01/app/oracle/oradata/orcl2/system01.dbf
  1. scott으로 접속
  2. shutdown abort
  3. startup mount
  4. rman 접속
$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
  1. system datafile 복원하기
RMAN> restore datafile 1;
or
RMAN> restore tablespace system;
RMAN> recover tablespace system;
  1. db올리기
alter database open;
  1. scott에서 select
SCOTT> select * from emp;

문제 undotbs01.dbf 삭제하고 알맨으로 복구

  1. os에서 undotbs01.dbf를 삭제
$ rm /u01/app/oracle/oradata/orcl2/undotbs01.dbf
  1. scott으로 접속
  2. shutdown abort
  3. startup mount
  4. rman 접속
$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
  1. system datafile 복원하기
RMAN> restore datafile 3;
or
RMAN> restore tablespace system;
  1. recover
RMAN> recover datafile 3;
  1. db올리기
alter database open;
  1. scott에서 select
SCOTT> select * from emp;

✔️ db가 open된 상태에서 복구 (non system 파일이 손상)

  1. ts401이라는 테이블 스페이스를 사이즈 5m로 생성합니다.
SYS> create tablespace ts401 
      datafile '/u01/app/oracle/oradata/orcl2/ts401.dbf'size 5m;
  1. scott에서 ts401 테이블 스페이스 emp401을 생성하는데 emp와 똑같은 데이터로 생성
create table emp401
tablespace ts401 
 as 
 select * from emp;
  1. ts401 테이블 스페이스를 알맨으로 hot backup 받습니다.
RMAN> backup tablespace ts401;
  1. 로그스위치를 3번 일으킨다.
SYS> alter system switch logfile;
SYS> alter system switch logfile;
SYS> alter system switch logfile;
  1. os에서 ts401.dbf를 삭제하기
$ rm /u01/app/oracle/oradata/orcl2/ts401.dbf
  1. 메모리를 flush 시키기
  2. scott에서 emp401을 select 해보기 <- 에러가 날것이다!
  3. rman접속
$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
  1. tablespace를 오프라인하고 복원복구 합니다
RMAN> sql "alter tablespace ts401 offline immediate";
RMAN> restore tablespace ts401;
RMAN> recover tablespace ts401;
RMAN> sql "alter tablespace ts401 online";
  1. scott에서 emp401을 select해보기!

오늘의 마지막 문제! 다음의 4개 파일을 깨트리고 알맨으로 복구하기
1. system01.dbf -mount
2. undotbs01.dbf -mount
3. users01.dbf -open
4. ts401.dbf -open 상태에서 하는게 권장이지만 그냥 mount상태에서 하는것도 무관
✅ system 파일 : system ts, undo ts얘네는 db가 오픈되지 않은 상태에서 복구해야한다. 그렇지만 users, example ... 들은 서비스가 운영중일 때 (디비가 올라와져있을 때) 복구를 해야한다.
: 그러므로 마운트단계에서 진행하기 !

1. rm으로 위 파일들 다 지우기

$ rm /u01/app/oracle/oradata/orcl2/system01.dbf
$ rm /u01/app/oracle/oradata/orcl2/undotbs01.dbf
$ rm /u01/app/oracle/oradata/orcl2/users01.dbf
$ rm /u01/app/oracle/oradata/orcl2/ts401.dbf

2. scott으로 접속

3. shutdown abort
4. startup mount

SYS @ orcl2 > select file# from v$recover_file;
     FILE#
----------
         1
         3
         4
        16

5. rman 접속

$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
RMAN> report schema;
Report of database schema for database with db_unique_name ORCL2
List of Permanent Datafiles
===========================
File Size(MB) Tablespace           RB segs Datafile Name
---- -------- -------------------- ------- ------------------------
1    740      SYSTEM               YES     /u01/app/oracle/oradata/orcl2/system01.dbf
2    570      SYSAUX               NO      /u01/app/oracle/oradata/orcl2/sysaux01.dbf
3    565      UNDOTBS1             YES     /u01/app/oracle/oradata/orcl2/undotbs01.dbf
4    156      USERS                NO      /u01/app/oracle/oradata/orcl2/users01.dbf
5    100      EXAMPLE              NO      /u01/app/oracle/oradata/orcl2/example01.dbf
6    5        TS100                NO      /home/oracle/ts100.dbf
7    5        TSYSH                NO      /home/oracle/tsysh.dbf
8    10       TS2000               NO      /u01/app/oracle/oradata/orcl2/ts2000.dbf
9    10       TS3000               NO      /u01/app/oracle/oradata/orcl2/ts3000.dbf
10   20       TS01                 NO      /home/oracle/ysh/ts01.dbf
11   5        TS500                NO      /home/oracle/ts500.dbf
12   10       TS5001               NO      /u01/app/oracle/oradata/orcl2/ts5001.dbf
13   10       USERS27              NO      /u01/app/oracle/oradata/orcl2/users27b.dbf
14   10       USERS28              NO      /u01/app/oracle/oradata/orcl2/users28bb.dbf
15   5        TS701                NO      /u01/app/oracle/oradata/orcl2/ts701.dbf
16   5        TS401                NO      /u01/app/oracle/oradata/orcl2/ts401.dbf

6. 4개 다 복원하기

RMAN> restore datafile 1;
or
RMAN> restore tablespace system;
RMAN> restore datafile 1,3,4,16;

7. recover

RMAN> recover datafile 1,3,4,16;

8. db올리기

alter database open;

9. scott에서 select

SCOTT> select * from emp;

profile
Slow and steady wins the race.

0개의 댓글