select a.name, a.checkpoint_change#, b.status, b.change#, to_timestamp(b.time)
from v$datafile a, v$backup b
where a.file# = b.file#;
select a.group#,a.sequence#,b.member,a.status, first_change#, next_change#
from v$log a , v$logfile b
where a.group#=b.group#;
select sequence#,name, first_change#, next_change# from v$archived_log;





- examplie 테이블스페이스 데이터 파일이 존재하지 않기 때문에 오류발생
select a.file#, b.name ,a.name, a.status, a.checkpoint_change#
from v$datafile a, v$tablespace b
where a.ts# = b.ts#;

alter tablespace 테이블스페이스이름 offline [normal | temporary | immediate]
noraml : 체크포인트 발생
temporary : 체크포인트 발생 할거는 하고 하지 말거는 하지말고
immediate : 체크포인트 발생하지 않음
alter tablespace example offline immediate;





SHUTDOWN IMMEDIATE










SHUTDOWN IMMEDIATE











select a.name, a.checkpoint_change#, b.status, b.change#, b.time
from v$datafile a, v$backup b
where a.file# = b.file#;












ALTER DATABASE CREATE DATAFILE 기존위치 as 새로운위치;
ALTER DATABASE CREATE DATAFILE '$ORACLE_BASE/oradata/ORA19C/data_tbs01.dbf' as 'home/oracle/data_tbs01.dbf';

테이블스페이스 레벨로 백업 시작
ALTER TABLESPACE 테이블스페이스명 BEGIN BACKUP;

백업 시킬 데이터파일 copy

백업 종료
ALTER TABLESPACE 테이블스페이스명 END BACKUP;

갱신된 백업 뷰 확인

alter database backup controlfile to 저장위치;

특정한 데이터 파일 삭제로 장애 유발

DB SHUTDOWN IMMEDIATE 시도
- 세션 끊김

세션 재 연결 후 DB STARTUP 시도

손상된 데이터 파일 확인
SELECT * FROM v$recover_file;

손상된 데이터파일 offline 변경 후 DB OPEN
- archive log 모드이기 때문에 offline만 입력해도 된다.



백업 이후에 변경 redo 적용

복구 완료된 테이블스페이스를 online으로 변경

alter tablespace data_tbs add datafile '/u01/app/oracle/oradata/ORA19C/data_tbs02.dbf' size 5m;
select a.file#, b.name ,a.name, a.status, a.checkpoint_change#
from v$datafile a, v$tablespace b
where a.ts# = b.ts#;

SELECT a.tablespace_name,
b.file_name,
b.bytes/1024/1024 as "Total Size MB",
(b.bytes - c.free_byte)/1024/1024 as "Used Size MB",
c.free_byte/1024/1024 as "Free Size MB",
b.autoextensible
FROM dba_tablespaces a, dba_data_Files b,
(SELECT tablespace_name, file_id, sum(bytes) AS free_byte
FROM dba_free_space
GROUP BY tablespace_name, file_id) c
WHERE a.tablespace_name = b.tablespace_name
AND a.tablespace_name = c.tablespace_name
AND b.file_id = c.file_id;

create table hr.emp_2024
tablespace data_tbs as
select * from hr.employees;
select f.tablespace_name, f.file_name
from dba_extents e, dba_data_files f
where f.file_id = e.file_id
and e.segment_name = 'EMP_2024'
and e.owner = 'HR';

대용량 데이터 삽입

테이블스페이스 데이터파일 사용 공간 확인
select f.tablespace_name, f.file_name,count(*)
from dba_extents e, dba_data_files f
where f.file_id = e.file_id
and e.segment_name = 'EMP_2024'
and e.owner = 'HR'
group by f.tablespace_name, f.file_name;


- 특정 테이블 스페이스만 백업

- 백업 확인


create table hr.dept_2024 tablespace data_tbs as select * from hr.departments;

특정 데이터파일 삭제로 장애유발

테이블스페이스에 속한 데이터파일을 offline으로 수행하되 가능한 데이터파일은 체크포인트 발생하고 문제되는 데이터파일은 체크포인트 발생하지 않겠다.
alter tablespace data_tbs offline temporary;

데이터파일 상태 확인

문제되는 데이터파일의 가장 최근에 백업본을 찾아 restore

백업 이후에 변경된 redo 적용
RECOVER TABLESPACE data_tbs;
- 특정 데이터파일만 삭제되었다고, 그 데이터파일만 recover 하면 안되는 이유가 해당 테이블스페이스가 가지고 있는 전체 데이터파일의 checkpoint를 맞춰줘야 하기 때문이다. datafile 레벨로 recover을 하게 되면 같은 테이블스페이스내의 다른 datafile과 checkpoint가 맞지 않을 수 있다.


create table hr.loc_2024 tablespace data_tbs as select * from hr.locations;

특정 데이터파일 삭제로 장애유발

데이터파일 상태 확인


문제되는 데이터파일의 가장 최근에 백업본을 찾아 restore

백업 이후에 변경된 redo 적용
아카이브 로그 파일이 있기 때문에 AUTO
MOUNT 단계에서 RECOVER 할때는 ALTER DATABASE RECOVER 로 시작하고 DB OPEN 시점에는 RECVOER로만 하면 된다.
RECOVER DATAFILE 8;


