web-dev-qa-db-ja.com

ローカルのmysqlサーバー内から外部でホストされているdbのテーブルをフェッチする

テーブルAとテーブルBを持つローカルホストにmysqlデータベースがあるとしましょう。

ログイン情報があり、外部アクセスを許可するサードパーティのmysqlサーバーから詳細をフェッチすることは可能ですか?

データベースに接続できるテーブルが3つあるとしましょう。テーブルA2、B2、C2です。

テーブルC2から行をフェッチし、元のmysqlサーバー(AおよびBと同様)内から、ホストされている場合と同じように、仮想的に(テーブルCとして)アクセスできるようにするにはどうすればよいですか?

3
aQuestion

私は通常これをお勧めしませんが、ここに行きます...

リモート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'

そのテーブルC2mydbデータベースでは次のようになります。

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;
3
RolandoMySQLDBA