MySQL Federated 활용

게임은조금만·2023년 3월 7일
post-thumbnail

내가 까먹을까봐 적어놓은 포스트

서비스 운영시에 일반적으로 테스트 DB와 라이브 DB를 함께 운영한다면, 테스트 DB에서 라이브 DB의 데이터를 동기화할 필요가 있다.

물론 자체 운영툴이 있어서 배포 시스템을 따로 만들어두었지만, 배포 과정 자체가 매우 엄격한 절차로 해놓았기 때문에 일부 비상사태나 긴급한 적용을 위한, 또는 배포 후 빠른 데이터 검증을 위해 서로 다른 DB를 연결시키는 기능을 만들어두었다.

Federated 활성

타 DB의 데이터를 끌어와서 조회하거나 IUD를 하려고 하는 DB에서 활성화 시켜야한다.
현재 사용중인 서비스는 네이버 NCLOUD의 Cloud DB for MySQL을 사용중인데 Federated를 지원하지 않기 때문에😥 그냥 내가 설치한 테스트 DB에서 Federated를 활성화하고, 라이브DB의 특정 테이블을 끌어왔다.

※라이브 DB의 ACG(Access control group)에서 보안 설정을 열어주는 것을 잊지말자

테스트 DB Query 편집기에서 아래 명령어를 실행한다.

show engines; 

Federated의 Support 컬럼이 YES인지 체크한다. (보통 NO다)
그러면 /etc/mysql/my.cnf 파일 (리눅스) C:\ProgramData\MySQL\MySQL Server 8.0\my.ini(윈도우) 파일을 열어서 [mysqld] 아래에 federated라는 문구를 추가한다.

[mysqld]
federated

DB를 재기동한다.

짠. 되었다.

타겟 테이블 연결하기

모든 테이블은 할 필요가 없어서 원하는 테이블의 DDL을 따와서 똑같이 실행한다.

CREATE TABLE fed.`list_script` (
  `script_no` bigint(20) NOT NULL AUTO_INCREMENT,
  `episode_id` int(11) NOT NULL COMMENT '소속된 에피소드 ID ',
  `scene_id` varchar(10) DEFAULT NULL COMMENT '씬, 상황 ID\\n',
  `template` varchar(20) DEFAULT NULL,
  `speaker` varchar(20) DEFAULT NULL,
  `script_data` varchar(240) DEFAULT NULL,
  `target_scene_id` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '이동할 상황 ID',
  `requisite` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '필요조건',
  `character_expression` varchar(30) DEFAULT NULL COMMENT '캐릭터 표현',
  `emoticon_expression` varchar(20) DEFAULT NULL COMMENT '이모티콘 표현',
  `in_effect` varchar(20) DEFAULT NULL,
  `out_effect` varchar(20) DEFAULT NULL,
  `bubble_size` int(11) DEFAULT NULL COMMENT '말풍선 크기',
  `bubble_pos` int(11) DEFAULT NULL COMMENT '말풍선 위치 1~9',
  `bubble_hold` int(11) DEFAULT NULL COMMENT '말풍선 유지 ',
  `bubble_reverse` int(11) DEFAULT NULL COMMENT '말꼬리 반전',
  `emoticon_size` int(11) DEFAULT NULL COMMENT '이모티콘 사이즈',
  `voice` varchar(40) DEFAULT NULL,
  `autoplay_row` int(11) DEFAULT NULL COMMENT '자동진행',
  `dev_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '개발 코멘트',
  `project_id` int(11) NOT NULL COMMENT '프로젝트 ID',
  `sortkey` int(11) DEFAULT '0',
  `sound_effect` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '효과음',
  `lang` varchar(10) NOT NULL DEFAULT 'KO' COMMENT '언어',
  `control` varchar(100) DEFAULT NULL COMMENT '행 제어 변수',
  `selection_group` int(11) DEFAULT '0' COMMENT '그룹번호',
  `selection_no` int(11) DEFAULT '0' COMMENT '그룹 내 번호',
  PRIMARY KEY (`script_no`),
  KEY `idx_sort` (`sortkey`,`script_no`),
  KEY `list_script_episode_id_IDX` (`episode_id`,`lang`) USING BTREE,
  KEY `list_script_project_id_IDX` (`project_id`,`episode_id`,`lang`) USING BTREE,
  KEY `list_script_scene_id_IDX` (`project_id`,`scene_id`) USING BTREE,
  KEY `list_script_episode_id_IDX2` (`episode_id`,`scene_id`,`lang`) USING BTREE,
  KEY `list_script_episode_id_IDX3` (`episode_id`,`lang`,`selection_group`) USING BTREE,
  KEY `idx_script_ep_template` (`episode_id`,`template`,`lang`),
  KEY `idx_script_choice_price` (`project_id`,`template`,`control`,`lang`),
  KEY `list_script_project_id_IDX4` (`project_id`,`lang`,`voice`) USING BTREE
) ENGINE=FEDERATED AUTO_INCREMENT=15663152 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='스크립트 테이블'
CONNECTION = 'mysql://ID:비번@디비주소:포트번호/스키마/테이블이름';

잘 써먹기

그럼 우리는 이제 아래와 같이 편하게(?) 데이터 입력이 가능하거나. 간단한 체크가 가능하다.

INSERT INTO fed.list_script
SELECT ls.*
  FROM list_script ls
 WHERE ls.episode_id = ${episode_id}
   AND ls.lang = ${lang};
SELECT ls.script_no
     , ls.script_data origin_data
     , fls.script_data live_data
  FROM list_script ls
     , fed.list_script fls
 WHERE ls.project_id = 101
   AND ls.script_no = fls.script_no
   AND fls.project_id = ls.project_id 
   AND ls.script_data <> fls.script_data ;
   

끝...

profile
게임을 조금만 하려고 노력 중

0개의 댓글