select a.file#, b.name ,a.name, a.status, a.checkpoint_change#
from v$datafile a, v$tablespace b
where a.ts# = b.ts#;

시스템 데이터 파일 삭제로 장애유발

체크포인트 유발
- 데이터를 내릴 데이터파일이 없기때문에 오류 발생하면서 세션 끊김

DB STARTUP 후 오류 발생
- MOUNT 단계 까지 실행된다.

가장 최근에 백업 받아놓은 시스템 데이터 파일을 원래위치로 restore

REDO 정보를 이용하여 RECOVER 후 DB OPEN

모든 데이터파일 삭제로 장애 유발

세션 끊긴 후 DB 재 시작
- MOUNT 단계 까지 실행되고 오류 발생
- RECOVER 해야 하는 데이터 파일 확인


문제되는 데이터파일들의 가장 최근의 백업본 찾아 restore

백업 이후에 redo 적용
- 데이터파일 하나하나 recover 하기 싫을때는 전체 database를 recover 해주면 된다.
recover database

DB OPEN

DB 정상종료

UNDO 데이터파일 삭제로 장애유발


가장 최근 백업본 찾아서 restore

백업 이후에 변경된 redo 적용

DB OPEN

udate hr.employees
set salary = salary * 1.1
where employee_id = 100;

alert log를 통해 장애 발생 확인

새로운 undo tablespace 생성
CREATE UNDO
TABLESPACE undo
DATAFILE '/u01/app/oracle/oradata/ORA19C/undo01.dbf' size 10m
autoextend on;
undo segment 확인

새로 생성한 undo tablespace를 사용할 수 있도록 지정
alter system set undo_tablespace = undo;
변경된 undo segment 확인

update hr.employees
set salary = salary * 1.1
where employee_id = 200;
select segment_id, segment_name,owner, tablespace_name, status
from dba_rollback_segs;
- 다른 undo 세그먼트에 할당되어있는걸 확인 할 수 있다.

select a.name, b.status
from v$rollname a, v$rollstat b
where a.usn = b.usn;


alter system kill session 'sid,serial#' immediate;
- 세션을 킬 해도 여전히 이전 udno segment가 offline으로 변경되지 않는다.


shutdown immediatevi initORA19C.ora
_offline_rollback_segments = (세그먼트 이름)
startup pfile='$ORACLE_HOME/dbs/initORA19C.ora' mount
기존 데이터파일을 offline으로 설정
alter database datafile 이전 언두 파일번호 offline;
데이터베이스 open 한 후 기존 undo tablespace 삭제
alter database open
drop tablespace undotbs1 including contents and datafiles;
create spfile from pfile

- 유/무 확인 후 삭제 진행

문제되는 데이터파일 offline으로 변경

가장 최근의 백업을 찾아 restore

백업 이후에 리두 정보 적용



archive file이 생성되는 위치를 여러곳으로 설정한 경우 복구 작업시에 가장 마지막에 설정된 위치에서 아카이브 파일을 찾는다. 없을 경우 아카이브 log 파일이 존재하는 디렉터리를 설정하면 되고 또는 다른 디렉터리에 아카이브 파일을 마지막 파일 위치에 복사를 한 후 복구 작업을 진행하면 된다.
현재 아카이브 로그 파일은 38번이 마지막이다

38번 아카이브 로그 파일은 redo log file에도 보관중이다.

38번 아카이브 로그 파일 삭제

특정 데이터 파일도 삭제

문제되는 데이터파일 offline으로 변경

가장 최근의 백업본으로 restore



온라인 백업 받은 시점의 SCN

아카이브 로그 파일 번호 & 리두로그파일 번호

백업 받은 백업본의 SCN이 시작하는 아카이브 로그 파일은 35번부터 시작이다.
현재 리두 로그파일에는 37,38,39 번의 파일이 있으니 36번 아카이브 로그 파일을 삭제해보겠다.
redo log file에 없는 아카이브 로그 파일 삭제

특정 데이터 파일 삭제



가장 최근에 백업 받아놓은 백업본 restore

아카이브 정보를 이용해서 recover 시도

- 문제 있는 데이터파일을 사용하지 않음
- 불안전한 복구 방식으로 데이터베이스를 살려야 한다.
DB 비정상적인 종료

백업받아놓은 전체 데이터파일을 restore

DB를 MOUNT 단계까지만 실행

control file이 가지고 있는 데이터파일 정보 확인


오전 실습에서 offline상태에서 db open resetlogs를 한 후 online으로 변경 시도 시 실패한 이유
- offline데이터파일 헤더가 가지고 있는 RESETLOGS 번호랑 RESETLOGS로 데이터베이스 오픈 후 다른 online상태의 데이터파일 RESETLOGS 번호랑 다르기 때문에 online으로 변경되지 않는다.
- open resetlogs를 한뒤 offline 상태로 되어있던 데이터파일에는 write를 할수 없어 online으로 바꿀 수 없었다.
번외 - resetlogs 번호
select * from v$database_incarnation;
데이터베이스를 resetlogs로 open 하게 되면 데이터파일 헤더의 resetlogs_id 정보가 새롭게 갱신된다. 하지만 offline으로 되어있는 데이터파일에는 갱신되지 않기 때문에 현재 resetlogs_id와 같지 않아 offline에서 online으로 변경되지 않는다.
cancel base recovery 로 전체 파일 복구
RECOVER DATABASE UNTIL CANCEL
- 현재 control file은 아카이브 로그 파일과 같은 scn이기 때문에 using backup controlfile 키워드를 사용하지 않는다.

