PostgreSQL 연계 복제
PostgreSQL 타깃의 복제 권한과 초기 적재, 설치 인증 조합, 포트, 재시도, 전환 절차는 확인 불가
#핵심 요약
실습에서는 Oracle용 GoldenGate의 로컬 트레일을 PMP3가 PostgreSQL용 GoldenGate에 전달하고 REPPG가 적용하는 단방향 구성임
PostgreSQL용 설치 홈, 환경변수, Manager, ODBC DSN은 Oracle용과 따로 준비함
타깃 스키마, 테이블, 체크포인트용 스키마는 먼저 만들고 자료형과 대소문자를 맞춤
연결 실습과 별도 스키마 이행 실습은 초기 데이터 경계 설정 방식이 다름
#개념과 동작 원리
| 구성 구간 | PostgreSQL 복제 환경과 설정 |
|---|---|
| 타깃 DB | PostgreSQL 15를 설치하고 5432 접속, 인증 규칙 확인 |
| 대상 준비 | 복제 계정, 대상 DB, SCOTT 스키마와 체크포인트용 별도 스키마 생성 |
| 객체 | EMP, DEPT를 미리 만들고 NUMBER는 정수, numeric, DATE는 timestamp로 대응 |
| PostgreSQL용 환경 | 별도 OGG_HOME, PATH, LD_LIBRARY_PATH, ODBCINI 설정 |
| ODBC | 실제 드라이버 파일과 DB, 호스트, 포트, 계정을 DSN에 연결 |
| 전달 | Oracle EXT1의 lt→PMP3→PostgreSQL용 홈의 rp→REPPG |
| 접속 구분 | Oracle의 TNS 별칭과 PostgreSQL용 ODBC SOURCEDB, TARGETDB를 구분 |
실습에서 실행한 GoldenGate 버전과 PostgreSQL 인증 조합은 기재 없음 보조 문서는 버전 조합을 인증 매트릭스로 확인하라고 적음(확인 불가) 사용자와 스키마는 별도로 준비하며 체크포인트용 스키마 누락 시 OGG-30055가 날 수 있다고 실습에서는 설명함
#주요 용어와 구성 요소
| 구문 | 의미 |
|---|---|
| PostgreSQL 전달 계정 | CONNECT, 스키마 USAGE, 대상 SELECT, 적용 DML 권한과 체크포인트용 CREATE 권한을 구분함 |
| AFTERCSN | 지정 CSN 이하 트랜잭션을 건너뛰고 그 다음부터 온라인 변경을 적용하는 시작 조건임 |
| 체크포인트 | 적용 위치 관리이며 초기 적재의 데이터 정합성 자체를 보증하는 기능은 아님 |
#필수 명령어 또는 SQL
| 항목 | 실행 조건 |
|---|---|
| 작업 대상 | Oracle 소스, 트레일, PMP3와 PostgreSQL DSN, REPPG, 체크포인트 |
| 필요 권한 | OS의 각 OGG 홈, 파일 권한, PG 전달 DML, 스키마 권한, 초기 객체, 체크포인트 생성 권한 구분 |
| 바꿀 입력값 | 각 홈, DSN, <OGG_USER>, 비밀번호, 호스트, 포트, 실제 트레일 Seqno, 기준 SCN |
| 결과 해석 | 기존 예시 값과 RUNNING을 정합성 완료로 보지 않으며 전체 초기 적재, 전환 결과는 기재 없음 |
| ODBC 항목 | 드라이버 및 접속 설정값 |
|---|---|
| Driver | 설치 홈 lib의 실제 공유 라이브러리 파일명, 경로 |
| Database, HostName, PortNumber | 타깃 DB, 접속 주소, 5432 |
| LogonID, Password | 복제 계정의 인증 정보 |
| ODBCINI | 작성한 odbc.ini의 위치와 환경변수 일치 |
ADD CHECKPOINTTABLE <SCHEMA>.ggs_checkpointINFO CHECKPOINTTABLE <SCHEMA>.ggs_checkpoint결과 해석: 실습에서는 테이블 생성 확인을 요구하며 INFO의 전체 출력은 기재 없음
RMTHOST <HOST>, MGRPORT 7909
RMTTRAIL ./dirdat/rp
TABLE scott.emp;
TABLE scott.dept;결과 해석: 실습에서는 PMP3가 기존 lt를 읽고 PostgreSQL용 Manager로 보내는 것으로 설명함 시퀀스 예시가 20과 24로 섞여 있고, 현재 파일 처음부터 읽는 것만으로 초기 적재 정합성이 확보되는 조건은 기재 없음
SETENV (PGCLIENTENCODING = "UTF8")
TARGETDB <SERVICE_NAME>, USERID <USERNAME>, PASSWORD <PASSWORD>
HANDLECOLLISIONS
MAP scott.emp, TARGET scott.emp;
MAP scott.dept, TARGET scott.dept;ADD REPLICAT REPPG, EXTTRAIL ./dirdat/rp, CHECKPOINTTABLE <SCHEMA>.ggs_checkpoint
START REPLICAT REPPG결과 해석: 실습 예시는 새 EMP 행의 INSERT, 급여 UPDATE 후 타깃 급여 6500.00을 주석으로 제시하며 현재 실행 결과가 아님
수업 자료의 REPPG에는 MAP scott.*, TARGET scott.*;도 함께 있으나 명시 MAP과 겹치므로 실제로 쓸 때 규칙 순서를 확인함
#PostgreSQL 쪽 준비
listen_addresses = '*'
port = 5432host all all 127.0.0.1/32 md5
host all all <CLIENT_NET>/24 md5systemctl restart postgresql-15
firewall-cmd --add-port=5432/tcp --permanent
firewall-cmd --reload
ss -lntp | grep 5432CREATE USER <OGG_USER> WITH PASSWORD '<PASSWORD>' SUPERUSER;
CREATE DATABASE <TARGET_DB_NAME> OWNER <OGG_USER>;
\c <TARGET_DB_NAME>
CREATE SCHEMA scott AUTHORIZATION <OGG_USER>;
CREATE SCHEMA <OGG_USER> AUTHORIZATION <OGG_USER>;
CREATE TABLE scott.emp (
empno integer PRIMARY KEY, ename varchar(10), job varchar(9), mgr integer,
hiredate timestamp, sal numeric(7,2), comm numeric(7,2), deptno smallint);
CREATE TABLE scott.dept (deptno integer PRIMARY KEY, dname varchar(14), loc varchar(13));
\dn
\dt scott.*결과 해석:
listen_addresses 기본값은 localhost라 밖에서 오는 접속을 받지 않고, 재기동해야 반영됨ss에 0.0.0.0:5432가 보여야 하며 127.0.0.1:5432만 보이면 재기동을 안 한 것임
pg_hba.conf는 위에서부터 먼저 맞는 줄이 적용되므로 기본 파일에 127.0.0.1/32 ident 줄이 있으면 md5로 고침
GoldenGate의 ODBC가 127.0.0.1로 붙어 첫 줄이 꼭 필요하고, 명부에 없으면 no pg_hba.conf entry로 거절됨
firewall-cmd는 --permanent와 --reload를 둘 다 해야 지금과 재부팅 뒤 모두 열림
PostgreSQL은 사용자를 만들어도 같은 이름의 스키마가 생기지 않아, 체크포인트용 <OGG_USER> 스키마를 빼면 ADD CHECKPOINTTABLE에서 OGG-30055가 남
따옴표 없는 이름은 모두 소문자로 저장되므로 수업처럼 전부 소문자로 통일함
PostgreSQL에는 scott 사용자가 없어 psql -U scott은 "password 인증 실패"로 응답하며, 조회용 계정이 필요하면 따로 만들고 GRANT USAGE, GRANT SELECT, ALTER DEFAULT PRIVILEGES FOR ROLE <OGG_USER>을 줌
#PostgreSQL용 GoldenGate 설치와 ODBC
mkdir -p /u01/app/oracle/goldengate/pg21
unzip <OGG_FOR_PG_ZIP> -d /u01/app/oracle/goldengate/pg21
cd /u01/app/oracle/goldengate/pg21
tar xvf ggs_Linux_x64_PostgreSQL_64bit.tar
ls -l ggsci
ls -l lib/*.soexport OGG_HOME=/u01/app/oracle/goldengate/pg21
export PATH=$OGG_HOME:$PATH
export LD_LIBRARY_PATH=$OGG_HOME/lib:$LD_LIBRARY_PATH
export ODBCINI=$OGG_HOME/odbc.ini[ODBC Data Sources]
<TARGET_DB_NAME>=PostgreSQL Wire Protocol
[ODBC]
IANAAppCodePage=4
InstallDir=/u01/app/oracle/goldengate/pg21
[<TARGET_DB_NAME>]
Driver=/u01/app/oracle/goldengate/pg21/lib/GGpsql25.so
Database=<TARGET_DB_NAME>
HostName=127.0.0.1
PortNumber=5432
LogonID=<OGG_USER>
Password=<PASSWORD>CREATE SUBDIRS
EDIT PARAMS MGR
-- PORT 7909
-- DYNAMICPORTLIST 7910-7920
-- AUTORESTART REPLICAT *, RETRIES 5, WAITMINUTES 1
-- PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 3
START MGR
DBLOGIN SOURCEDB <TARGET_DB_NAME> USERID <OGG_USER> PASSWORD <PASSWORD>결과 해석:
Oracle용 GoldenGate로는 PostgreSQL에 쓸 수 없어 GoldenGate for PostgreSQL을 따로 받고, zip 안의 tar를 한 번 더 풀어야 ggsci가 나옴
oracle 계정으로 설치해야 나중에 dirprm, dirdat 쓰기 권한 오류가 없음
환경변수를 .bash_profile에 넣으면 Oracle용 ggsci가 망가지므로 별도 파일로 두고, 터미널 하나는 Oracle용, 하나는 PostgreSQL용으로 고정함
GGSCI 첫 줄의 "for Oracle", "for PostgreSQL"로 어느 쪽인지 확인함
드라이버 파일 이름에는 pg가 아니라 psql이 들어가며 끝 숫자(25)는 드라이버 버전이라, ls -l lib/*.so로 실제 파일을 보고 GGpsql25.so를 적음(r이 붙은 것은 스레드용, GGtrc25.so는 트레이스용)
odbc.ini의 대괄호 이름이 DSN이며 DBLOGIN SOURCEDB, TARGETDB가 이 이름을 가리킴
같은 서버에 Oracle용 Manager가 7809를 쓰므로 PostgreSQL용은 7909로 나눔
DBLOGIN은 GGSCI 세션 안에서만 유효해 GGSCI를 다시 띄우면 다시 해야 함
#PMP3 위치 지정과 확인
INFO EXTRACT EXT1, DETAIL
ADD EXTRACT PMP3, EXTTRAILSOURCE ./dirdat/lt, EXTSEQNO <TRAIL_SEQNO>, EXTRBA 0
ADD RMTTRAIL ./dirdat/rp, EXTRACT PMP3, MEGABYTES 500
START EXTRACT PMP3-- 소스
INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (9701, 'PGTEST', 'DBA', 7839, SYSDATE, 6000, NULL, 10);
COMMIT;
UPDATE emp SET sal = 6500 WHERE empno = 9701;
COMMIT;
-- 타깃 (psql -h 127.0.0.1 -U <OGG_USER> -d <TARGET_DB_NAME>)
SELECT empno, ename, job, sal, deptno FROM scott.emp WHERE empno = 9701;결과 해석:
INFO EXTRACT EXT1, DETAIL에는 Seqno가 둘 나오는데, Log Read Checkpoint 쪽은 Oracle 리두 번호이고 Trail Name ./dirdat/lt 쪽이 트레일 번호라 이것을 EXTSEQNO에 넣음
EXTSEQNO를 빼면 PMP3가 이미 지워진 lt000000000을 기다리며 RUNNING인 채 아무것도 보내지 않음
잘못 등록했으면 지우지 말고 STOP EXTRACT PMP3, ALTER EXTRACT PMP3, EXTSEQNO <n>, EXTRBA 0, START EXTRACT PMP3로 위치만 옮김
PostgreSQL용 Manager(7909)가 떠 있어야 PMP3가 붙고, 트레일은 pg21/dirdat/rp*에 쌓임
예상값: 타깃에 9701 행이 sal 6500.00으로 보이면 INSERT와 UPDATE가 모두 넘어온 것이고, 6000이면 UPDATE가 아직 도착하지 않은 것임STATS REPLICAT REPPG, TOTALSONLY *.*로 건수도 확인함
REPPG를 Oracle용 GGSCI에 잘못 등록했으면 그쪽에서 DELETE REPLICAT REPPG !로 등록만 지우고(체크포인트 테이블이 PostgreSQL에 있어 ! 없이는 지워지지 않음) PostgreSQL용 터미널에서 다시 만듦
빈 문자열은 Oracle에서 NULL이지만 PostgreSQL에서는 NULL이 아니어서 의미가 달라짐
#초기 적재와 변경분의 경계
별도 이행 본문은 대상 스키마 전용 EXT_HPG→hp→PMP_HPG→hg→REP_HPG 구성을 기존 SCOTT 복제와 분리함
| 순서 | 실습 이행 방식 |
|---|---|
| 변경 캡처 시작 | 초기 적재보다 먼저 전용 Extract와 Pump 기동 |
| 기준점 기록 | CURRENT_SCN 조회값을 초기 적재와 변경분 적용 경계로 사용 |
| 한 번 적재 | SOURCEISTABLE, SQLPREDICATE AS OF SCN으로 읽고 SPECIALRUN, EXTFILE로 타깃에 적재 |
| 객체 이행 | FK, 인덱스, 시퀀스, 뷰, 프로그램을 별도 생성하고 사용자 트리거는 복제 중 비활성화 |
| 변경 연결 | 동일 기준 SCN의 AFTERCSN으로 REP_HPG 시작, HANDLECOLLISIONS는 쓰지 않는 예제 |
실습에서는 소스 트리거가 만든 이력 행까지 복제되므로 타깃에서 같은 트리거를 켜면 중복 이력이 생길 수 있다고 설명함 SCN만 지정하면 충돌 불가라는 단정, 기준 SCN 재선정 후 재시도의 전체 절차와 장기 트랜잭션 경계는 확인 불가 전환은 목차에 STEP 11로 적혀 있지만 본문은 STEP 10 뒤 STEP 12로 이어져 실제 전환 절차가 기재되어 있지 않음
#구문과 옵션 설명
pg_hba.conf는 연결 종류, 주소, DB, 사용자가 처음 일치한 행으로 인증하며 그 인증이 실패해도 다음 행으로 넘어가지 않음
AFTERCSN은 온라인 동기화의 트레일과 체크포인트에 적용하는 옵션임
SPECIALRUN 초기 적재 작업의 시작 옵션은 아님
HANDLECOLLISIONS는 초기 적재와 변경분의 중복, 누락 행 충돌 처리 기능이며 모든 값 불일치를 해결하는 기능이 아님
#사용 조건과 주의사항
PostgreSQL용 Manager 동적 포트 범위가 MySQL용 Manager 포트와 겹치며 실제 동시 포트 배정, 충돌 여부는 확인 불가
PostgreSQL 설치 절차와 MySQL 환경 기동 절차에 적힌 기동 순서가 서로 다름
수업 자료의 "인코딩을 빼면 반드시 문제", 체크포인트로 누락이 없다는 설명, 잘못 만든 프로세스의 체크포인트 파일을 직접 지우는 복구는 확인되지 않은 내용이라 일반 절차로 보지 않음
이 실습은 타깃 객체를 미리 만드는 DML 복제임
GoldenGate의 DDL 지원 여부는 별도로 확인해야 함
PostgreSQL 소스 캡처용 REPLICATION, 보충 로깅 권한과 타깃 Replicat 전달 권한은 다름
적용할 DML 종류와 체크포인트, 하트비트 객체 생성 여부에 맞춰 권한을 나누며 전체 SUPERUSER를 최소 권한의 필수 조건으로 보지 않음
현재 설치본의 지원 조합과 초기 데이터 경계 일치 여부는 확인 불가