テーブルAとテーブルBを持つローカルホストにmysqlデータベースがあるとしましょう。
ログイン情報があり、外部アクセスを許可するサードパーティのmysqlサーバーから詳細をフェッチすることは可能ですか?
データベースに接続できるテーブルが3つあるとしましょう。テーブルA2、B2、C2です。
テーブルC2から行をフェッチし、元のmysqlサーバー(AおよびBと同様)内から、ホストされている場合と同じように、仮想的に(テーブルCとして)アクセスできるようにするにはどうすればよいですか?
私は通常これをお勧めしませんが、ここに行きます...
リモートDBサーバー上のテーブルがMyISAMの場合は、http://dev.mysql.com/doc/refman/5.5/en/を使用してみてください。 federated-storage-engine.html "> FEDERATED Stroage Engine。最初に、FEDERATED StorageEngineが有効になっているかどうかを確認します。これを実行しますSHOW ENGINES;
Windows用のMySQL5.5.12:
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
MySQL 5.5.12 for Windowsでは、有効になっていません
だから、これをmy.iniに追加しました
[mysqld]
federated
次に、自分のマシンでMySQLを再起動しました
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | YES | Federated MySQL storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.02 sec)
今、それは実行されています!!!
リモートサーバーで次のクエリを実行します。
SHOW CREATE TABLE C2\G
これにより、C2のcreatetableステートメントが表示されます。
ここで、CONNECTION句を使用してリモートテーブルのURLを追加するだけです。
MySQLドキュメント によると
そのリンクのために
接続文字列の形式は次のとおりです。scheme:// user_name [:password] @Host_name [:port_num]/db_name/tbl_name
どこ:•スキーム:認識された接続プロトコル。この時点では、スキーム値としてmysqlのみがサポートされています。
•user_name:接続のユーザー名。このユーザーは、リモートサーバーで作成されている必要があり、リモートテーブルで必要なアクション(SELECT、INSERT、UPDATEなど)を実行するための適切な権限を持っている必要があります。
•password :(オプション)user_nameに対応するパスワード。
•Host_name:リモートサーバーのホスト名またはIPアドレス。
•port_num :(オプション)リモートサーバーのポート番号。デフォルトは3306です。
•db_name:リモートテーブルを保持しているデータベースの名前。
•tbl_name:リモートテーブルの名前。ローカルテーブルとリモートテーブルの名前は一致している必要はありません。
サンプル接続文字列:
CONNECTION='mysql://username:password@hostname:port/database/tablename'
CONNECTION='mysql://username@hostname/database/tablename'
CONNECTION='mysql://username:password@hostname/database/tablename'
そのテーブルC2
mydbデータベースでは次のようになります。
CREATE TABLE C2
(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(32),
PRIMARY KEY (id)
)
ENGINE=MyISAM;
CONNECTION
句を追加して、ローカルサーバーで実行するだけです。
use mydb
CREATE TABLE C
(
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(32),
PRIMARY KEY (id)
)
ENGINE=FEDERATED
CONNECTION='mysql://username:password@hostname/mydb/C2';
最後に、ローカルマシンのMySQLでは、次のようにC2テーブルにアクセスできるはずです。
mysql> SELECT * FROM mydb.C;