DB OPEN


특정 데이터 파일 및 모든 아카이브 파일 삭제로 장애유발

DB SHUTDOWN ABORT
가장 최근의 offline 백업본 유무 확인

일관성 있는 백업 찾아서 restore(controlfile, datafile)

RESTORE한 CONTROLFILE을 가지고 MOUNT 단계까지 실행

cancel base recovery 실행


특정 데이터 파일 및 모든 아카이브 파일 삭제로 장애유발

DB SHUTDOWN ABORT

일관성 없는 백업 찾아서 restore(controlfile, datafile)

RESTORE한 BACKUP CONTROLFILE을 가지고 MOUNT 단계까지 실행



DB SHUTDOWN ABORT

init 파일에 히든 파라미터 설정
_allow_resetlogs_corruption=true
_corrupted_rollback_segments=true
PFILE을 이용해서 DB MOUNT 단계까지만 실행

DB resetlogs 옵션으로 OPEN





INACTIVE 상태인 REDO LOG GROUP 삭제

DB STARTUP 하지만 REDO 파일이 없어 오류 발생

DB MOUNT 단계까지 실행

문제되는 REDO LOG GROUP 삭제
ALTER DATABASE DROP LOGFILE GROUP 1;

DB OPEN

REDO LOG GROUP 추가해주기
ALTER DATABASE ADD LOGFILE GROUP 1 '/u01/app/oracle/oradata/ORA19C/redo01.log' size 200m;


inactive 상태인 redo log group 1개 삭제

많은 log switch 발생

로그파일 확인

아카이브 로그 파일 확인

alter database clear unarchived logfile group 1;

물리적으로도 redo log file을 생성해준다.

시퀀스 번호도 초기화 된다.



log switch 발생으로 아카이브 생성

새로운 테이블 생성




다시 DB MOUNT 단계까지만 실행

current redo전까지 복구해야하기 때문에 cancel base recover 시도해야한다.


RESETLOGS로 OPEN 하였기 때문에 물리적으로 없던 REDO LOG FILE은 자동으로 생성해준다.

생성했던 테이블 확인




DB 비정상적인 종료

DB STARTUP 하지만 오류 발생

불완전 복구로 실행
6. DB SHUTDOWN ABORT 후 다시 MOUNT 단계 까지만 실행




DB resetlogs 옵션으로 OPEN

current한 리두는 적용되지 않았기 때문에 current 리두에 저장된 hr.temp 테이블은 조회할 수 없다.




DB 비정상적인 종료

DB STARTUP 하지만 오류 발생

불완전 복구로 실행
6. DB SHUTDOWN ABORT 후 다시 MOUNT 단계 까지만 실행




_allow_resetlogs_corruption=true
_corrupted_rollback_segments=true
init 파일로 DB MOUNT 단계까지 실행

이전 RECOVER 시도로 RECOVER은 이미 되어있기 때문에 바로 OPEN RESETLOGS만 하면 된다.

테이블 생성
현재 current한 redo 그룹에 정보 입력

DB 정상종료
컨트롤 파일 삭제로 장애 유발

DB STARTUP 하지만 오류발생

- alert log에서 확인한 내용
현재 상태는 nomount 단계이다

가장 최근 control file 백업본을 원래 위치에 restore

백업 control file을 이용해서 mount 단계까지 실행

contorl file을 recover 해줘야한다.
recover database using backup controlfile
control file을 recover 할때는 복구가 필요한 시점의 redo log 부터 current redo log 까지 오라클에서는 아카이브에서 찾는다.

하지만 현재 사용하고 있는 control 파일은 과거 시점의 control 파일이기 때문에 redo log 정보 또한 과거정보를 가지고 있어 현재 current한 redo log를 찾으려면 오류가 발생한 sequence 번호를 alert log에서 확인할수 있다.



recover database using backup control을 하게 되면 백업 sequen번호와 현재 sequen번호가 맞지 않아 recover 하는 동안에 자동으로 백업 control 파일이 가지고 있는 redo 정보에서 sequence 번호를 초기화 하는 로직이 발생되었다. 따라서 db를 open할때 resetlogs로 open 하는것 같다.
테이블 생성
현재 current한 redo 그룹에 정보 입력

DB 정상종료
컨트롤 파일 삭제로 장애 유발

DB STARTUP 하지만 오류발생

- alert log에서 확인한 내용
현재 상태는 nomount 단계이다

가장 최근 control file 백업본을 원래 위치에 restore

백업 control file을 이용해서 mount 단계까지 실행

backup control 파일을 이용해 trace 파일 생성

DB 종료

