RAC와 단일 DB 간 복제
실습 RAC CDB에서 단일 CDB의 PDB로 보내는 구성과 소스, 타깃 준비, 통합 캡처 및 예상 결과
#핵심 요약
실습에서는 두 인스턴스 RAC의 PDB를 소스, 단일 인스턴스 CDB의 PDB를 타깃으로 사용함
RAC 한 노드에 Integrated Extract, Pump를 두고 타깃에는 별도 Manager, Replicat을 둠
초기 데이터는 양쪽에 같은 EMP 구조와 14행을 직접 준비한 뒤 이후 변경을 비교함
별도 구성 초안은 설치, 복제 결과를 예상 결과로 명시하며 실제 수행 완료 기록이 아님
#개념과 동작 원리
| 항목 | 소스 RAC | 타깃 단일 DB |
|---|---|---|
| 컨테이너 | 애플리케이션 EMP는 소스 PDB에 배치 | 적용 대상은 타깃 PDB |
| 계정 | CDB 루트에서 등록할 공통 관리 사용자와 대상 테이블 소유자 준비 | PDB 적용 계정, 체크포인트 생성 권한, 대상 DML 권한 준비 |
| 로깅 | ARCHIVELOG, FORCE LOGGING, 최소 보충 로깅과 테이블 TRANDATA | 이 단방향 실습에서는 소스와 같은 로깅 작업을 타깃에 나열하지 않음 |
| 파라미터 | ENABLE_GOLDENGATE_REPLICATION과 STREAMS_POOL_SIZE를 SID='*'로 설정 | ENABLE_GOLDENGATE_REPLICATION 확인 |
| 연결 | PDB용 접속과 CDB 루트용 접속 구분 | 타깃 PDB 접속과 Manager, Collector 포트 준비 |
| 이름 지정 | PDB.스키마.테이블의 3단계 소스 이름 | 타깃 PDB에 연결한 뒤 스키마.테이블 지정 |
실습에서는 CDB 소스에서 Integrated Extract를 사용하며 DB 로그마이닝 서버가 두 리두 스레드의 변경을 통합한다고 설명함 단일 노드 설치는 실습 구성이며 해당 노드 장애 시 Extract 자동 이전을 검증한 고가용성 구성은 아님 두 문서의 19.3, 19.26 언급과 별도 초안의 RU 미적용 설명을 한 환경의 실행 버전으로 합치지 않았음 실제 VERSION_FULL, OPatch 출력은 확인 불가
#필수 명령어 또는 SQL
SELECT inst_id, instance_name, version_full
FROM gv$instance
ORDER BY inst_id;
SELECT log_mode, force_logging, supplemental_log_data_min
FROM v$database;
SELECT inst_id, name, value
FROM gv$parameter
WHERE name IN ('enable_goldengate_replication', 'streams_pool_size')
ORDER BY inst_id, name;결과 해석: 실습 준비 상태는 ARCHIVELOG, YES, YES이며 두 인스턴스의 복제 파라미터 확인을 요구함 후속 준비표의 셋 다 YES 표현은 LOG_MODE와 맞지 않음
ALTER SYSTEM SET enable_goldengate_replication = TRUE SCOPE = BOTH SID = '*';
ALTER SYSTEM SET streams_pool_size = 256M SCOPE = BOTH SID = '*';
ALTER DATABASE FORCE LOGGING;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;결과 해석: 실습에서는 설정 후 양 인스턴스 값을 조회하도록 하며 해당 값이 모든 환경의 권장 크기인지는 확인 불가
ADD TRANDATA <SCHEMA>.empREGISTER EXTRACT EXT1 DATABASE CONTAINER (<PDB_NAME>)
ADD EXTRACT EXT1, INTEGRATED TRANLOG, BEGIN NOW
ADD EXTTRAIL ./dirdat/lt, EXTRACT EXT1, MEGABYTES 200결과 해석: 설치, 동기화 실습의 주석은 보충 로깅 활성화와 Extract 등록을 제시하며 별도 구성 초안은 이를 수행 예정 절차로 분류함
EXTTRAIL ./dirdat/lt
LOGALLSUPCOLS
UPDATERECORDFORMAT COMPACT
TRANLOGOPTIONS INTEGRATEDPARAMS (MAX_SGA_SIZE 200, PARALLELISM 1)
TABLE <PDB_NAME>.<SCHEMA>.emp;MAP <PDB_NAME>.<SCHEMA>.emp, TARGET <SCHEMA>.emp;결과 해석: Pump는 로컬 lt를 PASSTHRU로 타깃 rt에 전달하고 Replicat은 타깃 PDB에서 해당 EMP에 적용함
INFO ALLINFO EXTRACT EXT1
STATS EXTRACT EXT1, TOTALSTATS REPLICAT REP1, TOTAL결과 해석: 실습에서는 Oracle Integrated Redo Logs 체크포인트와 두 인스턴스에서 각각 만든 UPDATE, INSERT, DELETE의 타깃 반영을 확인하도록 함 초기 14행에서 1행 추가, 1행 삭제 후 14행이라는 값은 실습 예시이며 현재 환경에서 재현한 결과가 아님
#설치, Manager, Pump, Replicat
inventory_loc=/home/oracle/oggInventory
inst_group=dbamkdir -p /u01/app/oracle/goldengate/19c
cd /home/oracle/fbo_ggs_Linux_x64_shiphome/Disk1
./runInstaller -silent -waitforcompletion INSTALL_OPTION=ORA19c SOFTWARE_LOCATION=/u01/app/oracle/goldengate/19c -invPtrLoc /home/oracle/oraInst_ogg.loc START_MANAGER=false결과 해석:
<NODE1>은 Grid 중앙 인벤토리와 섞이지 않게 OGG 전용 인벤토리를 쓰고, 타깃은 기존 /etc/oraInst.loc를 씀
양쪽 모두 Successfully Setup Software.로 끝났음
.bash_profile의 LD_LIBRARY_PATH에 $ORACLE_HOME/lib가 빠지거나 순서가 틀리면 libnnz19.so 로딩 오류가 남
PORT 7809
DYNAMICPORTLIST 7810-7820
ACCESSRULE, PROG *, IPADDR *, ALLOW
AUTORESTART REPLICAT *, RETRIES 5, WAITMINUTES 1
PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 3EXTRACT PMP1
RMTHOST <TARGET_HOST>, MGRPORT 7809
RMTTRAIL ./dirdat/rt
PASSTHRU
TABLE <PDB_NAME>.<SCHEMA>.emp;ADD CHECKPOINTTABLE <OGG_USER>.ggs_checkpoint
-- EDIT PARAMS REP1
REPLICAT REP1
USERID <OGG_USER>@<TARGET_PDB_ALIAS>, PASSWORD <PASSWORD>
MAP <PDB_NAME>.<SCHEMA>.emp, TARGET <SCHEMA>.emp;
ADD REPLICAT REP1, EXTTRAIL ./dirdat/rt, BEGIN NOW, CHECKPOINTTABLE <OGG_USER>.ggs_checkpoint
START REPLICAT REP1결과 해석:
PMP1이 타깃 Manager(7809)에 붙어야 하므로 타깃 Manager를 먼저 띄우고, ACCESSRULE이 없으면 PMP1 접속이 거부될 수 있다고 수업 자료는 적음
PASSTHRU는 DB에 다시 접속하지 않고 트레일만 넘기므로 Pump 파라미터에 USERID가 없음
소스 DB의 캡처 상태는 SELECT capture_name, status FROM dba_capture로 보며 실습에서는 OGG$CAP_EXT1 ENABLED였음
타깃 $OGG_HOME/dirdat에 rt000000000이 생겼는지 보고, 없으면 PMP1 전송을 점검함
이후 패치 때는 소스 GGSCI에서 STOP EXTRACT * → STOP MGR, 패치(datapatch 포함) 뒤 START MGR → START EXTRACT * 순서임
#두 인스턴스 변경 확인
| 소스 작업 | 접속 인스턴스 | 타깃 결과 |
|---|---|---|
UPDATE emp SET sal = 9999 WHERE empno = 7788 |
<INSTANCE1> |
7788 SAL 9999 |
INSERT INTO emp VALUES (9001, 'RACTEST', ...) |
<INSTANCE2> |
9001 생김 |
DELETE FROM emp WHERE empno = 7934 |
<INSTANCE2> |
7934 사라짐 |
실습 기록: 10~20초 뒤 타깃에서 위 결과가 보였고 건수는 14 + 1 - 1 = 14, STATS REPLICAT REP1, TOTAL은 inserts 1, updates 1, deletes 1이었음<INSTANCE2> 변경은 thread 2 리두에 기록되지만 두 thread가 공유 저장소에 있어 <NODE1>의 Integrated Extract가 SCN 순서로 합쳐 읽음
#사용 조건과 주의사항
소스에서 타깃 Manager와 Collector로 연결하는 경로와 PDB READ WRITE, 문자셋을 확인하는 것이 실습 준비 범위임
실습 Manager의 ACCESSRULE, PROG *, IPADDR *, ALLOW(모든 주소 허용)와 방화벽 전체 비활성화는 실습 조건이며, 운영에서는 소스 주소로 좁힘
설치 디렉터리는 /u01/app/oracle/goldengate/19c임