본문 바로가기

Database/mariaDB administrator

Mysql FEDERATED Engine 으로 dblink 구현하기

Mysql FEDERATED Engine 으로 dblink 구현하기

federated test



※본 포스트의 내용은 mysql 과 mariadb에서 호환되어 사용 가능한 내용임을 밝혀드립니다.


Mysql 과 Mariadb에서 지원하는 FEDERATED 기능은 사실 Oracle에서 써오던 dblink와는 개념이 다릅니다.

Oracle의 dblink가 다른 DB로 어떤 세션을 열어주고, 접속하고나면 권한이 허용된 범위내에서 다양한 작업을 자유롭게 할 수 있는 반면, Mysql 과 Mariadb에서 지원하는 FEDERATED 기능은 각자 다른 DB간의 테이블 동기화의 개념에 더 가깝습니다.


가볍고 간편하게, 별도의 ETL Tool을 쓰지 않고도 물리적으로 다른 DB간에 데이터를 동기화 할 수 있는 좋은 방법 입니다.


아래 그림과 같이 원본 <original> DB 서버의 어떤 table에 데이터를 넣으면 대상이 되는 <target> DB 서버의 특정 테이블에 해당 데이터가 입력되어지는 로직 입니다.


그래서 기능 명칭도 FEDERATED 라고 명명 된것 같습니다.

FEDERATED 는 InnoDB 또는 MyISAM과 같이 Mysql과 MariaDB내 스토리지 엔진의 한 타입중 하나 입니다.

해당 기능명인 FEDERATED 의 의미를 한번 찾아 봤습니다.



<연합하다> 라는 뜻이네요.

말그대로 다른 DB서버의 데이터와 연합을 한다 라는 의미인것 같습니다.


아무튼, 이젠 이 FEDERATED 방식을 이용하는 방법을 안내해 드리겠습니다.



Target DB에 FEDERATED storage engine 인스톨

우선 Target DB, 즉 원본 데이터를 받아서 저장 할 대상 DB에 접속 해서 아래와 같은 명령어를 실행해 봅니다.


show engines;


저같은 경우는 아래와 같이 결과가 나왔습니다.



여기서 FEDERATED storage engine 인스톨 해줍니다.


MariaDB> install plugin federated soname 'ha_federated.so';


인스톨을 하고 나서 다시 아래 명령어를 실행해 봅니다.


show engines;


그러면 아래와 같이 FEDERATED storage engine 이 설치 된 것을 확인 할 수 있습니다.





Original DB 에 원본테이블 생성

다음은 Original DB에 접속을 하여 Target DB로 보낼 데이터가 저장 될 테이블을 하나 생성 합니다.


create table db_link_test.federated_test

(

SEQ int not null comment '순번'

primary key,

DATA_COL1 varchar(100),

DATA_COL2 varchar(100)

)

comment 'FEDERATED테스트' ENGINE= InnoDB;


생성이 잘 되셨나요?


아직 데이터를 넣지는 말고, 다시 Target DB로 가서 작업을 이어갑니다.




Target DB에 FEDERATED storage engine 테이블 생성


다시 Target DB로 옵니다. 여기서 FEDERATED storage engine 테이블을 생성을 하는데, 이게 가장 중요 합니다.


create table db_link_test.federated_test_copy

(

SEQ int not null comment '순번'

primary key,

DATA_COL1 varchar(100),

DATA_COL2 varchar(100)

)

comment 'FEDERATED테스트_복제' engine=FEDERATED

CONNECTION='mysql://db_계정:계정_비밀번호@xxx.xxx.xxx.xxx:3306/db_link_test/federated_test';


자, Target DB에서 위와 같이 Original DB에 만든 테이블과 똑같이 생긴 테이블을 생성 해줍니다.

단, 스키마명과 테이블명은 달라도 됩니다. 하지만 컬럼은 같아야 합니다.


그리고 create table 문 마지막 부분에 engine type을 FEDERATED로 지정을 하고, 그 아래 CONNECTION 부분을 잘 써줘야 합니다.


위 예문을 기준으로 설명을 드리면 db_계정과 계정_비밀번호를 넣으시고, XXX.XXX.XXX.XXX 에 original DB의 IP와 그 뒤에 port 번호를 써줍니다.

그리고 "/" 뒤에 original DB내 동기화할 테이블이 있는 스키마명을 넣고, "/"로 구분을 지어준 다음 동기화할 테이블명을 적어 줍니다.


위에 예로든 DDL 두개의 빨간색으로 표시한 부분이 서로 같아야 한다는 의미 입니다.


만약, 이렇게 잘 했는데도 아래와 같이 연결 오류가 뜬다면 방화벽 내지는 접속권한, 비밀번호 오류등을 확인 해 보시기 바랍니다.


Error encountered when performing Introspect schema db_link_test: Unable to connect to foreign data source: Unknown MySQL server host '111.222.333.444' (-2).

Unable to connect to foreign data source: Unknown MySQL server host '111.222.333.444' (-2)

 (6 s 112 ms)





FEDERATED 테스트

자, 여기까지 잘 진행이 되셨다면 이젠 동기화가 되는지 테스트를 해볼 차례 입니다.


우선 원본(original DB) 와 대상(Target DB)의 테스트 테이블이 잘 생성 되었고, 데이터가 없는것을 확인 한 후에,


원본(original DB) 에 데이터를 넣어 보겠습니다.


INSERT INTO db_link_test.federated_test (SEQ, DATA_COL1, DATA_COL2) VALUES (1, '대한민국', 'test1');

INSERT INTO db_link_test.federated_test (SEQ, DATA_COL1, DATA_COL2) VALUES (2, 'USA', 'test2');


위와 같이 두개의 데이터를 넣었습니다.


먼저 원본에서 확인을 해보겠습니다.


select * from db_link_test.federated_test;



데이터가 잘 들어갔습니다.


그럼 FEDERATED 되어 있는 Target DB에서 데이터를 확인 해보겠습니다.


select * from db_link_test.federated_test_copy;



원본 original DB와 똑같은 데이터를 확인 할 수 있습니다.


이렇게 insert 한 데이터도 동기화가 되고, 삭제를 하거나 업데이트를 해도 동기화가 잘 되는것을 확인 했습니다.


여러분들도 한번씩 확인을 해보시길 바랍니다.


오늘은 여기까지 하겠습니다.


감사합니다~!!






by.sTricky

  • 정당당 2020.09.06 22:51

    MySql Federaion이 Oracle DBLink와 같은 것인 줄 알았습니다. 참조하는 쪽에서 쿼리를 날리면, 그 쿼리가 원본 DB로 넘어가서 조회되는게 아니라,,,, 원본 DB 테이블에 INSERT할때, 참조 테이블에도 자동 INSERT 된다는 말씀이신데,,, 그럼, INSERT 안된게 하는 옵션은 없을까요?

  • 음먀 2021.01.06 17:01

    mysql에서 oracle 로 FEDERATED 하려고 하는데 sql 게이트웨이는 필요 없나요??
    해당 예제는 mysql에서 mysql 데이터를 가져오는거 같은데..