trace 파일 내용으로 control file 재생성
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORA19C" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/ORA19C/redo01.log' SIZE 200M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/ORA19C/redo02.log' SIZE 200M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/ORA19C/redo03.log' SIZE 200M BLOCKSIZE 512
DATAFILE
'/u01/app/oracle/oradata/ORA19C/system01.dbf',
'/u01/app/oracle/oradata/ORA19C/undotbs01.dbf',
'/u01/app/oracle/oradata/ORA19C/sysaux01.dbf',
'/u01/app/oracle/oradata/ORA19C/example01.dbf',
'/u01/app/oracle/oradata/ORA19C/users01.dbf'
CHARACTER SET AL32UTF8
;
복구 작업 수행할게 있으면 하는데 없기 때문에 recover 할 필요가 없다는 메시지
RECOVER DATABASE

재생성한 control file sequence와 현재 redo log 의 sequence가 같기 때문에 그냥 open을 해도 된다.
ALTER DATABASE OPEN;

control file을 재생성하였기 때문에 temp 파일을 추가해줘야 한다.
alter tablespace temp add tempfile '$ORACLE_BASE/oradata/ORA19C/temp01.dbf' reuse;





- alert log에서도 확인할 수 있다.

DB SHUTDOWN ABORT

가장 최근의 백업 받은 control file, data file을 원래 위치에 restore

현재 정상 redo파일 입장에서는 restore한 control file이 예전 scn을 가지고 있기 때문에 using backup control 키워드를 사용해야 한다.

current한 redo log는 아카이브 파일이 없기 때문에 redo log 파일을 따로 지정해줘서 backup control 파일한테 마지막 복구라는 것을 지정해줘야 한다.

recover 한 백업 컨트롤 파일에 redo log 시퀀스 번호는 초기화 되었기 때문에 맞춰주기 위해 resetlogs 키워드로 db를 open해야한다.

current한 리두로그에 생성해 놓은 테이블이 그대로 있는걸 확인할 수 있다.

system file, control file 삭제로 장애유발

DB SHUTDOWN ABORT로 강제종료

가장 최근에 백업 받은 SYSTEM FILE, CONTROL FILE을 원래 위치에 RESTORE

백업 컨트롤 파일로 MOUNT 단계까지 실행

현재 정상 redo파일 입장에서는 restore한 control file이 예전 scn을 가지고 있기 때문에 using backup control 키워드를 사용해야 한다.

6번 시퀀스 리두로그 파일은 current한 redo log였기 때문에 아카이브 파일이 없다. 따라서 6번 시퀀스의 redo log 파일 주소를 직접 지정해줌으로써 마지막 recover 인걸 지정해줘야 한다.

recover 한 백업 컨트롤 파일에 redo log 시퀀스 번호는 초기화 되었기 때문에 맞춰주기 위해 resetlogs 키워드로 db를 open해야한다.

현재 redo log 상태 및 archive 상태

새로운 테이블 생성

수동으로 로그스위치 발생해서 아카이브 로그 파일 생성

control file, redo log file 삭제해서 장애유발

DB SHUTDOWN ABORT


백업 control file을 가지고 DB를 MOUNT 단계까지만 실행

아카이브 로그 파일이 있는 시퀀스 까지는 recovery 하지만 current했던 redo log 파일은 아카이브 파일이 없기 때문에 current redo log 시퀀스에서는 cancel 한다.

백업 컨트롤 파일을 아카이브 로그 파일을 사용해 recover 할때 redo log 정보 중 sequence 번호는 서로 맞지 않기 때문에 초기화 되었다. 그 상태에서 DB OPEN은 RESETLOGS로 해야하며 RESETLOGS는 컨트롤 파일에 입력되어있는 물리적으로 redo log file이 없다면 자동으로 생성도 해준다.

아카이브 로그 파일에 기록되어있던 생성 테이블도 정상적으로 조회된다.

현재 redo log 상태 및 아카이브 로그 파일 상태

수동으로 로그 스위치 발생해서 아카이브 파일 생성

example01.dbf, incative한 redo log 파일 1개 , control file 삭제로 장애유발

DB SHUTDOWN ABORT로 비정상 종료

가장 최근에 백업 받아놓은 example01.dbf, control file 백업본 restore

백업 control file로 DB mount 단계까지 실행

삭제한 inactive 한 redo log는 아카이브 파일로 가지고 있고, current한 리두도 redo log file에 존재 하기 때문에 완전 복구가 가능하다. 다만, restore한 control 파일이 아카이브 로그 파일들 보다는 old 하기 때문에 using backup controlfile 키워드를 사용해야 한다.

cancel base로 불완전하게 복구 하였기 때문에 resetlogs로 db를 open 해야 하고 resetlogs로 open 하게 되면 물리적으로 삭제되었던 redo02.log 파일도 자동생성 된다.

현재 redo log 상태 및 아카이브 로그 파일 상태

수동으로 로그 스위치 발생해서 아카이브 파일 생성

example01.dbf, incative한 redo log 파일 1개 , control file 삭제로 장애유발
강제 log switch 발생으로 hang 상태 유도

DB SHUTDOWN ABORT로 비정상종료 시킨다.

가장 최근에 백업받은 전체 data file과 control file을 restore 한다.



현재 redo log 파일 상태 및 아카이브 로그 확인

특정 데이터파일을 사용하는 테이블스페이스에 신규 테이블 생성

수동으로 로그스위치 발생해 아카이브 로그파일 생성

