일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- ollama langflow
- 초기 구축
- jpa entity자동
- header setting
- React
- swagger
- java9
- dto valid
- custom valid
- Java
- memcached
- spring
- generate entity
- spring boot
- java8
- JavaScript
- CentOS6
- 초기 세팅
- docker 설치
- jvm
- SpringBoot
- 도커
- JPA
- NextJS
- generate pojos
- 헤더 설정
- 리눅스
- docker
- Next.js 14
- MySQL
- Today
- Total
개발자의 길
Mysql federated (oracle dblink 와 같은 기능) - 물리적 다른 DB 연결 본문
1. FEDERATED 를 사용하는 이유
- mysql 에서 물리적으로 같은 서버면, 조회 권한만 주면 alias를 앞에 붙여서 다른 db 끼리 join 및 조회를 할수가 있다
ex) select a.a1 from db1.db_test1 a inner join db2.a1 b on a.a1=b.test1
하지만, 물리적으로 다르면, 같이 조회를 못하고 각각 할 수 밖에 없다.
어쩔수 없이 다른 물리적 DB를 같이 조회를 하고 싶으면, 메인이 되는 DB 서버에 원격으로 붙는 형식을 사용할 수 있게 하는게 federated 기능이다.
* oracle에서 dblink와 유사한 기능이다
2. 방법
- DB1 : 원본 데이터 DB
- DB2 : 원격으로 원본 데이터를 가져올 DB
우선 DB2(원격) 에만 federated 기능을 키면 된다.(원본 DB에는 필요없음)
A. DB2에 root로 접속을 하여,
SHOW ENGINES 명령으로 확인
-> FEDERATED 가 있으면 쉽게 사용
-> 없으면 install plugin federated soname 'ha_federated.so' 로 설치
B. 설치(또는 이미 설치 되어있으면) 후 DB2 의 my.cnf 수정
-> [mysqld] 아래에 federated 라는 단어를 추가한다.
C. mysql 재시작 후, 다시 SHOW ENGINES 로 확인
-> Support 컬럼만 'YES' 로 바뀌어 있으면 준비가 완료 된 것이다.
3. 사용 및 테스트
DB1 에서 우선 테이블 생성(일반적인 create 문, 물론 이미 생성된 table을 사용해도 된다. 테스트를 위해 새로 create)
CREATE TABLE `db_test1` (
`a1` varchar(10) DEFAULT NULL,
`a2` varchar(10) DEFAULT NULL,
`a3` varchar(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DB2 에서 federated 테이블을 생성해야 한다.
CREATE TABLE `db_test1` (
`a1` varchar(10) DEFAULT NULL,
`a2` varchar(10) DEFAULT NULL,
`a3` varchar(11) DEFAULT NULL
) ENGINE=FEDERATED DEFAULT CHARSET=utf8
CONNECTION='mysql://접속ID:패스워드@도메인(또는 IP):포트/datebase명(ex:DB1)/테이블명(ex:db_test1)';
주의)
1. 컬럼명을 똑같이 맞춰줘야 한다.
2. 원본 데이터 db에 스키마가 바뀌면, federated 테이블을 drop하고 다시 생성해야 한다.
-> federated 테이블은 스키마 변경 불가. 드랍하고 다시 create해야함
3. 패스워드에 '@' 골뱅이가 들어가면 안된다. 패스워드 변경해야함
장점)
1. 원본 데이터 DB- 원격 데이터 DB 간에 delay가 없다.
2. 원격 데이터DB 에 select,insert,delete,update 모두 가능하다. 바로바로 원본 db에 적용됨
3. 원격 데이터 DB를 drop 해도, 원본DB는 drop이 안된다. 한마디로 DB에 DDL은 불가능 하고, DML은 가능하다(장점이자 단점이다)
**) 실무에서, DB 용량과 구조가 늘어나면서 DB를 추가적으로 늘려야 하는 상황이 왔다. 서로 다른 물리적 DB를 각각 connection 맺으면서 개발하기엔 고칠게 너무 많았다. 하지만 federated를 알게 되서, 한방에 해결이 되었다.
오늘도 새로운 걸 배우고, 공유한다...
======================================================================================
일반적으로 위에서 언급한대로 하면, 리모트 하는 서버에서 원본 데이터의 db 접속 정보가 다 노출 된다.
그래서 원격지에서 server를 추가 해서, 접속 정보를 숨길수 있다.
A 서버(원본 서버) -> B서버(원격으로 접속할 서버)
라고 하면,
B서버에
CREATE SERVER 서버명칭
FOREIGN DATA WRAPPER mysql
OPTIONS(
USER '접속유저명'
,DATABASE '접속할 DB'
,PASSWORD '비밀번호'
,HOST 'A서버 HOST'
,PORT A서버 DB PORT);
EX)
CREATE SERVER test_db
FOREIGN DATA WRAPPER mysql
OPTIONS(
USER 'test_user'
,DATABASE 'test_database'
,PASSWORD 'aa%^%aa'
,HOST '10.10.10.111'
,PORT 3306);
라고 하면 use mysql; 한 후에
SELECT * FROM servers; 으로 확인
이 후에
CREATE TABLE `db_test1` (
`a1` varchar(10) DEFAULT NULL,
`a2` varchar(10) DEFAULT NULL,
`a3` varchar(11) DEFAULT NULL
) ENGINE=FEDERATED DEFAULT CHARSET=utf8
CONNECTION='서버명칭/접속할테이블명'; 으로 하면 된다
ex) ... CONNECTION='test_db/test_table';
글쓰기 참 귀찮다..
'3. DB' 카테고리의 다른 글
(mysql)DB 커넥션(connection)이 안끊길때 웹 소스 확인용 (0) | 2019.08.20 |
---|---|
MySQL 정규식(regexp)검사를 통한 숫자,특수문자 체크 (0) | 2018.11.28 |
[mysql] 함수 모음 (2) | 2016.06.10 |
MySQL 정규식(regexp)검사를 통한 한글포함여부 체크 (0) | 2016.03.07 |
[DB] mysql 백업 (0) | 2015.12.03 |
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.