Backup/Archive Log Mode

백업 받지 않은 tablespace에 데이터 파일 손상 받았을 경우

잇꼬 2024. 1. 15. 17:21
728x90
반응형
SMALL

SQL> CREATE TABLESPACE data01 DATAFILE '/u01/app/oracle/oradata/ora11g/data01.dbf' SIZE 5m;


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


SQL>
select a.file#, a.name file_name, a.checkpoint_change#, b.status, b.change#, to_char(b.time, 'yyyy-mm-dd hh24:mi:ss')
from v$datafile a, v$backup b
where a.file# = b.file#;



#) 테이블 생성
SQL>
CREATE TABLE hr.dept_temp
TABLESPACE data01
AS
SELECT *
FROM hr.departments;



#) 테이블 생성 확인
SQL> 
select count(*) from hr.dept_temp;


#) redo log 정보 확인
SQL> select * from v$log;



#) log switch 4번 발생!
SQL> alter system switch logfile;



#) redo log 확인
SQL> select * from v$log;



#) archived_log 정보 확인
select sequence#, name, first_change#, next_change#, next_time from v$archived_log;


#) 정보 확인
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 = 'DEPT_TEMP'
and e.owner = 'HR';



# 장애 발생 # 
SQL> ! rm /u01/app/oracle/oradata/ora11g/data01.dbf
# 지워졌는지 확인
SQL> ! ls /u01/app/oracle/oradata/ora11g/data01.dbf
ls: cannot access /u01/app/oracle/oradata/ora11g/data01.dbf: No such file or directory


# DB 내리기 
- 오류발생 : channel 끊어짐, 비정상적으로 종료
SQL> shutdown immediate


# DB 올리기 
- 오류발생
SQL> startup


# 재접속하기
SQL> conn / as sysdba


# DB 올리기
SQL> startup
ORA-01157: cannot identify/lock data file 3 - see DBWR trace file
ORA-01110: data file 3: '/u01/app/oracle/oradata/ora11g/data01.dbf' : 오류발생 



# recovery file 확인
SQL> select * from v$recover_file;


# data file 확인
SQL> select file#, name, status from v$datafile;

 

# 해결 방법 #
# offline 모드로 변경
SQL>
alter database datafile 3 offline;
또는 
SQL> alter database datafile '/u01/app/oracle/oradata/ora11g/data01.dbf' offline;



# offline모드로 변경 되었는지 data file 확인
SQL> select file#, name, status from v$datafile;


# DB open 변경 
SQL> alter database open;

# 확인
SQL> select count(*) from hr.employees;


# 백업본 확인 
SQL> 
select a.file#, a.name file_name, a.checkpoint_change#, b.status, b.change#, to_char(b.time, 'yyyy-mm-dd hh24:mi:ss')
from v$datafile a, v$backup b
where a.file# = b.file#;



# 복구 작업 수행해야 할 기존 디렉터리에 데이터파일 재생성
SQL> alter database create datafile '/u01/app/oracle/oradata/ora11g/data01.dbf';


# data file 확인
SQL> select file#, name, status from v$datafile;


# 재생성 확인 (redo log 적용)
SQL> ! ls /u01/app/oracle/oradata/ora11g/data01.dbf
/u01/app/oracle/oradata/ora11g/data01.dbf

SQL> ! ls -l /u01/app/oracle/oradata/ora11g/data01.dbf
-rw-r-----. 1 oracle1 oinstall 5251072 Jan 14 20:29 /u01/app/oracle/oradata/ora11g/data01.dbf


# 있다면? recovery
-- 없다면? drop tablespace data01 해야 한다.
SQL> recover tablespace data01;
ORA-00279: change 979953(scn 번호) generated at 01/14/2024 20:04:26 needed for thread 1
ORA-00289: suggestion : /home/oracle1/arch2/arch_1_6_1157923223.arc
ORA-00280: change 979953 for thread 1 is in sequence #6 <- 이 번호부터 시작

Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto (입력)


ORA-00279: change 980436 generated at 01/14/2024 20:09:08 needed for thread 1
ORA-00289: suggestion : /home/oracle1/arch2/arch_1_7_1157923223.arc
ORA-00280: change 980436 for thread 1 is in sequence #7

ORA-00279: change 980439 generated at 01/14/2024 20:09:11 needed for thread 1
ORA-00289: suggestion : /home/oracle1/arch2/arch_1_8_1157923223.arc
ORA-00280: change 980439 for thread 1 is in sequence #8

Log applied.
Media recovery complete. <- redo log 적용 완료 



# online 모드로 변경 
SQL> alter tablespace data01 online;

 

# data file 확인
SQL> select file#, name, status from v$datafile;


# dept_temp 데이터 확인
SQL> select count(*) from hr.dept_temp;


# 복구 완료!

728x90
반응형
LIST