모든 데이터파일, 컨트롤파일, 리두로그 파일 삭제로 장애유발

DB 비정상적인 종료 후 다시 재가동 하지만 오류가 발생한다.

current한 리두 로그 파일이 없기 때문에 아카이브 로그 파일이 가지고 있는 시점까지 불완전 복구를 진행해야 한다. 따라서 가장 최근에 백업 받은 컨트롤 파일, 데이터 파일을 원래 위치에 restore 한다.

백업받은 컨트롤 파일로 DB를 MOUNT 단계까지 올리기

아카이브 로그파일을 이용해 cancel base recovery를 진행한다.

복구진행 하다보면 current redo log 파일은 아카이브가 없기 때문에 복구가 멈춘다.
우리는 current 리두로그 파일 직전까지 recover 하기 때문에 cancel 해주면 된다.

cancel base recovery로 복구하였기 때문에 DB를 open 할때는 resetlogs로 설정해야 하며, resetlogs로 설정 시 물리적으로 redo log 파일을 자동생성 해준다.

아카이브 로그 파일에 기록되어 있던 신규 테이블도 정상적으로 복구 된걸 확인할 수 있다.

현재 redo log 파일 상태 및 아카이브 로그 확인

특정 데이터파일을 사용하는 테이블스페이스에 신규 테이블 생성

수동으로 로그스위치 발생해 아카이브 로그파일 생성

모든 데이터파일, 컨트롤파일, 리두로그 파일, 아카이브 로그 파일 삭제로 장애유발

DB 비정상적인 종료 후 다시 재가동 하지만 오류가 발생한다.

가장 최근에 백업 받은 control file과 data file을 원래 위치에 restore 한 후 백업 control 파일로 mount 단계 까지 올린다.


리두로그 파일, 아카이브 로그파일 모두 없기 때문에 백업 control 파일과 datafile이 가지고 있는 정보까지만 복구 해야한다.

cancel base recovery로 복구 하였으니 DB를 OPEN 할때 RESETLOGS로 실행해야 한다.

당연히 과거 백업 데이터 파일에는 새롭게 생성한 신규 테이블이 존재하지 않는다.

새로운 테이블스페이스 생성

신규 테이블스페이스로 지정해서 테이블 생성

DB 정상종료

control file 삭제로 장애유발

DB STARTUP 해보지만 오류 발생

가장 최근에 백업 받은 control file을 원래 위치에 restore

redo log 파일을 이용해서 control file을 recover 하지만 redo log파일이 가지고 있는 control file 정보와 백업 control file의 정보가 달라 완전복구 불가

백업 control file을 가지고 trace 파일 생성

trace 파일을 확인해보면 알수 없는 이름의 데이터파일이 생성되어 있는데 이전에 생성한 신규데이터파일 이름으로 변경작업 해야한다.
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORA19C" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/ORA19C/redo01.log' SIZE 200M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/ORA19C/redo02.log' SIZE 200M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/ORA19C/redo03.log' SIZE 200M BLOCKSIZE 512
DATAFILE
'/u01/app/oracle/oradata/ORA19C/system01.dbf',
'/u01/app/oracle/oradata/ORA19C/undotbs01.dbf',
'/u01/app/oracle/oradata/ORA19C/sysaux01.dbf',
--'/u01/app/oracle/product/19.3.0/dbhome_1/dbs/UNNAMED00004', recover을 시도해서 생긴 데이터파일 주소
'/u01/app/oracle/oradata/ORA19C/data_tbs01.dbf',
'/u01/app/oracle/oradata/ORA19C/example01.dbf',
'/u01/app/oracle/oradata/ORA19C/users01.dbf'
CHARACTER SET AL32UTF8
;

새로운 테이블스페이스 생성

신규 테이블스페이스로 지정해서 테이블 생성

DB 비정상종료

control file 삭제로 장애유발

DB STARTUP 해보지만 오류 발생

가장 최근에 백업 받은 control file을 원래 위치에 restore

redo log 파일을 이용해서 control file을 recover 하지만 redo log파일이 가지고 있는 control file 정보와 백업 control file의 정보가 달라 완전복구 불가

백업 control file을 가지고 trace 파일 생성

trace 파일을 확인해보면 알수 없는 이름의 데이터파일이 생성되어 있는데 이전에 생성한 신규데이터파일 이름으로 변경작업 해야한다.
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "ORA19C" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/ORA19C/redo01.log' SIZE 200M BLOCKSIZE 512,
GROUP 2 '/u01/app/oracle/oradata/ORA19C/redo02.log' SIZE 200M BLOCKSIZE 512,
GROUP 3 '/u01/app/oracle/oradata/ORA19C/redo03.log' SIZE 200M BLOCKSIZE 512
DATAFILE
'/u01/app/oracle/oradata/ORA19C/system01.dbf',
'/u01/app/oracle/oradata/ORA19C/undotbs01.dbf',
'/u01/app/oracle/oradata/ORA19C/sysaux01.dbf',
--'/u01/app/oracle/product/19.3.0/dbhome_1/dbs/UNNAMED00004', recover을 시도해서 생긴 데이터파일 주소
'/u01/app/oracle/oradata/ORA19C/data_tbs01.dbf',
'/u01/app/oracle/oradata/ORA19C/example01.dbf',
'/u01/app/oracle/oradata/ORA19C/users01.dbf'
CHARACTER SET AL32UTF8
;
control file 재생성 후 db 비정상적인 종료로 인해 datafile의 checkpont scn 수위가 맞지 않아 INSTANCE RECOVER을 해줘야 한다.

