데이터베이스 연구실.log

DDL 복제와 제외 조건

실습의 DDL 전달과 DROP 제외 설정, 소스, 타깃 불일치 및 DDL 지원 객체 설치의 적용 조건

marker_setup.sqlGGS_DDL_TRIGGER_BEFOREOGG-10452DDLINCLUDEEXCLUDEDROPDDLOPTIONS

#핵심 요약

실습에서는 DDL INCLUDE MAPPED와 INCLUDE ALL을 별도로 지정해 CREATE, DROP 전달을 실습함

Extract의 EXCLUDE OPTYPE DROP은 DROP을 전달 대상에서 제외하는 예제임

DROP을 제외하면 타깃에 기존 객체가 남으므로 같은 이름의 객체를 다시 만드는 경우를 운영상 주의점으로 적음

#개념과 동작 원리

구간 설정과 확인 방법
소스 DDL 지원 객체 마커, DDL 이력, 메타데이터 객체와 GGS_DDL_TRIGGER_BEFORE 상태 확인
소스 Extract DDL INCLUDE MAPPED와 DDLOPTIONS REPORT
Pump 본문은 USERID, DDL INCLUDE ALL, 참고 문서는 PASSTHRU 대안
Replicat DDL INCLUDE ALL과 DDLOPTIONS REPORT
DROP 제외 DDL INCLUDE MAPPED EXCLUDE OPTYPE DROP

실습은 트리거 기반 DDL 캡처를 위해 marker_setup.sql, ddl_setup.sql, role_setup.sql, ddl_enable.sql을 설치하며, 캡처 방식, 버전별로 이 설치가 필요한지는 확인 불가 객체 수 약 30개와 트리거 ENABLED를 모든 GoldenGate 환경의 설치 완료 기준으로 사용할 수 있는지는 확인 불가

#필수 명령어 또는 SQL

소스 SQL*Plus (SYS)조회만 함
SELECT trigger_name, status
  FROM dba_triggers
 WHERE trigger_name = 'GGS_DDL_TRIGGER_BEFORE';

결과 해석: 주석은 활성화 후 ENABLED, 비활성화 후 DISABLED를 제시함

소스 EXT1 파라미터 (DDL 전달)객체 또는 설정을 변경함
DDL INCLUDE MAPPED
DDLOPTIONS REPORT
TABLE scott.*;
타깃 REP1 파라미터의 DDL 전달 부분객체 또는 설정을 변경함
DDL INCLUDE ALL
DDLOPTIONS REPORT

결과 해석: DDLOPTIONS REPORT는 실습 EXT1, REP1에 제시되고 Pump에는 DDL INCLUDE ALL이 제시됨 CREATE 후 타깃 객체와 삽입 행이 보이고 DROP 후 양쪽에서 객체가 없어지는 것으로 주석에 적혀 있음 실제 전체 실행 로그는 기재 없음

소스 EXT1 파라미터 (위 DDL 설정을 DROP 제외로 교체)객체 또는 설정을 변경함
DDL INCLUDE MAPPED EXCLUDE OPTYPE DROP
DDLOPTIONS REPORT
TABLE scott.*;
소스 GGSCI조회만 함
VIEW REPORT EXT1

결과 해석: 실습에서는 CREATE는 타깃에 전달되고 DROP 이후에도 타깃 객체가 남는 것을 확인하도록 함 리포트에서 OGG-10452와 제외된 DROP 기록을 찾도록 안내하지만 실제 메시지 전문은 기재 없음

#DDL 지원 객체 설치 (트리거 방식 실습)

소스 SQL*Plus (SYSDBA)객체 또는 설정을 변경함
SELECT username, default_tablespace FROM dba_users WHERE username = '<OGG_USER>';

CREATE TABLESPACE ggate DATAFILE '<DATA_DIR>/ggate01.dbf'
  SIZE 200M AUTOEXTEND ON NEXT 50M MAXSIZE 2G;
