MySQL 연계 복제
MySQL 타깃 계정, 복제 권한과 충돌 처리, 급여 값이 서로 다르며 매핑 준비와 전체 정합성은 확인 불가
#핵심 요약
실습에서는 기존 Oracle, PostgreSQL 복제에 MySQL용 PMP4, REPMY를 추가하는 단방향 구성임
MySQL용 GoldenGate는 별도 홈, 환경변수, Manager와 네이티브 클라이언트 라이브러리를 사용함
타깃 DB에 EMP, DEPT를 미리 만들고 체크포인트 테이블과 Replicat을 등록함
수업 자료는 소스 급여를 8000으로 UPDATE하면서 설명과 타깃 예시는 7500이라 적어, 값이 서로 맞지 않음
#개념과 동작 원리
| 구성 항목 | 실습 조건 |
|---|---|
| DB | MySQL 8.0을 설치하고 mysqld 상태, 3306 접속 확인 |
| 타깃 객체 | SCOTT DB, InnoDB EMP, DEPT와 PK 준비 |
| 자료형 | Oracle NUMBER를 INT, DECIMAL, DATE를 DATETIME으로 대응 |
| 환경 | MySQL용 별도 OGG_HOME, PATH, LD_LIBRARY_PATH와 libmysqlclient 확인 |
| 전달 | EXT1의 lt→PMP4→MySQL용 홈의 rm→REPMY |
| 적용 | MySQL 대상 DB, 호스트, 포트를 지정하고 체크포인트 테이블 사용 |
실습에서는 MySQL용 19.1 설치본과 접속 문제 시 21.3 대안을 제시하지만 실제 인증 조합과 현재 설치 파일의 버전은 확인 불가
수업 자료의 PMP4 USERID <OGG_USER>@oracle은 다른 펌프의 접속 별칭(orcl)과 달라 환경에 맞는 별칭으로 바꿔야 함
PMP4에 와일드카드 TABLE이 있지만 설명은 EMP, DEPT만 전송이라고 되어 있고 REPMY의 SALGRADE는 앞선 타깃 생성문에 없어 전체 대상 준비가 부족함
#주요 용어와 구성 요소
| 구문 | 의미 |
|---|---|
| user@host | MySQL 계정은 사용자와 접속 호스트 조합으로 식별되며 같은 사용자명이어도 별개 계정일 수 있음 |
| 전달과 캡처 | 타깃 DML 적용 권한과 소스 바이너리 로그 수신 권한은 다름 |
| 타깃 키 | PK, 유일 키가 없으면 한 변경이 여러 행을 갱신, 삭제할 수 있어 행 식별 조건을 확인해야 함 |
#필수 명령어 또는 SQL
| 항목 | 실행 조건 |
|---|---|
| 작업 대상 | MySQL 계정, EMP, DEPT, 체크포인트, PMP4, REPMY와 전송 경로 |
| 필요 권한 | 설치는 root, 파일 소유자 권한, DB는 객체 준비, 타깃 DML, 체크포인트 권한을 구분함 |
| 바꿀 입력값 | 실제 OGG 홈, 클라이언트 라이브러리, <HOST>, 접속 계정, 비밀번호, 포트, 트레일 위치 |
| 결과 해석 | 기존 상세 출력 부재와 급여 상충을 유지하며 실제 인증, 매핑 전체 준비, 정합성 완료는 확인 불가 |
ADD CHECKPOINTTABLE scott.ggs_checkpointINFO CHECKPOINTTABLE scott.ggs_checkpoint
INFO MGR결과 해석: 실습에서는 MySQL용 Manager 7919와 체크포인트 테이블 생성을 확인하도록 하며 상세 출력은 기재 없음
RMTHOST <HOST>, MGRPORT 7919
RMTTRAIL ./dirdat/rm
TABLE scott.emp;
TABLE scott.dept;결과 해석: EMP, DEPT 테이블을 전송 대상으로 지정함
전체 파라미터 파일 구성은 확인 불가
EXTSEQNO 예시는 22와 24가 섞여 있어, 실제 값은 INFO EXTRACT EXT1, DETAIL의 트레일 Seqno로 정함
HANDLECOLLISIONS
MAP scott.emp, TARGET scott.emp;
MAP scott.dept, TARGET scott.dept;ADD REPLICAT REPMY, EXTTRAIL ./dirdat/rm, CHECKPOINTTABLE scott.ggs_checkpoint
START REPLICAT REPMY결과 해석: REPMY RUNNING 후 소스 INSERT, UPDATE와 타깃 행을 비교함
급여 값이 서로 달라 복제 성공 여부는 확인 불가
SEND REPLICAT REPMY, NOHANDLECOLLISIONS
EDIT PARAMS REPMYVIEW PARAMS REPMY
INFO ALL결과 해석: 실습에서는 파일의 HANDLECOLLISIONS 삭제와 REPMY RUNNING을 확인하도록 하며 명령 응답 전문은 기재 없음
#MySQL 설치와 타깃 준비
yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
yum-config-manager --disable "mysql*"
yum-config-manager --enable mysql80-community
yum clean all
yum install -y mysql-community-server
systemctl enable --now mysqld
grep 'temporary password' /var/log/mysqld.logALTER USER 'root'@'localhost' IDENTIFIED BY '<STRONG_PASSWORD>';
UNINSTALL COMPONENT 'file://component_validate_password';
ALTER USER 'root'@'localhost' IDENTIFIED BY '<PASSWORD>';
FLUSH PRIVILEGES;[mysqld]
port=3306
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
lower_case_table_names=0CREATE DATABASE scott CHARACTER SET utf8mb4;
CREATE USER '<OGG_USER>'@'%' IDENTIFIED WITH mysql_native_password BY '<PASSWORD>';
CREATE USER '<OGG_USER>'@'localhost' IDENTIFIED WITH mysql_native_password BY '<PASSWORD>';
GRANT ALL PRIVILEGES ON *.* TO '<OGG_USER>'@'%' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO '<OGG_USER>'@'localhost' WITH GRANT OPTION;
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '<OGG_USER>'@'%';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '<OGG_USER>'@'localhost';
FLUSH PRIVILEGES;
SELECT user, host, plugin FROM mysql.user WHERE user = '<OGG_USER>';
USE scott;
CREATE TABLE emp (
empno INT PRIMARY KEY, ename VARCHAR(10), job VARCHAR(9), mgr INT,
hiredate DATETIME, sal DECIMAL(7,2), comm DECIMAL(7,2), deptno SMALLINT
) ENGINE=InnoDB;
CREATE TABLE dept (deptno INT PRIMARY KEY, dname VARCHAR(14), loc VARCHAR(13)) ENGINE=InnoDB;결과 해석:
저장소에 지원이 끝난 버전이 함께 켜져 있으면 설치가 멈추므로 8.0 저장소만 켬
MySQL은 처음 켜질 때 데이터 디렉터리를 스스로 만들어 PostgreSQL의 initdb 같은 단계가 없음
root 임시 비밀번호는 만료 상태라 정책을 통과하는 비밀번호로 먼저 바꿔야 다른 명령이 됨
쉬운 비밀번호는 validate_password가 ERROR 1819로 거절함
lower_case_table_names=0이면 테이블 이름의 대소문자를 구분하고 초기화 뒤에는 바꿀 수 없으므로 처음에 정하고 전부 소문자로 만듦
설정 뒤 systemctl restart mysqld, firewall-cmd --add-port=3306/tcp --permanent, --reload
GoldenGate는 서버 안에서 소켓으로 붙으므로 '<OGG_USER>'@'localhost'가 없으면 DBLOGIN이 1045로 막힘
GoldenGate 19.1이 MySQL 8의 새 인증 방식을 못 알아들을 수 있어 mysql_native_password로 맞춤
InnoDB여야 COMMIT, ROLLBACK과 체크포인트가 안전하게 남음
#MySQL용 GoldenGate와 PMP4, REPMY
mkdir -p /u01/app/oracle/goldengate/my19
unzip <OGG_FOR_MYSQL_ZIP> -d /u01/app/oracle/goldengate/my19
cd /u01/app/oracle/goldengate/my19
tar xvf ggs_Linux_x64_MySQL_64bit.tar
ls /usr/lib64/mysql/libmysqlclient*export OGG_HOME=/u01/app/oracle/goldengate/my19
export PATH=$OGG_HOME:$PATH
export LD_LIBRARY_PATH=$OGG_HOME/lib:/usr/lib64/mysql:$LD_LIBRARY_PATHCREATE SUBDIRS
EDIT PARAMS MGR
-- PORT 7919
-- DYNAMICPORTLIST 7921-7930
-- AUTORESTART REPLICAT *, RETRIES 5, WAITMINUTES 1
-- PURGEOLDEXTRACTS ./dirdat/*, USECHECKPOINTS, MINKEEPDAYS 3
START MGR
DBLOGIN SOURCEDB scott@127.0.0.1:3306, USERID <OGG_USER>, PASSWORD <PASSWORD>EXTRACT PMP4
USERID <OGG_USER>@<SOURCE_ALIAS>, PASSWORD <PASSWORD>
RMTHOST <TARGET_HOST>, MGRPORT 7919
RMTTRAIL ./dirdat/rm
TABLE scott.emp;
TABLE scott.dept;
ADD EXTRACT PMP4, EXTTRAILSOURCE ./dirdat/lt, EXTSEQNO <TRAIL_SEQNO>, EXTRBA 0
ADD RMTTRAIL ./dirdat/rm, EXTRACT PMP4, MEGABYTES 500
START EXTRACT PMP4REPLICAT REPMY
SETENV (MYSQL_UNIX_PORT = "/var/lib/mysql/mysql.sock")
TARGETDB scott@127.0.0.1:3306, USERID <OGG_USER>, PASSWORD <PASSWORD>
HANDLECOLLISIONS
MAP scott.emp, TARGET scott.emp;
MAP scott.dept, TARGET scott.dept;결과 해석:
MySQL용은 eDelivery의 "Oracle GoldenGate for Non Oracle Database"에서 클래식(for MySQL on Linux x86-64) 설치본을 받음
Microservices 설치본에는 GGSCI가 없음
MySQL용은 ODBC가 아니라 네이티브 클라이언트 라이브러리로 붙어 odbc.ini가 없고, LD_LIBRARY_PATH에 /usr/lib64/mysql을 넣음libmysqlclient가 없으면 root로 mysql-community-libs, mysql-community-devel을 설치함
접속 문자열은 DB이름@주소:포트 형식이라 Oracle의 TNS 별칭, PostgreSQL의 DSN과 다름
터미널은 Oracle용, PostgreSQL용, MySQL용 셋으로 고정하고 GGSCI 첫 줄의 "for ..."로 확인함
수업 자료의 정상 상태: Oracle용 INFO ALL에 EXT1 하나와 PMP1(<CLONE_DB_NAME>), PMP3(PostgreSQL), PMP4(MySQL)가 모두 RUNNING
소스 리두는 EXT1이 한 번만 읽고 펌프만 늘어나는 구조임
검증은 소스에 9801 행을 넣고 급여를 바꾼 뒤 <CLONE_DB_NAME>(emp), PostgreSQL(scott.emp), MySQL(emp)에서 같은 행을 조회함
DBeaver로 붙을 때는 드라이버 속성 allowPublicKeyRetrieval=true, useSSL=false가 필요했다고 수업 자료는 적음
REPMY를 Oracle용 GGSCI에 잘못 만들었으면 그쪽에서 DELETE REPLICAT REPMY !로 등록만 지우고 MySQL용 터미널에서 다시 만듦
| 항목 | Oracle | PostgreSQL | MySQL |
|---|---|---|---|
| 계층 | DB > 스키마 | DB > 스키마 | DB = 스키마 |
| 기본 대소문자 | 대문자로 접음 | 소문자로 접음 | 적은 대로 유지 |
| 빈 문자열 | NULL과 같음 | NULL과 다름 | NULL과 다름 |
| GoldenGate 접속 | tnsnames | ODBC | 네이티브 라이브러리 |
#구문과 옵션 설명
MySQL Replicat에는 대상 SELECT, INSERT, UPDATE, DELETE 권한과 사용하는 체크포인트, 하트비트 객체 생성, 삭제 권한을 구분해 준비함
REPLICATION SLAVE는 소스 Extract의 바이너리 로그 수신 권한임
Oracle에서 오는 타깃 DML 적용 권한은 별도로 준비함
NOHANDLECOLLISIONS는 초기 충돌 처리를 끄는 설정이며 데이터 전체 일치를 검증하는 명령이 아님
#사용 조건과 주의사항
소켓과 TCP 접속, 계정의 접속 호스트 부분을 구분하는 것이 설명이지만 특정 계정 조합이 항상 필수라는 단정은 확인 불가 MySQL Manager 7919가 PostgreSQL 동적 포트 7910~7920 범위에 포함되므로 포트 충돌 여부를 확인해야 함 수업 자료에는 비밀번호 검증 구성 요소를 먼저 지우는 순서와 먼저 비밀번호를 바꾸는 순서가 함께 있어, 아래에는 만료 상태를 먼저 푸는 순서로 정리함 타깃 수 증가에 따른 소스 부하의 측정 결과는 기재 없음 세 타깃 비교는 같은 키, 값을 조회하는 절차이며 현재 세 DB의 복제가 검증된 것은 아님