DB를 OPEN 하면 정상적으로 DB가 가동된다.

신규 테이블 생성

데이터 삽입

수동으로 log switch 발생

신규테이블이 생성되어있던 테이블스페이스 삭제

users 테이블스페이스에 신규 테이블 생성 후 데이터 추가

employees 테이블을 조회해 봤지만 테이블스페이스 삭제로 조회되지 않는다.

DB SHUTDOWN ABORT

복구하려고 하는 테이블스페이를 가지고 있는 가장 최근에 close 백업 control file, datafile을 restore

백업 control file을 이용해 DB MOUNT 단계까지 실행

백업 control file 시점의 테이블스페이스 및 리두로그 파일 상태 확인

current 한 redo 까지 recover 할 수 있는 아카이브 파일이 존재하는지 확인

alert log 에서 테이블스페이스를 drop 한 시간 확인
- 원래 drop한 시간은 14:19 이지만 그 이전까지 백업이 필요하기 때문에 2024-09-09 14:18:00으로 설정 하고 time base recovery를 해야한다.
세션의 date format을 alert log에 표시되는 형식으로 변경해야한다.
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

time base recovery를 수행

current redo는 따로 지정

DB는 resetlogs로 open 하고 생성 테이블들을 조회해본다.

수동으로 log switch 를 발생해서 alert log에 current 시퀀스의 redo log 파일 확인

특정 테이블을 PURGE로 삭제

DB 비정상적인 종료

time base recovery를 해야하기 때문에 가장 최근 control file,모든 datafile를 restore 한다.

백업 control file로 DB mount 단계까지 실행

세션 date 포맷 설정

time base recovery로 진행

current 한 리두가 살아 있기 때문에 current한 리두는 따로 주소를 지정해줘야 한다.

DB resetlogs로 open 후 삭제했었던 테이블이 잘 복구 되었는지 확인

수동으로 log switch 발생

현재 current한 redo log file 확인

신규 테이블 생성후 데이터 추가

다시 log switch 발생 후 current한 redo log 확인

생성했던 테이블을 TRUNCATE 한다.

log miner 해야하는 redo log file 설정
begin
dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/ORA19C/redo03.log', options=>dbms_logmnr.new); -- 처음 분석 대상 파일은 new
dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/ORA19C/redo02.log', options=>dbms_logmnr.addfile); -- 이후부터는 addfile로 진행
end;
/
select db_name, filename from v$logmnr_logs;

begin
dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);--분석기
end;
/
select to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') as timestamp, operation,sql_redo, sql_undo from v$logmnr_contents where seg_name = 'TEST';

execute dbms_logmnr.end_logmnr;
DB 비정상 종료 후 TRUNCATE 하기 이전의 가장 최근 백업 control file, data file을 원래 위치에 restore 한다.

백업 control file로 DB MOUNT 단계까지 실행 후 세션 DATAE 포맷 변경

log miner로 확인한 TRUNCATE 시점보다 조금 앞으로 TIME BASE RECOVERY를 수행한다.

DB는 RESETLOGS로 OPEN 해야하며, TRUNCATE 되기 전의 데이터가 온전히 살아 있는걸 확인할 수 있다.

SELECT supplemental_log_data_min FROM v$database;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

수동으로 log switch 발생

현재 current한 redo log file 확인

신규 테이블 생성후 DML작업

begin
dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/ORA19C/redo02.log', options=>dbms_logmnr.new); -- 처음 분석 대상 파일은 new
dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/ORA19C/redo01.log', options=>dbms_logmnr.addfile); -- 이후부터는 addfile로 진행
end;
/
select db_name, filename from v$logmnr_logs;
begin
dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);--분석기
end;
/
select to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') as timestamp, operation,sql_redo, sql_undo from v$logmnr_contents where seg_name = 'TEST';

execute dbms_logmnr.end_logmnr;

DB 비정상 종료 후 TRUNCATE 하기 이전의 가장 최근 백업 control file, data file을 원래 위치에 restore 한다.

백업 control file로 DB MOUNT 단계까지 실행 후 세션 DATAE 포맷 변경

log miner로 확인한 특정 DML 시점보다 조금 앞으로 TIME BASE RECOVERY를 수행한다.

recover 시점이 current한 redo log file까지 복구 해야해서 current redo log file은 따로 지정해줘야 한다.

DB는 RESETLOGS로 OPEN

SELECT supplemental_log_data_min FROM v$database;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

수동으로 log switch 발생

현재 current한 redo log file 확인

신규 테이블 생성

유저 삭제 후 데이터 조회를 하면 조회되지 않는다.

begin
dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/ORA19C/redo02.log', options=>dbms_logmnr.new); -- 처음 분석 대상 파일은 new
dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/ORA19C/redo01.log', options=>dbms_logmnr.addfile); -- 이후부터는 addfile로 진행
end;
/
select db_name, filename from v$logmnr_logs;
begin
dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);--분석기
end;
/
select to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') as timestamp, operation,sql_redo, sql_undo from v$logmnr_contents where seg_name = 'TEST';

