➡️ 어제 우리 마지막문제 실습하다가 블록이 깨져있었다. 그래서 오늘 실습때도 깨져서 복구 못할 가능성이 있으니, redo file까지 백업 받은 후에 실습 시작함!
💡 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
💡 사용자 관리 복구 2가지가 있다.
1. system file이 깨졌을때의 복구 ➡️DB mount 상태
에서 복구 가능
(system tablespace, undo tablespace)
2. non system file이 깨졌을 때의 복구 ➡️DB mount / open 상태
에서 복구 가능
✔️ 가급적 디비가 open 상태에서 복구할 수 있어야 운영이 되니까 좋긴하지만 1번이 깨진것은 어쩔수가 없다.
✅ 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;
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이 손상되었을 때 복구방법
- binary file 형태로 백업
- 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';
순서
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하는것까지 모두 있다.
실습과정
- controlfile을 두가지 방법으로 백업받습니다. (위에서했음)
- 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
- 메모리를 전부 flush 시킵니다.
alter system flush buffer_cache; alter system flush shared_pool; SYS @ orcl2 > @flush
- scott 계정에서 emp 테이블을 select 해봅니다.
- 체크포인트를 수동으로 일으킵니다.
SYS> alter system switch logfile; SYS> alter system checkpoint; SYS> alter system switch logfile;
- shutdown abort
- 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
- 백업받은 control file 복원복구 합니다.
$ cd orcl2_hot2 $ vi cre_control01.sql :set nu :37,102 w c10.sql $ vi c10.sql 해서 아래 이미지처럼 두줄 지우기 SYS> @c10 하면 mount 상태로 올라온다.
- DB올리기 ( ★ 여기서 에러났었는데 확인하기 )
SYS> alter database open;
에러확인
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을 백업하기
➡️ 손상시키기
2. os에서 controlfile 전부 삭제
3. os에서 system01.dbf, user01.dbf를 삭제
4. 메모리 flush
- 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
- os에서 system01.dbf, user01.dbf를 삭제
$ rm /u01/app/oracle/oradata/orcl2/system01.dbf $ rm /u01/app/oracle/oradata/orcl2/users01.dbf
- 메모리 flush
SYS> @flush
- scott유저로 접속 <- 에러발생
➡️ 복구하기
6. shutdown abort(이미 다운되어있을 것)
7. startup <- nomount에서 멈출것임! (여기부터 alert log 보면서 하기
8. @i.sql <- started로 나와야함STATUS ------------ STARTED
- 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
- 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.
- @i.sql <- mount인지 확인하기
- alter database open; <- 에러가 날것이다! alert log를 확인하기
- 복구
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.
- db올리기
SYS> alter database open resetlogs;
⭐resetlogs로 오픈 시키겠다는 얘기는 리두 로그 파일을 다시 초기화하겠다.
- 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
- 다시 전체 백업을 꼭 해야합니다. -> 아래 한번에 돌리는 쉘 있음
--디비를 내리고 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;
주소만 반대로 해서 복구하는것도 만들기
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
💡 전제조건: 반드시 아카이브 모드여야지만 가능합니다.
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 안해도됨
백업
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이 손상되었을 때 복구방법
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;
문제
사이즈 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;
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이 백업 안받는다. 리두로그파일은 백업본이 없어도 복구가 가능하기 때문임!
- os에서 system01.dbf를 삭제
$ rm /u01/app/oracle/oradata/orcl2/system01.dbf
- scott으로 접속
- shutdown abort
- startup mount
- rman 접속
$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
- system datafile 복원하기
RMAN> restore datafile 1; or RMAN> restore tablespace system;
RMAN> recover tablespace system;
- db올리기
alter database open;
- scott에서 select
SCOTT> select * from emp;
문제
undotbs01.dbf 삭제하고 알맨으로 복구
- os에서 undotbs01.dbf를 삭제
$ rm /u01/app/oracle/oradata/orcl2/undotbs01.dbf
- scott으로 접속
- shutdown abort
- startup mount
- rman 접속
$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
- system datafile 복원하기
RMAN> restore datafile 3; or RMAN> restore tablespace system;
- recover
RMAN> recover datafile 3;
- db올리기
alter database open;
- scott에서 select
SCOTT> select * from emp;
- ts401이라는 테이블 스페이스를 사이즈 5m로 생성합니다.
SYS> create tablespace ts401 datafile '/u01/app/oracle/oradata/orcl2/ts401.dbf'size 5m;
- scott에서 ts401 테이블 스페이스 emp401을 생성하는데 emp와 똑같은 데이터로 생성
create table emp401 tablespace ts401 as select * from emp;
- ts401 테이블 스페이스를 알맨으로 hot backup 받습니다.
RMAN> backup tablespace ts401;
- 로그스위치를 3번 일으킨다.
SYS> alter system switch logfile; SYS> alter system switch logfile; SYS> alter system switch logfile;
- os에서 ts401.dbf를 삭제하기
$ rm /u01/app/oracle/oradata/orcl2/ts401.dbf
- 메모리를 flush 시키기
- scott에서 emp401을 select 해보기 <- 에러가 날것이다!
- rman접속
$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3
- tablespace를 오프라인하고 복원복구 합니다
RMAN> sql "alter tablespace ts401 offline immediate"; RMAN> restore tablespace ts401; RMAN> recover tablespace ts401; RMAN> sql "alter tablespace ts401 online";
- 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 mountSYS @ 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;