이 글에서는 Oracle Database에 심각한 장애가 발생 했을 때 복구에 필요한 Archive Log를 기록하는 방법에 대해서 소개합니다.
작업 환경
이 글의 내용은 다음 글에서 설치한 Oracle Database 서버에서 확인했습니다.
Archive Mode 현재 상태 확인 하기
NOARCHIVELOG는 Archive Mode가 비활성 상태를 의미합니다.
ARCHIVELOG는 ArchiveMode가 활성 상태를 의미 합니다.
sqlplus명령으로 SYSDBA 권한을 가진 사용자로 접속합니다.
C:\>sqlplus / as sysdba
다음과 같이 Archive Mode의 현재 상태 확인 SQL문을 실행합니다. 실행 결과는 NOARCHIVELOG, 즉 Archive Mode가 비활성 상태입니다.
SQL> select log_mode from v$database;
LOG_MODE
------------------------
NOARCHIVELOG
참고로 오류 발생 케이스에 대한 다음 글을 먼저 읽어 보길 바랍니다.
Archive Mode 활성(ARCHIVELOG) 상태로 변경하기
NORMAL , IMMEDIATE 또는 TRANSACTIONAL 옵션을 사용하여 데이터베이스 인스턴스를 종료합니다 .
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
인스턴스를 시작하고 데이터베이스를 마운트합니다.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1946157056 bytes
Fixed Size 8748328 bytes
Variable Size 570426072 bytes
Database Buffers 1358954496 bytes
Redo Buffers 8028160 bytes
Database mounted.
데이터베이스를 ARCHIVELOG 모드로 변경합니다.
SQL> alter database archivelog;
Database altered.
데이터베이스를 Open 합니다.
SQL> alter database open;
Database altered.
다음 SQL문으로 ARCHIVELOG 모드로 변경 상태를 확인 합니다.
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination C:\app\oracle\product\12.2.0\dbhome_1\RDBMS
Oldest online log sequence 3
Next log sequence to archive 5
Current log sequence 5
SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
Archive Mode 비활성(NOARCHIVELOG) 상태로 변경하기
NORMAL , IMMEDIATE 또는 TRANSACTIONAL 옵션을 사용하여 데이터베이스 인스턴스를 종료합니다 .
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
인스턴스를 시작하고 데이터베이스를 마운트합니다.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1946157056 bytes
Fixed Size 8748328 bytes
Variable Size 570426072 bytes
Database Buffers 1358954496 bytes
Redo Buffers 8028160 bytes
Database mounted.
데이터베이스를 ARCHIVELOG 모드로 변경합니다.
SQL> alter database noarchivelog;
Database altered.
데이터베이스를 Open 합니다.
SQL> alter database open;
Database altered.
다음 SQL문으로 NOARCHIVELOG 모드로 변경된 결과를 확인 합니다.
SQL> archive log list
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination C:\app\oracle\product\12.2.0\dbhome_1\RDBMS
Oldest online log sequence 3
Current log sequence 5
SQL> select log_mode from v$database;
LOG_MODE
------------
NOARCHIVELOG
ArchiveLog 이해하기
데이터베이스의 Archive Mode가 활성 중인 경우에 데이터 변경 기록을 출력합니다. 즉, Archive Log는 데이터의 업데이트 내역이 기록 된 로그입니다. Archive Mode가 비활성 중인 경우 업데이트 내역을 기록하지 않습니다.
Archive Log를 출력하는 목적은 데이터베이스의 장애가 발생했을 때 가장 최근의 성공한 업데이트 내역까지 복구를 하고자 함 입니다. 이는 Archive Mode를 비활성으로 상업 목적 Database를 구축한다면 얼마나 심각한 문제를 발생 시키는 지를 다음 스토리 읽고 생각해보십시오.
3천명 정도의 학생이 다니고 있는 어떤 대학이 학사 관리 시스템의 데이터를 Oracle Database 12c 서버로 구축했습니다. 학생들의 출석 , 성적 , 신상 정보 등의 데이터가 매일 대량으로 실시간 추가,변경,삭제되고 있습니다. 그리고 언젠가 발생할지 모르는 장애 복구를 위해 매일 새벽 4시에 데이터의 업데이트가 발생하지 않도록 학사 관리 시스템을 Offline으로 변경 하고 학사 데이터의 전체 백업을 실행합니다. 그리고 새벽 6시에 Online으로 변경해 학사 관리 시스템을 사용할 수 있도록 합니다. 백업은 과거 7일 분까지 보관하고 있습니다. 그리고 데이터베이스의 성능을 최대로 끌어올리기 위해 Archive Mode를 비활성으로 설정 합니다.이 시스템은 3년 정도 운영하다가 어느 날 오후 3시에 학사 데이터를 저장하는 하드웨어의 고장이 발생했습니다. 하드웨어는 오후 5시에 교체 했습니다. 이 결과 학사 데이터를 그날 새벽 4시에 받은 백업 파일을 이용해 복구했습니다. 이 학교는 그날 새벽 6시부터 오후 3시까지 발생한 모든 학사 기록을 잃게 됩니다.
위의 스토리는 Archive Mode를 활성으로 설정하고 학사 데이터를 저장하는 하드웨어와 물리적으로 다른 하드웨어에 아카이브 로그를 출력 한다면 다음과 같은 스토리로 바뀝니다.
… 백업은 과거 7일분까지 보관하고 있습니다.
그리고 Archive Mode를 활성으로 설정 합니다.이 시스템은 3년 정도 운영하다가 어느 날 오후 3시에 학사 데이터를 저장하는 하드웨어의 고장이 발생했습니다. 하드웨어는 오후 5시에 교체 했습니다. 이 결과 학사 데이터를 그날 새벽 4시에 받은 백업 파일을 이용해 복구했습니다. 그리고 고장 나지 않은 하드웨어에 저장된 Archive Log 기록으로 그날 새벽 6시부터 오후 3시까지 발생한 모든 학사 기록을 복구하게 됩니다. 오후 6시에 이전 데이터의 손실 없이 학사 시스템은 정상 운영을 시작합니다.
이 스토리는 상업용 시스템에서 Archive Mode 활성이 얼마나 중요한 지를 보여 주고 있습니다. 하지만 개인 연습, 교육, 개발 또는 테스트, 조사 등의 환경에서는 제한된 데이터 저장 공간과 처리 성능을 가지고 만족한 결과를 얻고 싶어 하기 때문에 Archive Mode를 비활성으로 사용 하기도 합니다.