execute dbms_logmnr.end_logmnr;

DB 비정상 종료 후 TRUNCATE 하기 이전의 가장 최근 백업 control file, data file을 원래 위치에 restore 한다.

백업 control file로 DB MOUNT 단계까지 실행 후 세션 DATAE 포맷 변경

log miner로 확인한 특정 DDL 시점보다 조금 앞으로 TIME BASE RECOVERY를 수행한다.

recover 시점이 current한 redo log file까지 복구 해야해서 current redo log file은 따로 지정해줘야 한다.

DB는 RESETLOGS로 OPEN

복구한 유저가 정상적으로 조회된다.

supplemental log data를 활성화
수동으로 로그스위치 발생
특정 유저 삭제
execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/ORA19C/redo02.log', options=> dbms_logmnr.new);
설정한 리두로그파일 확인

분석 시작
begin
dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);--분석기
end;
/
select to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') as timestamp, operation,sql_redo, sql_undo from v$logmnr_contents where seg_owner = 'HR';

execute dbms_logmnr.end_logmnr;
time base recovery를 해야하는 목표 시간 확인
2024-09-10 11:34:00
spfile을 이용해서 pfile 생성

DB는 정상적으로 종료


새로운 control file 위치로 설정한 디렉터리 생성 후 close 백업본 복사

운영 DB에 있는 REDO LOG를 TEMP 디렉터리에 복사

temp pfile을 이용해서 DB를 MOUNT 단계까지만 실행

alter database rename file '/u01/app/oracle/oradata/ORA19C/system01.dbf' to '/home/oracle/temp/system01.dbf';
alter database rename file '/u01/app/oracle/oradata/ORA19C/sysaux01.dbf' to '/home/oracle/temp/sysaux01.dbf';
alter database rename file '/u01/app/oracle/oradata/ORA19C/undotbs01.dbf' to '/home/oracle/temp/undotbs01.dbf';
alter database rename file '/u01/app/oracle/oradata/ORA19C/users01.dbf' to '/home/oracle/temp/users01.dbf';
alter database rename file '/u01/app/oracle/oradata/ORA19C/example01.dbf' to '/home/oracle/temp/example01.dbf';
alter database rename file '/u01/app/oracle/oradata/ORA19C/redo01.log' to '/home/oracle/temp/redo01.log';
alter database rename file '/u01/app/oracle/oradata/ORA19C/redo02.log' to '/home/oracle/temp/redo02.log';
alter database rename file '/u01/app/oracle/oradata/ORA19C/redo03.log' to '/home/oracle/temp/redo03.log';

세션레벨에서 date 포맷 변경

time base recovery로 유저가 삭제되기 전 시간대로 recover

RESETLOGS로 DB를 OPEN

복구한 유저 확인

운영 DB에 import하기전에 유저를 생성해줘야 하는데 temp DB에서 유저의 메타데이터를 추출해야 한다.
유저 생성 구조를 확인
SET long 1000000 -- meta 데이터의 타입은 long 타입이다.
SELECT dbms_metadata.get_ddl('USER','HR') from dual;

유저에게 부여된 시스템 권한 확인
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT','HR') from dual;

유저에게 부여된 객체 권한 확인
select dbms_metadata.get_granted_ddl('OBJECT_GRANT','HR') from dual;

유저에게 부여된 쿼터값 확인
select dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA','HR') from dual;

유저에게 부여된 ROLE 확인
select dbms_metadata.get_granted_ddl('ROLE_GRANT','HR') from dual;

SYSTEM 계정에 대한 패스워드 설정

HR 계정 Export 받기
exp userid=system/oracle owner=hr file=hr_owner.dmp direct=y

temp DB 정상종료

startup 으로 기존 운영 DB 시작

