Oracle은 백업과 관련해 2가지 모드의 DB 운영 방식을 제공합니다.
바로 Archive Log 모드와 No Archive Log 모드입니다.
oracle 백업 복구의 핵심은 Redo Log입니다. 사용자들이 수행하는 모든 변경사항들을 Redo Log에 저장해 두고 복구가 필요하면 Redo Log를 뒤져서 찾아냅니다.
만약 사용자가 어떤 테이블에 A라는 데이터를 입력했다고 해봅시다. 그럼 Redo Log Buffer에 A가 먼저 입력되고, DB Buffer Cache에 A가 입력됩니다. 사용자가 commit하면 Redo Log Buffer에 있는 내용이 Redo Log File에 SCN과 함께 기록되고 Redo Log Buffer에서 해당 내용이 지워집니다. 그리고 때마침 Log Switch가 발생해서 다음 Group으로 넘어가게 되면 checkpoint가 발생해 DB Buffer Cache에 있던 A가 Data File에 저장되고 CKPT 프로세스가 Data File Header와 Control File에 해당 checkpoint SCN을 기록합니다.
이어서 B, C가 차례로 입력되고 commit되어 log switch가 발생하고 Data File에 B가 기록되고 Data File과 Control File에 B의 SCN이 기록됩니다.
그리고 이어서 D가 입력될 때를 생각해 봅시다.
A가 들어있던 Redo Log File은 Status가 inactive이기 때문에 LGWR은 기본적으로 A를 D로 덮어쓰게 됩니다.
E가 입력될 때도 마찬가지로 B가 들어있던 Redo Log File이 E로 덮어 써지게 됩니다.
위 과정을 거치면 Data File에는 A, B, C, D, E 5개의 데이터가 들어있게 됩니다.
만약 Data File이 삭제되었다면 어떻게 복구할까요?
Data File의 SCN이 1번이고, Control File의 SCN이 5번이라면 Server Process는 Control File의 SCN을 기준으로 차이가 나는 부분을 Redo Log File의 내용을 이용해서 복구를 시도합니다.
부족한 2, 3, 4, 5번의 작업들을 Redo Log File에서 찾아서 Data File에 반영시켜야 합니다. 문제는 2번 작업을 5번 작업이 덮어 써버렸기 때문에 2번 작업을 알 수가 없다는 겁니다. 이런 경우처럼 Redo Log File을 덮어쓰는 경우를 No Archive Log Mode
라고 부르고 Oracle을 처음 설치하면 기본 모드입니다. 이럴 경우 2번 이후로는 전부 복구가 되지 않습니다. Oracle은 항상 복구를 순차적으로 하기 때문에 중간에 Log File이 비어 버리면 그 빈 파일 다음부터는 복구를 할 수 없습니다.
이런 문제를 막기 위해 Log File을 덮어쓰기 전에 다른 곳으로 복사를 해 두고 덮어 쓰는 방법이 Archive Log Mode
입니다. 복사해 두는 장소가 바로 Archive Redo Log File
입니다.
안정적인 면에서 본다면 당연히 Archive Log Mode
가 좋으나 단점이 몇 가지 존재합니다.
Archive hang
(Archive Log File이 가득 차게 되면 archive를 중단하게 되며 DB가 중단되는 현상)이 발생할 수 있습니다.no archive log mode -> archive log mode로 변경하기
SQL> shutdown immediate;
$ vi $ORACLE_HOME/dbs/init<SID>.ora
log_archive_start=true
log_archive_dest_1='location=/data/arc1'
log_archive_dest_2='location=/data/arc2'
log_archive_format=%s_%t_%r.arc
:wq!
SQL> startup mount
SQL> archive log list;
SQL> alter database archivelog;
SQL> alter database open;
4번 과정에서 archive log mode를 활성화 하지만, 2번 과정을 거치는 이유는 저장 경로를 별도로 지정해야 하기 때문입니다. 기본적으로 파라미터 파일에는 archive log file의 저장 경로로 db_recovery_file_dest
파라미터의 값인 $ORACLE_BASE/flash_recovery_area
으로 설정됩니다. 이 디렉토리에는 몇 가지 종류의 파일이 자동 저장되는데 archive redo log
, flashback log
, rman backup file
입니다. 이 파일들은 모두 용량이 큰 파일들인데 문제는 이 디렉토리의 크기가 db_recovery_file_dest_size
에 설정된 값으로 기본값이 2G
밖에 되지 않기 때문에 금방 용량이 가득차 DB가 중단되게 됩니다. 그래서 일반적으로 DB를 운영할 때는 Archive Log 저장 경로를 다른 디스크나 경로로 설정합니다.
참고