목차

MySQL에 FEDERATED engine 추가

원본 링크 : http://blog.weirdx.io/post/3503

데이터베이스 엔진 설정

FEDERATED 스토리지 엔진을 사용하면 리플리케이션이나 클러스터 기술을 이용하지 않고도 원격의 MySQL 데이터베이스에 접근할 수 있다. 서비스 운영을 위해 여러 데이터베이스를 사용하는데, 한 데이터베이스의 데이터를 다른 데이터베이스들이 참조하여 사용할 때 활용할 수 있다. Oracle의 DBLink와 유사한 기능이라고 한다.

FEDERATED 엔진은 MySQL에 기본으로 설정되어 있지 않기 때문에 이를 사용하기 위해서는 별도의 작업이 필요하다. 검색을 해보면 처음에 설치할 때 부터 –with-federated-storage-engine 옵션을 주어야 한다는 등의 이야기 등이 있지만, 실제로는 재설치를 하거나 할 필요는 없다.

mysql 에 root 로 접속해서 아래 명령어를 입력한다.

install plugin federated soname 'ha_federated.so'

실제로 DB에 접속해서 해보면 아래와 같이 추가된다.

mysql> show engines;
+-------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine      | Support | Comment                                                    | Transactions | XA   | Savepoints |
+-------------+---------+------------------------------------------------------------+--------------+------+------------+
| DAMO_MYISAM | YES     | DAmo storage engine                                        | NO           | NO   | NO         |
| MRG_MYISAM  | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |
| CSV         | YES     | CSV storage engine                                         | NO           | NO   | NO         |
| MyISAM      | YES     | Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |
| InnoDB      | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
| MEMORY      | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |
| DAMO_INNODB | YES     | DAmo storage engine                                        | YES          | NO   | NO         |
+-------------+---------+------------------------------------------------------------+--------------+------+------------+
7 rows in set (0.00 sec)

mysql> install plugin federated soname 'ha_federated.so';
Query OK, 0 rows affected, 1 warning (0.03 sec)

mysql> show engines;
+-------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine      | Support | Comment                                                    | Transactions | XA   | Savepoints |
+-------------+---------+------------------------------------------------------------+--------------+------+------------+
| DAMO_MYISAM | YES     | DAmo storage engine                                        | NO           | NO   | NO         |
| FEDERATED   | NO      | Federated MySQL storage engine                             | NULL         | NULL | NULL       |
| CSV         | YES     | CSV storage engine                                         | NO           | NO   | NO         |
| MyISAM      | YES     | Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO         |
| InnoDB      | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES          | YES  | YES        |
| MEMORY      | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO         |
| DAMO_INNODB | YES     | DAmo storage engine                                        | YES          | NO   | NO         |
| MRG_MYISAM  | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO         |
+-------------+---------+------------------------------------------------------------+--------------+------+------------+
8 rows in set (0.01 sec)

이제 show engine 을 해보면 목록에서 FEDERATED Engine 이 나타나지만 꺼져있는 상태이다.

/etc/my.cnf 를 열어 [mysqld] 아래에 federated 라는 단어를 추가한다.

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
federated # 이부분 추가

MySQL을 다시 실행시킨 후 다시 show engines 를 하면 FEDERATED Engine 이 사용가능하게 된 것을 확인할 수 있다.

테이블 작업

CREATE TABLE `cityholic_db`.`cart_product` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '아이디',
  `users_id` bigint(20) unsigned NOT NULL COMMENT '고객아이디',
  `product_id` bigint(20) NOT NULL COMMENT '상품아이디',
  `option_code` varchar(50) NOT NULL COMMENT '상품옵션코드',
  `quantity` int(11) NOT NULL DEFAULT '0' COMMENT '상품 개수',
  PRIMARY KEY (`users_id`,`product_id`,`option_code `),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='카트에 담긴 상품';
CREATE TABLE `cityholic_db`.`cart_product` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '아이디',
  `users_id` bigint(20) unsigned NOT NULL COMMENT '고객아이디',
  `product_id` bigint(20) NOT NULL COMMENT '상품아이디',
  `option_code` varchar(50) NOT NULL COMMENT '상품옵션코드',
  `quantity` int(11) NOT NULL DEFAULT '0' COMMENT '상품 개수',
  PRIMARY KEY (`users_id`,`product_id`,`option_code `),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=FEDERATED DEFAULT CHARSET=utf8 COMMENT='카트에 담긴 상품'
CONNECTION='mysql://root:dldusrn1@10.3.0.27:3306/cityholic_db/cart_product';

사용시 주의점

  1. 반드시 #원본테이블 처럼, 대상이 되는 테이블이 먼저 존재해야 한다.
  2. Transaction은 지원되지 않는다.
  3. #원본테이블의 데이터를 제외한 필드명/타입/구조 등의 변경 사항은 #FEDERATED 된 테이블에 적용이 되지 않기 때문에, 수동으로 변경해 주어야 한다.
  4. Query Cache는 이용할 수 없다.
  5. !!!!! 중요 !!!!! SHOW CREATE TABLE #FEDERATED된 테이블; 입력시 #원본테이블로의 접속정보가 고스란히 노출 되므로, 주의가 요구된다.

참조링크