MySQLのFEDERATEDストレージエンジンを利用する


## はじめに

MySQLのFEDERATEDのストレージエンジンを設定する方法を記述します。

リモートサーバに存在するテーブルをあたかもローカルに存在するかのように
利用することができるようになります。

## 環境

* CentOS6.5

* MySQL 5.6.20

## 構成

db001に格納されたデータをdb002から操作できるように
db002にFEDERATEDストレージエンジンの設定を行います。

## MySQLのインストール

* MySQL Yum Repositoryの準備

```shell
$ wget http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
$ sudo yum localinstall mysql-community-release-el6-5.noarch.rpm
```
* MySQLのインストール

```shell
$ sudo yum install mysql-community-client.x86_64 mysql-community-common.x86_64 mysql-community-libs.x86_64 mysql-community-libs-compat.x86_64 mysql-community-server.x86_64
```

* MySQLの起動

```shell
$ sudo /etc/init.d/mysqld start
```
* mysql_secure_installationの実行

```shell
$ /usr/bin/mysql_secure_installation
```

## FEDERATEDストレージエンジンの設定

* db001

データベースを作成します。

```mysql
mysql> CREATE DATABASE master;
Query OK, 1 row affected (0.00 sec)
```

テーブルを作成し、データを挿入しておきます。

```mysql
mysql> use master;
Database changed

mysql> CREATE TABLE table001 (
    ->   id int not null auto_increment,
    ->   name varchar(128) not null,
    ->   PRIMARY KEY (id),
    ->   INDEX idx_name (name)
    ->);

mysql> desc table001;
+-------+--------------+------+-----+---------+----------------+
| Field | Type         | Null | Key | Default | Extra          |
+-------+--------------+------+-----+---------+----------------+
| id    | int(11)      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(128) | NO   | MUL | NULL    |                |
+-------+--------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> insert into table001 (name) values ('Java');
Query OK, 1 row affected (0.04 sec)

mysql> insert into table001 (name) values ('Ruby');
Query OK, 1 row affected (0.05 sec)

mysql> insert into table001 (name) values ('Python');
Query OK, 1 row affected (0.03 sec)

mysql> select * from table001;
+----+--------+
| id | name   |
+----+--------+
|  1 | Java   |
|  3 | Python |
|  2 | Ruby   |
+----+--------+
3 rows in set (0.00 sec)

```
db002からのアクセスを許可しておきます。

```mysql
mysql> GRANT ALL ON master.* TO federated_user@'db002' IDENTIFIED BY '${password}';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
```

* db002

サポートされているストレージエンジンを確認します。

```mysql
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
```

FEDERATEDストレージエンジンを有効にします。

```ini:/etc/my.cnf
federated = 1
```

mysqldを再起動します

```shell
$ sudo /etc/init.d/mysqld restart
```

FEDERATEDストレージエンジンが有効となっていることを確認します。

```mysql
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| FEDERATED          | YES     | Federated MySQL storage engine                                 | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
```

データベースを作成します。

```mysql
mysql> CREATE DATABASE federated;
Query OK, 1 row affected (0.01 sec)
```

db001のmasterデータベースのtable001を操作できるようにFEDERATEDストレージエンジンを
利用してテーブルを作成します。

```mysql
mysql> USE federated;
Database changed

mysql> CREATE TABLE table001 (
    ->   id int not null auto_increment,
    ->   name varchar(128) not null,
    ->   PRIMARY KEY (id),
    ->   INDEX idx_name (name)
    ->)
    ->ENGINE=FEDERATED
    ->CONNECTION='mysql://federated_user:${password}@db001/master/table001';
Query OK, 0 rows affected (0.05 sec)
```

## 動作確認

* db002

データの参照を確認します。

```mysql
mysql> select * from federated.table001;
+----+--------+
| id | name   |
+----+--------+
|  1 | Java   |
|  3 | Python |
|  2 | Ruby   |
+----+--------+
3 rows in set (0.01 sec)
```

データの更新を確認します。

```mysql
mysql> insert into federated.table001 (name) values ('PHP');
Query OK, 1 row affected (0.04 sec)

mysql> select * from federated.table001;
+----+--------+
| id | name   |
+----+--------+
|  1 | Java   |
|  4 | PHP    |
|  3 | Python |
|  2 | Ruby   |
+----+--------+
4 rows in set (0.00 sec)
```

* db001

データの参照を確認します。

```mysql
mysql> select * from master.table001;
+----+--------+
| id | name   |
+----+--------+
|  1 | Java   |
|  4 | PHP    |
|  3 | Python |
|  2 | Ruby   |
+----+--------+
4 rows in set (0.00 sec)
```

## 参考

* [A Quick Guide to Using the MySQL Yum Repository](http://dev.mysql.com/doc/mysql-yum-repo-quick-guide/en/)
* [Download MySQL Yum Repository](http://dev.mysql.com/downloads/repo/yum/)
* [15.8 The FEDERATED Storage Engine](http://dev.mysql.com/doc/refman/5.6/en/federated-storage-engine.html)
* [15.8.1 FEDERATED Storage Engine Overview](http://dev.mysql.com/doc/refman/5.6/en/federated-description.html)
* [15.8.2 How to Create FEDERATED Tables](http://dev.mysql.com/doc/refman/5.6/en/federated-create.html)