오라클 복구 클론DB 이용
DB CAFE
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
Oracle DB 무정지 상태에서 복구 Clone DB를 사용한 exp/imp 복구
Oracle-Backup & Recovery 2015.04.23 03:28
- 운영 DB Open 상태에서 Clone DB를 생성한 다음 recover를 통해서 복구후에 exp/imp 수행
- Archive Log로 복구하기때문에 Archive Log Mode 상태여야 함
- Clone DB의 Data File은 Backup에서 복사, Control File은 운영DB에서 재생성, Redo Log File은 리셋
- 주요 절차
>> 운영DB Full Backup된 상태에서 delete,commit발생
>> Clone DB생성
>> Clone DB를 통해서 Recover
>> Clone DB Export Data
>> 운영DB Import Data
- 세부 절차
1. 논리적 장애 발생 : 테이블 생성 >> 데이터 입력 >> 커밋 >> 테이블 삭제(장애발생)
- 테이블 삭제 시각 확보
2. CloneDB용 파라미터 파일 복사(여기서는 pfile 사용)
3. 백업 데이터 파일 복사
4. 컨트롤 파일 재생성
5. CloneDB에서 Control File 생성 >> CloneDB 마운트 >> 장애 난 시점으로 시간 기간 복구 >> DB Open
6. 복구한 테이블 Export
7. 운영DB에서 Import
>> 장애 상황 발생
create table scott.abc(no number);
insert into scott.abc values(1);
insert into scott.abc values(2);
insert into scott.abc values(3);
commit;
drop table scott.abc;
>> Log Switch 발생(Recover 할때 사용할 Archive Log File 생성을 위해)
alter system switch logfile;
/
/
/
>> Log Miner로 장애 시점을 찾음
exec dbms_logmnr_d.build(dictionary_filename=>'dict.dat', dictionary_location=>'/app/oracle/logminer');
@logmnrl
@log
exec dbms_logmnr.add_logfile('/app/oracle/oradata/testdb/redo01.log', 1);
exec dbms_logmnr.add_logfile('/app/oracle/oradata/testdb/redo02.log', 3);
exec dbms_logmnr.add_logfile('/app/oracle/oradata/testdb/redo03.log', 3);
!
rm arch.sql
sh ar.sh
tail -10 arch.sql
exit
@arch
@logmnrl
exec dbms_logmnr.start_logmnr(dictfilename=>'/app/oracle/logminer/dict.dat');
또는 (DML이 많을 경우에)
exec dbms_logmnr.start_logmnr(dictfilename=>'/app/oracle/logminer/dict.dat', options=>dbms_logmnr.ddl_dict_tracking);
@logmnrc seg_name: ABC
(drop table scott.abc의 timestamp확인 >> 2015-04-21:07:33:21 >> 여기에서 1~2초를 빼서 복구할때 사용)
>> Clone DB 생성 파라미터 파일 복사 >> 수정
!
cd $ORACLE_HOME/dbs/
cp inittestdb.ora initclonedb.ora
vi initclonedb.ora
- .control_files='/data/temp/control01.ctl'
- .db_name='clonedb'
- .memory_target=423624704 # 주석처리
>> 백업 Data File 복사
cp /data/backup/close/*.dbf /data/temp/ -v
exit
>> Control File 재생성 sql 수정
alter database backup controlfile to trace as '/home/oracle/mkctl.sql';
!
vi mkctl.sql
(
1. 처음 나타나는 STARTUP 구문 부터 ;까지만 남기고 제거
2. REUSE 를 SET 으로 변경
3. TESTDB 를 CLONEDB 로 변경
4. NORESETLOGS를 RESETLOGS로 변경
4. 모든 파일의 경로 /app/oracle/oradata/testdb 를 /data/temp 로 변경
)
CREATE CONTROLFILE SET DATABASE "CLONEDB" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/data/temp/redo01.log' SIZE 50M BLOCKSIZE 512,
GROUP 2 '/data/temp/redo02.log' SIZE 50M BLOCKSIZE 512,
GROUP 3 '/data/temp/redo03.log' SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/data/temp/system01.dbf',
'/data/temp/sysaux01.dbf',
'/data/temp/undotbs01.dbf',
'/data/temp/users01.dbf',
'/data/temp/example01.dbf'
CHARACTER SET KO16MSWIN949
- 지금 부터는 새창으로 작업하는게 편함
>> Clone DB로 접속 >> 컨트롤 파일 생성 >> 복구 >> DB오픈
export ORACLE_SID=clonedb # initclonedb.ora를 소문자로 했기때문에 소문자로 세팅
echo $ORACLE_SID
sqlplus / as sysdba
@mkctl
select instance_name from v$instance;
!ps -ef | grep ora_
recover database until time '2015-04-21:07:33:20' using backup controlfile;
AUTO
alter database open resetlogs;
select * from scott.abc;
>> clonedb에서 Export >> testdb에서 Import
!exp scott/tiger file=/home/oracle/abctbl.dmp tables=abc
!ls /home/oracle/abctbl.dmp
shutdown immediate
exit
export ORACLE_SID=testdb
echo $ORACLE_SID
sqlplus / as sysdba
select instance_name from v$instance;
!imp scott/tiger file=/home/oracle/abctbl.dmp tables=abc ignore=y
- 로그마이너 관련 쿼리
@logmnrl
select filename , status from v$logmnr_logs
@logmnrc
select to_char(timestamp, 'yyyy-mm-dd:hh24:mi:ss') timestamp,
to_char(commit_timestamp, 'yyyy-mm-dd:hh24:mi:ss') commit_timestamp,
username, operation, table_name, sql_redo
from v$logmnr_contents
where seg_name='&seg_name'
출처: https://dbaguide.tistory.com/73?category=509242 [DBA Guide]