본문 바로가기
Database/Fundamental

[Oracle] Supplemental Logging 개념과 사용법

by BestUgi 2019. 5. 17.

오라클 본연의 리두 로그(Redo Log)는 DML이 발생하는 경우 오직 변경된 컬럼의 데이터에 대해서만 Undo(변경 전 데이터)와 Redo(변경 후 데이터) 정보를 남긴다(=Physiological Logging). 반면 Supplemental Logging(Default=Disabled)은 DML 발생시 리두 로그에 추가적인 데이터를 남긴다. 리두 로그는 기본적으로 Instance Recovery 혹은 Media Recovery를 위해서 사용하는데 이러한 복구 동작을 수행하는 과정에서 Supplemental Logging 기능은 사실상 필요 없다.

 

그렇다면 Supplemental Logging은 누가 왜 사용하는 것일까~?

[그림 1] Supplemental Logging을 사용하지 않을 경우 REDO LOG

위의 [그림 1]에서 Physiological Logging에서 리두 로그에 쓰이는 데이터를 표시한다. UPDATE DML 수행 시 실제 변경되는 컬럼(C3)에 대한 변경 전 데이터(old value, undo data)와 변경 후 데이터(new value, redo data)와 rowid가 리두 로그에 적재된다. rowid를 사용해서 로우를 구분할 수 있는가~? 물론 일시적으로 가능하지만 다음과 같은 경우에는 사용이 불가능하다. 

  • 로우가 삭제되거나 다시 추가될 경우 rowid는 변경될 수 있다. 또한 row movement가 허락될 경우에도 rowid는 변경될 수 있다. (참고)
  • DB 복제 솔루션(e.g. CDC)에 의해서 복제 DB로 해당 로우가 복제될 경우 복제된 로우의 rowid는 원본 rowid와 다를 수밖에 없다.

이러한 이유로 인해 LogMiner(참고)와 DBMS 복제 솔루션들은 Supplemental Logging을 사용하여 변경된 로우의 키 컬럼(로우를 식별할 수 있는 컬럼으로 주로 PK, UK)의 논리적인 값을 얻기 위해 주로 사용된다(물론 키 컬럼 이외의 다른 컬럼의 Before Image를 응용하길 원하는 프로그램이 있을 수 있다).

 

Supplemental Logging을 수행하면 변경된 로우의 모든 컬럼에 대한 정보(Undo, Old value)를 남긴다고 생각하는 사람들도 있지만 실제는 그렇지 않다. 기본적으로 변경된 데이터와 사용자가 Supplemental Logging 생성시 지정한 컬럼들에 대해서만 Before 이미지가 남는다. (물론 Supplemental Logging을 전체 컬럼에 대해서 모두 생성할 수 있지만, 그렇게 할 경우 리두 로그의 크기가 커지고 DB 성능에 영향을 줄 것이다.)

 

 

"Supplemental Logging 종류"

 

Supplemental Logging은 아래의 [그림 2]와 같이 분류할 수 있다. Database Level은 Database의 모든 테이블에 적용하는 것이고, Table Level은 특정 테이블에만 Supplemental Logging을 적용하는 것이다.

 

Oracle의 Supplemental Logging 분류

각 Supplemental의 특징과 사용 방법을 간단하게 표로 정리하고자 한다. 

Oracle의 Supplemental Logging의 분류와 설명

Supplemental Logging 사용 시 CLOB, BLOB, LONG, LONG RAW, ADT 데이터 타입에 대해서는 로깅 데이터가 생성되지 않는다. 또한, 복수의 Supplmental Logging을 적용이 가능하다.

 

Database-Level Identification Key Logging을 적용할 경우 암묵적으로 Minimal Supplemental Logging이 적용된다. 

 

Database-Level의 Supplemental Logging을 제거하는 방식은 아래의 쿼리를 사용하면 된다. 주의할 점은 Minimal Supplemental Logging을 가장 마지막에 제거해 주어야 한다는 것이다.

  • ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (ALL) COLUMNS
  • ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS
  • ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS
  • ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS
  • ALTER DATABASE DROP SUPPLEMENTAL LOG DATA

Table-Level의 Supplemental Logging을 제거하는 방법은 아래의 쿼리를 사용하면 된다.

  • ALTER TABLE S.T DROP SUPPLEMENTAL LOG DATA (ALL) COLUMNS
  • ALTER TABLE S.T DROP SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS
  • ALTER TABLE S.T DROP SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS
  • ALTER TABLE S.T DROP SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS
  • ALTER TABLE S.T DROP SUPPLEMENTAL LOG GROUP T_SUPP_1;

댓글