본문 바로가기
Oracle/운영

Supplemental Logging

by 취미툰 2020. 10. 15.
반응형

Redo log file은 Instance recovery과 media recovery시에 일반적으로 사용됩니다. 이런 작업에 필요한 데이터는 리두 파일에 자동으로 기록됩니다. 하지만 리두 기반 애플리케이션(예: 로그마이너)에서는 기본적인 로깅 정보보다 추가적인 정보를 기록할 필요가 있습니다. 이런 추가적인 컬럼을 로깅하는 프로세스를 Supplemental Logging이라고 합니다.

 

기본적으로 오라클에서는 Supplemental Logging을 제공하지 않으며 로그마이너를 사용할 수 없습니다. 따라서 로그마이너에서 분석 할 로그 파일을 생성하기 전에 최소한의 Supplemental Logging을 활성화해야 합니다.

 

Supplemental log group은 Supplemental logging이 활성화될때 로깅 할 추가적인 컬럼의 집합입니다.

두가지 타입이 있습니다.

- Unconditional(무조건) supplemental log groups : 업데이트가 지정된 컬럼에 영향을 미쳤는지 여부에 관계없이  행이 업데이트될 때마다 지정된 컬럼의 사전 이미지가 기록됩니다. Always 로그 그룹이라고 부르기도 합니다.

- Conditional(조건부) supplemental log groups : 지정된 컬럼의 사전 이미지는 로그 그룹의 컬럼 중 하나 이상이 업데이트된 경우에만 기록됩니다.

Supplemental log group은 시스템에서 생성하거나 사용자가 정의해서 사용할 수 있습니다.

두 가지 유형의 Supplemental logging외에도 두 가지 Level의 Supplemental Logging이 있습니다.

 

 

출처 : https://bestugi.tistory.com/21

출처 : https://bestugi.tistory.com/21

 

Database Level Supplemental Logging

Minimal Supplemental Logging은 리두 로그 파일을 생성하는 데이터베이스에 오버헤드를 주지 않습니다.

Database-Level identification Key Logging을 활성화하면 리두 로그 파일을 생성하는 데이터베이스에 오버헤드가 발생할 수 있습니다. Oracle은 Minimal을 권장하고 있습니다.

 

Minimal Supplemental Logging 

로그마이너가 DML변경과 관련된 리두 작업을 식별,그룹화 및 병합하는데 필요한 최소한의 정보를 기록합니다. 이는 로그마이너가 클러스터 테이블 및 인덱스 구성 테이블과 같은 다양한 스토리지 배열 및 체인된 행을 지원하기에 충분한 정보를 가지고 있습니다. 아래의 SQL문으로 활성화 시킬 수 있습니다.

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

 

Database-Level identification Key Logging

리두로그 파일이 소스 데이터베이스 인스턴스에서 마이닝되지 않을 때(예: Standby데이터베이스에서 리두 로그파일이 마이닝 되는 경우)에는 해당 로깅이 필요합니다.

 

Database-Level identification Key Logging을 사용하면 ALTER DATABASE ADD SUPPLEMENTAL LOG 문 뒤에 옵션을 지정하여 모든 업데이트에 대해 데이터베이스 전체 사전 이미지 로깅을 활성화할 수 있습니다.

 

- ALL

이 옵션은 행이 업데이트 될때 해당 행의 모든 열(LOB,LONGs,ADT 제외)이 리두 로그 파일에 로깅되도록 지정합니다.

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

 

-PRIMARY

 이 옵션은 데이터베이스가 기본 키를 포함하는 행이 업데이트 될 때마다(기본키의 값이 변경되지 않은 경우에도) 리두 로그 파일에 행의 기본키의 모든 열을 로깅합니다.

 

테이블에 기본 키가 없지만 하나 이상의 not null unique index 키 제약 또는 인덱스 키가 있는 경우, 업데이트중인 행을 고유하게 식별하는 수단으로 로깅을 위해 Unique index 키 중 하나가 선택됩니다.

 

테이블에 기본키나 not null unique index 키가 없는 경우 LONG 및 LOB을 제외한 모든 열이 supplemental logging됩니다. 이는 ALL을 지정하는것과 같습니다. Oracle은 이옵션을 사용할 때 모든 또는 대부분의 테이블이 기본키 또는 Unique Index 키를 가지도록 권장하고 있습니다.

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;

 

-UNIQUE

이 옵션을 사용하면 복합 Unique 키 또는 비트맵인덱스에 속하는 열이 수정된 경우 데이터베이스가 해당 행의 복합 Unique 키 또는 비트맵 인덱스의 모든 열을 리두 로그 파일에 로깅합니다.

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;

 

-FOREIGN

이 옵션을 사용하면 외래 키에 속한 열이 수정된 경우 데이터베이스가 해당 행의 외래 키의 모든 열을 리두 로그 파일에 로깅합니다.

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS;

유의사항

- Identification Key Logging을 활성활 할 때 데이터베이스가 Open상태이면 커서 캐시안에 있는 모든 DML 커서가 무효화됩니다. 커서 캐시가 다시 채워질 때까지 성능에 영향을 미칠 수 있습니다.

- 데이터베이스 수준에서 Identification Key Logging을 활성화하면 Minimal이 암시적으로 활성화됩니다.

- Supplemental Logging은 누적됩니다. 아래 두 명령어를 실행했다면 Primary Key와 Unique Key모두 로깅이 활성화됩니다.

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;

 

Supplemental Logging 비활성화

