백업
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이 손상되었을 때 복구방법
recovery
라고 한다. (저번시간에 사용자관리로 해봄) 알맨으로 해보자!!실습
- 아카이브 모드인지 확인한다. (아카이브 모드에서만 가능)
- ts200 이라는 tablespace생성
create tablespace ts200 datafile '/home/oracle/ts200.dbf' size 20m;
- scott유저에서 emp200 테이블을 ts200 tablespace에 생성한다.
create table emp200 ( empno number(10), ename varchar2(20) ) tablespace ts200;
- emp200에 data insert한다.
insert into emp200 values(1111,'aaa');
- commit;
- 로그 스위치를 일으킨다.
SYS @ orcl2 > grant alter system to scott; SCOTT> alter system switch logfile;
- 4 ~ 6 번 작업을 3번 반복한다.
- checkpoint를 수동으로 일으킨다.
alter system checkpoint;
- shutdown abort
- os에서 ts200.dbf를 삭제한다.
[orcl2:~]$ rm ts200.dbf
- startup
ORA-01157: cannot identify/lock data file 17 - see DBWR trace file ORA-01110: data file 17: '/home/oracle/ts200.dbf'
- 알맨으로 복원해야할 데이터 파일 복원
$ 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
- db를 오픈한다.
SYS @ orcl2 > alter database open;
- 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;
RMAN> backup tablespace ts301;
Finished Control File and SPFILE Autobackup at 2023/10/16:10:20:18
create table emp302
( empno number(10),
ename varchar2(20) )
tablespace ts302;
insert into emp302 values(1111,'aaa');
commit;
alter system switch logfile;
alter system checkpoint;
ORA-01157: cannot identify/lock data file 18 - see DBWR trace file
ORA-01110: data file 18: '/home/oracle/ts301.dbf'
[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
restore datafile 18;
recover datafile 18;
restore datafile 19;
recover datafile 19;
- data file
- system data file
- non system data file
- temp file
- 인덱스 테이블 스페이스의 data file이 손상되었을때
- control file
- redo log file
- parameter file
- password file
💡temp file의 용도는, 임시로 데이터를 보관하는 공간!
- order by (정렬 작업)
- create index (정렬 작업)
- with절
- 기타 정렬작업 (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가 없는것은 아니다. 정렬이 일어나지 않아서 없어보이는 것
💡 오라클에서 권장하는 데이터 저장 방법
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가 한군데에 몰리는 것 보다 성능이 좋아진다.
: 테이블은 있으니까 인덱스 스페이스 그냥 재생성 하면 된다!
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 backupSYS> 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
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;
- os에서 spfile을 삭제합니다.
$ cd $ORACLE_HOME/dbs $ rm spfileorcl2.ora
- 지금 당장은 문제가 없지만 앞으로 db를 올렸다 올릴때 spfile로 인스턴스를 구성하지 못한다. 또 alter system 명령어로 spfile안의 파라미터를 변경할 수도 없습니다.
- db shutdown immediate
- 기존 pfile로 spfile 생성하기
create spfile from pfile;
- 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
RMAN> backup spfile;
- DB의 ID확인
SYS> select dbid from v$database; DBID ---------- 1130331177
- os에서 spfile, pfile을 둘다 삭제
$ rm $ORACLE_HOME/dbs/spfileorcl2.ora $ rm $ORACLE_HOME/dbs/initorcl2.ora
- shutdown abort
- 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'
- rman 접속!!
[orcl2:~]$ rman target sys/oracle@orcl2 catalog rc_user/rc_user@orcl3 -- 접속안댐
- 다음과 같이 rman으로 접속 (shutdown된 상태에서 접속)
[orcl2:~]$ rman target / nocatalog
- 가상으로 오라클을 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
- 위 작업이 에러난다면?
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의 역할
: 원격에서 리스너를 통해 sys 유저로 접속을 하기 위한 파일
- 리스너가 정상인지 확인
확인해야 하는 내용 3가지$ lsnrctl status
- host이름 : edydr1p0.us.oracle.com
- 포트번호 : 1521
- 서비스 이름 : orcl2
- 리스너 통해서 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명을 넘기지 못한다.
➡️ 장애(failure)가 나기전에 마지막 commit 시점으로 복구하는것
➡️ 과거의 특정 시점으로 복구하는것
* time base 불완전 복구 : 특정시간으로 db를 되돌리는 것
- 사용자 관리 불완전 복구
- 알맨을 이용한 불완전 복구
* cancel base 불완전 복구 : 과거로 db를 되돌리는데 복원 파일에 아카이브 로그 파일을 적용하다가
끝까지 적용하지 않고 cancle을 해서 과거로 되돌린다.
- 아래의 테이블 스페이스만 두고 나머지는 모두 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;
- ts01 테이블 스페이스를 생성
SYS> create tablespace ts01 datafile '/u01/app/oracle/oradata/orcl2/ts01.dbf' size 20m;
- cold backup 을 수행한다.
SQL> shutdown immediate $ mkdir coldbackup2 $ cp /u01/app/oracle/oradata/orcl2/*.dbf /home/oracle/coldbackup2/ SQL> startup
- 로그 스위치를 5번 수행한다.
alter system switch logfile;
- 체크 포인트도 일으킨다.
alter system checkpoint;
- scott 으로 접속해서 현재 시간을 확인한다.
alter session set nls_date_format='RRRR/MM/DD:HH24:MI:SS'; select sysdate from dual; SYSDATE ------------------- 2023/10/17:10:13:10 <--------- 시간을 따로 잘 적어둔다.
- 로그 스위치를 3번 일으키고 체크포인트를 일으킨다.
alter system switch logfile; alter system checkpoint;
- sh 계정의 sales 테이블을 drop 하시오 !
drop table sh.sales purge; ↑ 휴지통에 넣지말고 삭제
- 불완전 복구 수행
shutdown immediate
기존 원본 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/
- startup mount , select name from v$datafile;
- alter session set nls_date_format='RRRR/MM/DD:HH24:MI:SS';
- 복구할 때 아카이브 로그파일 적용하는거 안물어보고 자동으로 다 적용되게끔 아래 키고
SYS> set autorecovery on
- 복구
SYS> recover database until time '2023/10/17:10:13:04';
✅ 위에서 확인했던 시간에서 한 5~6초전으로 적는다.
14. 리두로그파일 초기화SYS> alter database open resetlogs ;
- 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
- 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 backupSYS> alter tablespace indx432 begin backup; SYS> select * from v$backup;
- /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
- end backup
SYS> alter tablespace indx432 end backup; SYS @ orcl2 > select * from v$backup;
사용자 관리 복구 방법으로 spfile 복구
- 파라미터 파일 깨트리기
$ cd $ORACLE_HOME/dbs $ rm spfileorcl2.ora
- db shutdown immediate
- 기존 pfile로 spfile 생성하기
create spfile from pfile;
- os에서 spfile이 잘 생성되었는지 확인
[orcl2:dbs]$ ls -l spfile*
사용자 관리 복구 방법으로 인덱스 테이블스페이스 복구
- 삭제하기
$ rm /u01/app/oracle/oradata/orcl2/indx432.dbf
- 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
- indx432를 offline시키기
SYS> alter tablespace indx432 offline immediate;
- 복원하기
$ cp /home/oracle/orcl2_hot/indx432.dbf /u01/app/oracle/oradata/orcl2/indx432.dbf
- 복구하기
SYS @ orcl2 > recover tablespace indx432; Media recovery complete.
- indx432를 online
SYS> alter tablespace indx432 online;
- 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 upORA-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지웠다.. 백업 안했ㅇㅁ