cold backup
cp -R /oracle/oradata/ORA19C/* /backup/close/
no archive log mode 로 변경
SQL> startup mount
SQL> alter databse noarchivelog
SQL> alter database open;
SQL> archive log list
기존 archive 파일 삭제
cd /archive
rm -rf *.dbf
현재 tablespace 조회
user01 데이터 날리기
SQL> shutdown immediate
rm -rf users01.dbf
복구
SQL> startup
datafile restore
cd /backup/close
cp users01.dbf /oracle/oradata/ORA19C
SQL> select * from v$recover_file;
SQL> recover databse;
oracle 에서 절대적으로 지켜야 하는 원칙
파일 I/O 발생 시에 절대 데이터 이동, 복사 복구 작업을 해서는 안됨
따라서 복구 할 때는 해당 파일에 I/O 가 발생하지 않도록 하고 진행해야 함
그래서 복구할 때 데이터 파일의 I/O 를 일어나지 않게 만들 수 있냐 없냐에 따라 DB 를 open 시킨 상태에서 복구를 할 수 있는지 없는지 결정됨
해당 데이터 파일에 I/O 일어나지 않게 하려면 offline 이나 shutdown 필수
SQL> shutdown immediate
startup mount
alter database archivelog;
alter database open;
open backup
SQL> alter tablespace yejin begin backup;
SQL> !cp /oracle/oradata/ORA19C/jin01.dbf /backup/open/
SQL> alter tablespace yejin end backup;
장애 발생 -> 데이터파일 유실
rm -rf jin01.dbf
yejin 유저로 접속 테이블 생성 후 데이터 추가해보기
데이터 파일이 존재하지 않아 오류 발생
테이블은 왜 만들어지는가
해당 파라미터가 true 이면 첫 번째 행이 테이블에 삽입될 때까지 테이블 및 해당 종속 객체(LOB, 인덱스)에 대한 세그먼트가 생성되지 않음
SQL> alter database datafile '/oracle/oradata/ORA19C/jin01.dbf' offline;
cd /backup/open
cp test01.dbf /oracle/oradata/ORA19C/
데이터 파일 online 시도
SQL> alter database datafile '/oracle/oradata/ORA19C/test01.dbf' online;
recover 해주기
온라인 시키기
alter table space yejin online;
SQL> conn yejin/yejin
select * from tab;
select * from abc;
insert into abc values(1);
commit;
sqlplus / as sysdba
SQL> alter system switch logfile;
여러 번 수행
온라인 백업: 백업 시점 test user 의 테이블 잘보기 (abc 테이블에 값이 2개
온라인 백업
백업 후 중간 데이터 삽입
장애 발생
rm -rf jin01.dbf
복구
데이터 파일 오프라인 후 복구
복구 확인 (아카이브 로그로 중간 데이터도 복구)
SQL> conn yejin/yejin
SQL> select * from tab;
SQL> select * from abc;
오프라인 안되는 테이블스페이스
온라인 백업 /backup/open 디렉토리 비우기
장애 발생
rm system01.dbf
복구
system 테이블 스페이스와 데이터파일은 offline 되지 않으므로 shutdown 후 복구
SQL> shutdown abort
cp /backup/open/system01.dbf /oracle/oradata/ORA19C/
SQL> startup
SQL> recover database;
SQL> alter database open;
SQL> select * from test1;
불완전 복구란 장애가 발생했을 경우 현재시점까지 전부 복구하는 것이 아니라 과거의 특정 시점까지만 복구하는 것임
Data file 을 과거 백업 본으로 전부 복원하고, archive log 파일을 적용 시켜 장애 직전 시점까지 복구하는 것
data file 은 사고 시점 이전 백업파일로부터 복원하고, redo log와 control file은 현재 시점의 것을 사용해야 함
테이블 확인
col ts_name for a20
col file_name for a40
select a.name "TS_NAME", b.name "FILE_NAME", b.bytes/1024/1024 MB, b.status
from v$tablespace a, v$datafile b
where a.ts#=b.ts#;
SQL> create user test identified by test default tablespace test;
SQL> grant connect, resource to test;
DB 내리기
SQL> shutdown immediate
close backup
cp -R /oracle/oradata/ORA19C/* /backup/close/
test01 테이블 없는 상태의 백업본임
장애 발생시키기
현재 시간 조회
select to_char(sysdate,'YYYY-MM-DD:HH24:MI:SS') from dual;
테이블 생성 후 값 추가
SQL> create table test.test01(no number, hdate date);
insert into test.test01 values(1, sysdate);
insert into test.test01 values(2, sysdate);
insert into test.test01 values(3, sysdate);
테스트 유저로 접속하고 데이터 확인
테스트 유저로 데이터 넣기
SQL> shutdown immediate
cp -R /oracle/oradata/ORA19C/* /backup/close/
이걸 왜 또 하지..? 강사님은 데이터를 만들기 전 받아둔 백업본을 이용한다 하셧는데.. 왓..
drop table test.test01;
select 문으로 조회하면 당연히 오류남
shutdown immediate
cp /backup/close/*.dbf /oracle/oradata/ORA19C
restore 함
3번째 데이터까지 복구해보기
SQL> startup mount
SQL> alter session set nls_date_format='yyyy-mm-dd:hh24:mi:ss';
SQL> recover database until time '2023-10-26:21:16:01';
SQL> alter database open resetlogs;
복구 확인
SQL> select no, to_char(hdate, 'YYYY-MM-DD:HH24:MI:SS') from test.test01;
3번째 데이터 까지만 나와야하는데 5번째 데이터 까지 다 복구됨..
강사님은 잘되셨는데 왜... 안되는지.. 모르겠음