아래의 명령어를 사용해서 비활성화시킬 수 있습니다.

ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA;

 

Table-Level Supplemental Logging

테이블 레벨 Supplemental Logging은 테이블레벨에서 Supplemental logging할 열을 지정합니다.

 

Table-Level identification Key Logging

데이터베이스 레벨의 identification key logging에서 제공되는 것과 동일한 옵션(ALL,PRIMARY KEY,FOREIGN KEY,UNIQUE KEY)를 제공합니다. 하지만 테이블 수준에서 지정하면 지정된 테이블만 영향을 받습니다. 예를들어 

아래의 SQL을 입력하면 데이터베이스 어느 테이블이든 열이 변경될 때마다 해당 열을 포함하는 전체 행(LOB,LONGS,ADTS 제외)이 로깅됩니다.

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

그러나 ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; 명령어를 수행하면 HR.EMPLOYEES가 변경된 경우에만 테이블의 전체 행(LOB,LONGS,ADTS제외)을 저장하고, 나머지 테이블은 열이 변경될 경우 변경된 열만 리두 로그 파일에 저장됩니다.

 

유의사항

- 해당 기능을 활성화 할 때 데이터베이스가 Open 상태이면 커서 캐시에서 해당 테이블에 대한 모든 DML 커서가 무효화됩니다. 이는 커서 캐시가 다시 채워질 때까지 성능에 영향을 미칠 수 있습니다.

- Supplemental Logging은 누적됩니다. 아래 두 명령어를 실행했다면 Primary Key와 Unique Key모두 로깅이 활성화됩니다.

ALTER TABLE HR.EMPLOYEES 
  ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER TABLE HR.EMPLOYEES 
  ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;

 

Table-Level User-Defined Supplemental Log Groups

해당 기능을 사용하여 Supplemental Logging 할 열을 지정할 수 있습니다. 다음과 같이 무조건적으로 또는 조건적으로 logging할 수 있습니다.

 

- User-defined unconditional log groups

해당 기능을 활성화하려면 ALWAYS 절을 추가하여 사용할 수 있습니다.

ALTER TABLE HR.EMPLOYEES
   ADD SUPPLEMENTAL LOG GROUP emp_parttime (EMPLOYEE_ID, LAST_NAME, 
   DEPARTMENT_ID) ALWAYS;

이것은 emp_parttime이라는 로그그룹을 만들어서 EMPLOYEE_ID,LAST_NAME,DEPARTMENT_ID컬럼을 포함하고 있습니다. UPDATE가 이러한 열에 영향을 주었는지 여부에 관계없이 테이블에서 UPDATE문이 실행될 때마다 기록됩니다. 

(LOB,LONG,ADT 컬럼은 제외됩니다.)

 

- User-defined conditional supplemental log groups

해당 옵션을 사용하려면 아래와 같이 ALWAYS절을 생략하여 사용합니다.

ALTER TABLE HR.EMPLOYEES
   ADD SUPPLEMENTAL LOG GROUP emp_fulltime (EMPLOYEE_ID, LAST_NAME, 
   DEPARTMENT_ID);

EMP_FULLTIME 이름으로 된 로그그룹이 생성됩니다. 그것은 EMPLOYEE_ID,LAST_TIME,DEPARTMENT_ID열로 구성되어 있고, ALWAYS절이 생략되었기 때문에 열 중 하나 이상이 업데이트 된 경우에만 열의 이전 이미지가 기록됩니다.

 

NO LOG옵션을 지정하여 로그그룹의 열이 Supplemental logging에서 제외되도록 명시적으로 지정할 수 있습니다.

NOLOG옵션을 사용하는 경우 다음 예와 같이 옵션 없이 로그 그룹에서 하나 이상의 열을 지정해야합니다.

 

ALTER TABLE HR.EMPLOYEES
   ADD SUPPLEMENTAL LOG GROUP emp_parttime(
   DEPARTMENT_ID NO LOG, EMPLOYEE_ID);

이렇게 하면 NO LOG 열을 수정하면 Supplemental Log Group의 다른 열이 Redo로그 파일에 배치되도록 이 열을 Supplemental Log Group의 다른 열과 연결할 수 있습니다.

예를들어. LONG 열이 변경될 경우, 그룹의 특정 열을 기록하려는 경우 이 방법이 유용할 수 있습니다.

LONG열 자체를 Supplemental Log할 수는 없지만, 같은 행에 있는 다른 열의 추가 로깅을 트리거하기 위해 해당 열에 대한 변경사항을 사용할 수 있습니다.

 

유의사항

- 열을 둘 이상의 Supplemental Log Group에 속하게 할 수 있습니다. 그러나 열의 사전 이미지는 한번만 기록됩니다.

- 조건부 및 무조건 로깅을 할 동일한 열을 지정하면, 무조건 로깅이 선택됩니다.

 

참고 : docs.oracle.com/database/121/SUTIL/GUID-D857AF96-AC24-4CA1-B620-8EA3DF30D72E.htm#SUTIL1582

반응형

'Oracle > 운영' 카테고리의 다른 글

RAC DB 운영매뉴얼  (0) 2020.10.27
Waiting for smon to disable tx recovery.(10.2.0.3 Shutdown 시 Alert log)  (0) 2020.10.19
UNDO(언두) Segment  (0) 2020.10.14
로그 마이너(Log Miner)  (0) 2020.10.12
테이블 단편화(Fragmentation)  (0) 2020.10.08

댓글