ALTER USER <OGG_USER> DEFAULT TABLESPACE ggate;
ALTER USER <OGG_USER> QUOTA UNLIMITED ON ggate;

-- $OGG_HOME에서 SQL*Plus 실행, 스키마 이름을 물으면 복제 계정 입력
@marker_setup.sql
@ddl_setup.sql
@role_setup.sql
GRANT GGS_GGSUSER_ROLE TO <OGG_USER>;
@ddl_enable.sql

SELECT owner, object_name, object_type FROM dba_objects WHERE object_name LIKE 'GGS%' ORDER BY owner, object_name;

결과 해석:

객체 역할
GGS_MARKER marker_setup.sql이 만드는 마커 테이블
GGS_DDL_HIST 잡은 DDL을 기록하는 이력 테이블
GGS_DDL_OBJECTS, COLUMNS, RULES DDL 대상과 메타데이터 관리
GGS_SETUP, GGS_STICK 설치 상태 관리
SYS.GGS_DDL_TRIGGER_BEFORE DDL을 가로채는 핵심 트리거

복제 계정의 기본 테이블스페이스가 USERS면 설치가 되지 않는다고 수업 자료는 적어, 전용 테이블스페이스를 먼저 만들고 기존 세그먼트가 있으면 ALTER TABLE ... MOVE TABLESPACE ggate로 옮김

트리거 켜기, 끄기는 @ddl_enable.sql, @ddl_disable.sql, 제거는 @ddl_remove.sql, @marker_remove.sql

Pump(PMP1)에도 DDL INCLUDE ALL을 넣고 EXT1, PMP1, REP1을 다시 기동함

#실습 순서와 기대 결과

단계 내용 기대 결과
백업 CREATE TABLE system.emp_bk AS SELECT * FROM scott.emp DROP 실습 뒤 되살릴 데이터
CREATE 전달 소스에서 CREATE TABLE ddl_test ..., 1건 INSERT, COMMIT 타깃에 손대지 않은 DDL_TEST와 1건이 생김
DROP 전달 소스에서 DROP TABLE emp PURGE 타깃에서도 EMP가 사라짐
복구 전달 소스에서 PK, FK가 있는 EMP를 다시 만들고 백업 데이터를 넣음 타깃에도 같은 건수와 PK_EMP, FK_DEPTNO가 생김
DROP 제외 EXT1을 EXCLUDE OPTYPE DROP으로 바꾸고 ddl_test2 생성 뒤 DROP 소스에서는 사라지고 타깃에는 남음, VIEW REPORT EXT1에 OGG-10452

원상복구는 EXT1, REP1(그리고 Pump)에서 DDL 줄을 지우고 재기동, @ddl_disable.sql 뒤 트리거가 DISABLED인지 확인, 실습 테이블과 백업 테이블 삭제, 양쪽 emp 건수를 처음 값과 비교하는 순서임

#사용 조건과 주의사항

실습에서는 EXCLUDE 단독 사용 시 ABEND, 예외는 DDL EXCLUDE ALL이라고 설명함(버전별 구문은 확인 불가) DDL EXCLUDE ALL은 DDL 전달을 제외하면서 메타데이터는 유지하는 설정으로 설명됨
DDL 관련 줄을 모두 지우는 것과는 동작이 다름 Replicat에서 DROP을 제외하면 소스 트레일에는 남고 적용 때 제외된다고 실습에서는 설명함 DROP 제외 후 타깃에 남은 옛 데이터와 재생성 객체 사이의 불일치, 중복 키 가능성이 경고되지만 재생성 시 모든 경우가 동일하게 실패하는지는 확인 불가 USERID 참고는 PASSTHRU 대안을 설명하며 본문의 USERID 방식과 혼합한 전체 설정은 제공하지 않음 원상복구는 EXT1, REP1의 DDL 줄 삭제만 적어 Pump의 DDL 설정 복구가 빠져 있고, DEPT PK 재추가도 기존 제약 상태 확인이 부족함

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기