-- 유저 구조생성
CREATE USER "HR" IDENTIFIED BY hr
DEFAULT TABLESPACE "SYSAUX"
TEMPORARY TABLESPACE "TEMP";
-- 시스템권한
GRANT CREATE SESSION TO "HR";
GRANT ALTER SESSION TO "HR";
GRANT UNLIMITED TABLESPACE TO "HR";
GRANT CREATE SYNONYM TO "HR";
GRANT CREATE VIEW TO "HR";
GRANT CREATE SEQUENCE TO "HR";
GRANT CREATE DATABASE LINK TO "HR";
-- 객체권한
GRANT EXECUTE ON "SYS"."DBMS_STATS" TO "HR";
-- 쿼타 부여
DECLARE
TEMP_COUNT NUMBER;
SQLSTR VARCHAR2(200);
BEGIN
SQLSTR := 'ALTER USER "HR" QUOTA UNLIMITED ON "SYSAUX"';
EXECUTE IMMEDIATE SQLSTR;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -30041 THEN
SQLSTR := 'SELECT COUNT(*) FROM USER_TABLESPACES
WHERE TABLESPACE_NAME = ''SYSAUX'' AND CONTENTS = ''TEMPORARY''';
EXECUTE IMMEDIATE SQLSTR INTO TEMP_COUNT;
IF TEMP_COUNT = 1 THEN RETURN;
ELSE RAISE;
END IF;
ELSE
RAISE;
END IF;
END;
/
-- ROLE 부여
GRANT "RESOURCE" TO "HR";
dump 파일을 이용해서 import 하기
imp userid=system/oracle file=hr_owner.dmp fromuser=hr
import 된 유저 확인

supplemental log data를 활성화
특정 유저 삭제
execute dbms_logmnr.add_logfile(logfilename=>'/u01/app/oracle/oradata/ORA19C/redo02.log', options=> dbms_logmnr.new);
설정한 리두로그파일 확인

분석 시작
begin
dbms_logmnr.start_logmnr(options=>dbms_logmnr.dict_from_online_catalog);--분석기
end;
/
select to_char(timestamp,'yyyy-mm-dd hh24:mi:ss') as timestamp, operation,sql_redo, sql_undo from v$logmnr_contents where seg_owner = 'HR';

execute dbms_logmnr.end_logmnr;
time base recovery를 해야하는 목표 시간 확인
2024-09-10 11:34:00
클론 DB에서 사용하기 위해 user를 drop 했던 redo 정보를 아카이브 파일로 만듬

clone 디렉터리 생성

clone DB에서 사용할 초기파라미터 파일 만들기

control file을 trace 파일로 만들기

close 백업 받은 data file만 clone 디렉터리에 복사

아카이브 파일 clone 디렉터리에 복사

pfile을 vi 편집기로 편집

CREATE CONTROLFILE SET DATABASE "CLONE" RESETLOGS ARCHIVELOG -- 새롭게 생성할때는 SET 키워드를 사용해야한다.
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/home/oracle/clone/redo01.log' SIZE 200M BLOCKSIZE 512,
GROUP 2 '/home/oracle/clone/redo02.log' SIZE 200M BLOCKSIZE 512,
GROUP 3 '/home/oracle/clone/redo03.log' SIZE 200M BLOCKSIZE 512
DATAFILE
'/home/oracle/clone/system01.dbf',
'/home/oracle/clone/undotbs01.dbf',
'/home/oracle/clone/sysaux01.dbf',
'/home/oracle/clone/example01.dbf',
'/home/oracle/clone/users01.dbf'
CHARACTER SET AL32UTF8
;
. oraenv : oracle 환경변수

만들어 놓은 control file 생성 쿼리문으로 생성

현재 세션에서 포맷 설정
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';

time base recovery 수행
recover database using backup controlfile until time '2024-09-10 15:31:00'

RESETLOGS로 DB를 OPEN

clone DB 생성완료

control file을 생성 하였기 때문에 temp 파일 설정 및 SYSTEM 계정 패스워드 설정

USER 모드로 데이터 Export 작업 수행
exp userid=system/oracle owner=hr file=clone_hr.dmp direct=y
clone DB에서 Export한 유저의 metadata 정보 추출
유저 생성 구조를 확인
SET long 1000000 -- meta 데이터의 타입은 long 타입이다.
SELECT dbms_metadata.get_ddl('USER','HR') from dual;

유저에게 부여된 시스템 권한 확인
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT','HR') from dual;

유저에게 부여된 객체 권한 확인
select dbms_metadata.get_granted_ddl('OBJECT_GRANT','HR') from dual;

유저에게 부여된 쿼터값 확인
select dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA','HR') from dual;

유저에게 부여된 ROLE 확인
select dbms_metadata.get_granted_ddl('ROLE_GRANT','HR') from dual;

-- 유저 구조생성
CREATE USER "HR" IDENTIFIED BY hr
DEFAULT TABLESPACE "SYSAUX"
TEMPORARY TABLESPACE "TEMP";
-- 시스템권한
GRANT CREATE SESSION TO "HR";
GRANT ALTER SESSION TO "HR";
GRANT UNLIMITED TABLESPACE TO "HR";
GRANT CREATE SYNONYM TO "HR";
GRANT CREATE VIEW TO "HR";
GRANT CREATE SEQUENCE TO "HR";
GRANT CREATE DATABASE LINK TO "HR";
-- 객체권한
GRANT EXECUTE ON "SYS"."DBMS_STATS" TO "HR";
-- 쿼타 부여
DECLARE
TEMP_COUNT NUMBER;
SQLSTR VARCHAR2(200);
BEGIN
SQLSTR := 'ALTER USER "HR" QUOTA UNLIMITED ON "SYSAUX"';
EXECUTE IMMEDIATE SQLSTR;
EXCEPTION
WHEN OTHERS THEN
IF SQLCODE = -30041 THEN
SQLSTR := 'SELECT COUNT(*) FROM USER_TABLESPACES
WHERE TABLESPACE_NAME = ''SYSAUX'' AND CONTENTS = ''TEMPORARY''';
EXECUTE IMMEDIATE SQLSTR INTO TEMP_COUNT;
IF TEMP_COUNT = 1 THEN RETURN;
ELSE RAISE;
END IF;
ELSE
RAISE;
END IF;
END;
/
-- ROLE 부여
GRANT "RESOURCE" TO "HR";
dump 파일 import 받기
imp userid=system/oracle file=clone_hr.dmp fromuser=hr
복구받은 유저 확인
