Datafile, Controlfile, Redolog File에는 모두 checkpoint SCN이라는 공통적인 순서가 있습니다.
이 SCN number가 datafiles, controlfiles, redolog files중 하나라도 어긋나게 되면, oracle이 문제가 있다고 가정하고, SMON에서 자동적으로 복구해버리거나, 복구할 수 없을때에는 DB를 open시키지 않습니다.
(** 각각의 datafile들 마다는 checkpoint CNT가 있어서 그 cnt정보가 모두 controlfile에 적혀져 있어서, controlfile에 적혀진 datafile의 cnt정보와, 실제 datafile의 cnt정보가 달라도 문제가 있다고 인식합니다.)
** 복구철칙 : oracle은 자료의 Integrity를 위해서 복구 시 무조건 redo log의 checkpoint SCN 순서대로 고칩니다.
만약에 5라는 시점에서 장애가 일어났고, redo log에 1,2,4만 저장이 되어있으면 복구가 불가능합니다.(불완전복구로 1의 시점까지는 복구가 가능하겠네요..)
** 복구과정 요약
1. 백업 datafile을 복사해온다(Restore)
2. Recover 명령 수행 시, Control file의 checkpoint SCN정보를 확인한다
3. 2번에서 확인한 controlfile의 SCN과 datafile header부분의 SCN정보를 비교한다. ( 관련해서 http://gyh214.tistory.com/74 참조 )
4. 틀린 부분이 있다면, 문제가 있다는 말이므로, redo logfile이나 archive log file을 반영해서 복구를 한다.
백업과 관련된 DB운영 2가지 모드
1. No Archive log mode
2. Archive log mode
No Archive log mode, Archive log mode설명
위 모드를 설명하기 위해서 한가지 상황을 가정해봅니다.
log file group이 2개 있다고 가정합니다.
log의 sequence#가 1,2,3,4 차례대로 진행하다가 5라는 시점에서 장애가 났다고 가정합니다.
그러면 1,2,3,4 차례대로 redo logfile에서 읽어와서 자료들을 해당 datafile에 수정 및 추가등등 해서 복구를 해야 합니다.
그런데, 여기서 문제점..!
log file group이 2개 밖에 없어서, log sequence# 1,2에 해당되는 얘들은 덮어쓰여져 버려서 현재는 존재하지 않는 자료가 되어버립니다.
----> No Archive log mode : 복구가 불가능합니다. (DB 초기 설정)
----> Archive log mode : 복구가 가능합니다.
왜 Archive log mode는 복구가 가능할까요?
이유는 해당 모드로 운영을 하게 되면, log file이 덮어쓰여질 때마다, 덮어쓰여지기 전에 해당 logfile을 다른곳에다가 복사를 해놓고 덮어씁니다.
(arc% 백그라운드프로세서가 담당합니다)
** 그래서 항상, DB를 설치하고 해당 담당자에게 archive mode로 운영할지, No archive log mode로 운영할지 정해서 설정까지 해줘야 합니다.
하지만, 좋기만 보이는 Archive log mode는 대다수의 DB에서 운영하지 않습니다.
Archive log mode의 단점
log file이 다른곳에 Archiving되기 전에는 절대로 redo log에 덮어 쓸 수 없다 ---> **Archive Hang발생
Archive Hang발생을 피하기 위해서 archiving되는 **디렉토리 관리를 잘해줘야한다 ---> 한마디로 관리가 귀찮음
** Archive Hang : Archive파일이 저장되는 디렉토리에 여유공간이 없거나, 권한문제로 쓸 수 없는 경우에 발생하며,
redo log를 덮어 쓸 수 없으므로, DB가 멈춰버리는 현상
해결방법 순서
1. 여유공간을 만들어주거나, 권한문제 해결
2. 파라미터 변경 후 Archiver restart(DB는 끄지마세요)
alter system set log_archive_dest_state_1=defer;
alter system set log_archive_dest_state_1=enable;
alter system set log_archive_dest_state_2=defer;
alter system set log_archive_dest_state_2=enable;
(저장공간으로 지정한 디렉토리 전부 defer로 설정했다가, enable로 설정해야합니다. 여기서는 2군데(arc 다중화개념) )
alter system archive log stop;
alter system archive log start;
alter system switch logfile;
** Archive 디렉토리 관리시 지워도 되는 파일들
; 만약에 백업을 12월 5일에 받았다고 가정하면, 12월 5일 이전 Archive file은 다 지워도 됩니다.
; 만약 archive되는 디렉토리가 꽉차서 archive hang이 발생할 것 같다!! 이러면, 백업을 빨리 받으시고 archive를 지워주시면 됩니다.
--> 결론 : 백업 이전 시점은 지워도 됨
Archive log mode 설정시 주의사항
archive log file의 저장경로를 따로 지정하지 않으면, oracle에서 자동으로 DB_RECOVERY_FILE_DEST로 저장경로를 지정합니다.
해당 저장경로는 $ORACLE_BASE/flash_recovery_area/ 로 2GB밖에 할당이 되지 않은 공간입니다. 결국 순식간에 꽉 차게 되여 Archive Hang이 자주 발생하게 됩니다.
Archive log 설정방법
1. 내 DB가 어떤 모드인지 모기
SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination /backup/arc Oldest online log sequence 28 Next log sequence to archive 30 Current log sequence 302. 내 DB의 archive 관련 parameter보기(여기서 log_archive_start=false부분은 항상 false이므로 보지맙시다.
SQL> show parameter archive
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ archive_lag_target integer 0 log_archive_config string log_archive_dest string log_archive_dest_1 string location=/backup/arc log_archive_dest_10 string log_archive_dest_2 string log_archive_dest_3 string ..........생략 log_archive_dest_state_9 string enable log_archive_duplex_dest string log_archive_format string %t_%s_%r.dbf log_archive_local_first boolean TRUE log_archive_max_processes integer 2 log_archive_min_succeed_dest integer 1 log_archive_start boolean FALSE log_archive_trace integer 0 remote_archive_enable string true standby_archive_dest string ?/dbs/arch
3. Archive모드로 DB상태 변경하기
첫번째, 셧다운 후 파라미터 파일변경
log_archive_start=true <----- 9i전용, 10g부터는 에러발생, 써주지 마세요
log_archive_dest_1='location=/data/arc1'
log_archive_dest_2='location=/data/arc2'
(위 저장경로로 archive file들이 저장됩니다., 다중화개념입니다.)
log_archive_format=%s_%t_%r.arc
(저장될 archive file이름입니다., 차례대로 Sequence number, Thread번호(RAC아니면 전부 1), incarnation번호
지정하지 않으면 자동으로 %t_%s_%r.dbf 형식으로 저장됩니다.)
두번째, mount단계로 올라가서 archive log mode 적용하기
startup mount
alter database archivelog; <---- 적용하는 명령어입니다.
세번째, open하기
alter database open;
보안관련 암호설정
http://blog.naver.com/PostView.nhn?blogId=bossjl&logNo=10130554156 보세요! ^^
백업
* 백업시 꼭 지켜야 할 사항
1. 모든 파일은 동인한 checkpoint SCN을 가져야 합니다.
--> 어떤 파일은 3일전에 백업해놓고, 어떤 파일은 어제 백업해놓고, 이런식이면 그 백업본들은 모두 사용 못합니다.
2. 백업시 clean database의 자료들을 백업받아야합니다.
--> Instance Crash상태의 백업은 checkpoint SCN이 어긋날 가능성도 있고, 사용자가 롤백한 자료들, commit한 자료들이 제대로 반영되어있지 못하므로, 무조건 clean database의 자료를 받아야 합니다.
백업의 종류
1. 닫힌 백업(Cold backup / Closed backup)
; DB서버 전체를 shutdown하고 필요한 파일들을 모두 백업받는 방법
2. 열린 백업(Hot backup / open backup / begin backup)
; 자료들의 Integrity를 유지하기 위해, DB에서 해당 자료들에 대한 access를 방지(dbwn을 멈춤)하고, 그 사이에 해당 파일들을 복사하는 백업
** 열린 백업 중에서 insert, update, create 모두 가능하다.
이유 : 각 tablespace의 dbwn을 멈춘 동안에 해당 tablespace 작업을 하게 되면, 그 작업들이 모두 redo log에 저장이됩니다. 이 상태에서는 redo log가 급속도로 switch되므로, Archive log mode에서만 가능합니다.
--> DB가 open중에도 백업이 가능하다고는 하지만 부하를 굉장이 많이 일으키므로, 사용자가 적은 시간대에 하는게 좋습니다.
실습하기(포스트 마지막의 스크립트를 이용하시면 간단하게 하실수 있어요)
1. 닫힌 백업
첫번째, 필요한 파일들 확인하기 (control file, data file, redo log file)
select name from v$controlfile;
select name from v$datafile;
select member from v$logfile;
두번째, shutdown 하기
세번째, 첫번째 단계에서 확인한 파일들을 모두 backup할 경로에 복사하기
2. 열린 백업 (data file, control file)
* 여기서 control file은 복사하지 않고, alter database backup control 명령을 통해서 oracle에서 직접 백업해주는 방법입니다.
첫번째, 필요한 파일들 확인하기
select tablespace_name, file_name from dba_data_files;
두번째, 테이블스페이스마다 열린 백업실시하기
alter tablespace users begin backup;
!cp /home/oracle/oradata/testdb/users*.dbf /data/backup/open/2012-02-04/
* 테이블스페이스에 여러개의 datafile이 있을 수 있는데, 다 복사해줘야합니다.
alter tablespace users end backup;
위 과정을 모든 tablespace마다 일일히 해주세요.
세번째, 혹시나 end backup하지 않은 tablespace가 있나 확인하기
SQL> col name for a50 col status for a15 select a.file#, a.name, b.status, to_char(b.time,'rrrr-mm-dd:hh24:mi:ss') as time from v$datafile a, v$backup b where a.file# = b.file#; FILE# NAME STATUS TIME ---------- -------------------------------------------------- --------------- ------------------- 1 /home/oracle/oradata/testdb/system01.dbf NOT ACTIVE 2012-02-03:07:30:24 2 /home/oracle/oradata/testdb/undotbs01.dbf NOT ACTIVE 2012-02-03:07:30:24 3 /home/oracle/oradata/testdb/sysaux01.dbf NOT ACTIVE 2012-02-03:07:30:24 4 /home/oracle/oradata/testdb/users01.dbf NOT ACTIVE 2012-02-03:07:30:24 5 /home/oracle/oradata/testdb/example01.dbf NOT ACTIVE 2012-02-03:07:30:24위 의 상태처럼 모든 STATUS가 NOT ACTIVE이어야 합니다., ACTIVE이면 해당 tablespace를 end backup해주세요.
네번째, control file backup하기
SQL> alter database backup controlfile to '______/name.ctl';
참고 스크립트(출처 : oracle 취업반 26기 까페 http://cafe.daum.net/star-oracle )
path입력시 : /backup/ 형식으로 써주세요
cold backup
cp /home/oracle/oradata/testdb/control01.ctl /backup/
결과가 나와서 복사해서 쓰시면 됩니다.
** 위 쿼리를 실행시키면
이런 결과가 나오는데, 파일에 복사해서 쓰시면 됩니다.