MySQLにはフェデレーションテーブルがあります。
FEDERATEDストレージエンジンを使用すると、レプリケーションやクラスターテクノロジーを使用せずに、リモートのMySQLデータベースからデータにアクセスできます。ローカルのFEDERATEDテーブルをクエリすると、リモート(フェデレーション)テーブルからデータが自動的にプルされます。ローカルテーブルにはデータは保存されません。
まず、FEDERATEDテーブルを使用してアクセスするリモートサーバー上のテーブルが必要です。リモートテーブルがsakilaデータベースにあり、次のように定義されているとします。
CREATE TABLE test_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL
PRIMARY KEY (id)
)
ENGINE=MyISAM
DEFAULT CHARSET=latin1;
次に、リモートテーブルにアクセスするためのFEDERATEDテーブルをローカルサーバーに作成します。
CREATE TABLE federated_table (
id INT(20) NOT NULL AUTO_INCREMENT,
name VARCHAR(32) NOT NULL
PRIMARY KEY (id)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://fed_user:fed_user@197.186.1.199:3306/sakila/test_table';
サンプル接続文字列:
CONNECTION='mysql://username:password@hostname:port/database/tablename'
CONNECTION='mysql://username@hostname/database/tablename'
CONNECTION='mysql://username:password@hostname/database/tablename'
このテーブルの基本構造は、ENGINEテーブルオプションがFEDERATEDである必要があることを除いて、リモートテーブルの構造と一致する必要があります。
実行する:
show variables like '%federated%';
FEDERATEDストレージエンジンがローカルサーバーで使用可能かどうかを確認します。
federated_table
localhostのテーブルはtest_table
、リモートサーバーの仮想テーブルになります。
これで、ローカルホストサーバーのDB内のテーブル間でJOINを使用できます。ローカルホストサーバーに呼び出さtest
れたテーブルがあり、リモートサーバーにある以前のsakila.test_tableと結合する場合は、次のようなクエリを記述します。
SELECT * FROM `federated_table` JOIN `test`;
クエリ内のfederated_table
は、実際にはリモートサーバーのtest_tableを参照します。
FEDERATEDストレージエンジンの有効化について
FEDERATEDストレージエンジンは、実行中のサーバーではデフォルトで有効になっていません。FEDERATEDを有効にするには、オプションを使用してMySQLサーバーのバイナリを起動する必要があり--federated
ます。
注:
オプションのストレージエンジンには特権が必要であり、--skip-grant-tables
が指定されている場合はロードに失敗します。
その結果、データベース全体のロードに失敗し、次のエラーがログに表示されます。
110318 21:37:23 [ERROR] /usr/local/libexec/mysqld: unknown option '--federated'
つまり、フェデレーションテーブルがある場合は、5.xからのアップグレードを2つのステップで実行する必要があります。一度あり--skip-grant-tables
となし--federated
、一度なし--skip-grant-tables
とあり--federated
。
出典:FEDERATEDストレージエンジン