2009-05-01 27 views
23

は、それは、MySQLクライアントを使用してクロスサーバー選択クエリを記述することが可能です。基本的には次のような設定です。MySQLのクロスサーバ選択クエリ

サーバーのIP          データベース
---------           --------
1.2.3.4          テスト
ABCD          テスト

私は開くことになるので、私のサーバーはマイル離れて位置しているABCD
にテストデータベースにテーブルに1.2.3.4にテストデータベースのテーブルから行を選択し、その結果を挿入しますクエリを書きたいですSSHトンネルは2つを接続します。

任意のポインタ?

答えて

7

mysqldumpはすでに説明した解決策になる可能性がありますが、SELECT ... INTO OUTFILELOAD DATA INFILE ...コマンドを試してみることもできます。

MySQLはあなたに役に立つかもしれない連合ストレージエンジンを持っています。ここにいくつかのドキュメントがありますhttp://dev.mysql.com/doc/refman/5.0/en/federated-storage-engine.html私はそれで大きな成功を収めていないと告白する必要がありますが、それはあなたのために働くかもしれません。

第三ソリューションは、アプリケーション内で作業を行うことであろう。 SELECTの結果を行ごとに読み取り、INSERTを他のサーバーに1行ずつ読み込みます。あなたは、データ型とそのように扱う方法でいくつかの問題に遭遇するかもしれません。

2

mysqlクライアントは短い答えはNoです。しかし、方法が常にある、一度に一つのサーバに接続することができますので... mysqldump

最近のバージョンでは、に使用することができます--whereパラメータをサポートダンプされたデータを制限する。つまり、単純なSELECT(つまり、すべての列が1つの表にあります)を実行し、有効なSQLをINSERTに生成する方法があります。そのようなmysqldumpコマンドの出力を送信元サーバーにパイプして、宛先サーバーへのmysqlコマンドにパイプすることができます。

mysqldumpコマンドには、--no-create-info--no-add-locksのようないくつかのオプションを含めることをお勧めします。出力がまさにあなたが望むものになるまでテストしてください。

+0

あなたが今までにしている場合mysqlクライアントが参加している状況では、問題が起きます。正しい解決策は、サーバーが互いに通信し、クライアントに送信する単一の結果セットを生成することです。 MSSQLはサーバを "リンク"できるようにすることでこれを行い、接続に使用するクレデンシャルなどを設定します。これらのサーバはエイリアス経由でアクセスされます。 – Basic

+0

あなたが話していたことをかなり理解するために私は少し読んでいました。もう1つの答えは、MySQLでこれを行う方法を説明しています。 – staticsan

31

どのようにサーバのいずれかに連合テーブルを使用してはどうですか? クエリで使用するリモートテーブルに基づいてフェデレーテッドテーブルを作成し、データベースがすべてローカルであるかのようにクエリを実行します。下の例MySQL site

FEDERATEDテーブルを使用する手順は非常に簡単です。通常は、2つのサーバーが同じホスト上または異なるホスト上で実行されています。 (FEDERATEDテーブルでは、同じサーバーで管理されている別のテーブルを使用することは可能ですが、それはほとんどありません)

最初に、アクセスするリモートサーバー上のテーブルが必要ですFEDERATEDテーブルを使用します。

CREATE TABLE test_table (
    id  INT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL DEFAULT '', 
    other INT(20) NOT NULL DEFAULT '0', 
    PRIMARY KEY (id), 
    INDEX name (name), 
    INDEX other_key (other) 
) 
ENGINE=MyISAM 
CHARSET=latin1; 

例では、MyISAMテーブルを使用しますが、テーブルは、任意のストレージエンジンを使用することができる:リモート表は、フェデレーテッド・データベースであり、このように定義されていると仮定する。

次に、リモートテーブルにアクセスするためのローカルサーバー上のFEDERATEDテーブルを作成します。

CREATE TABLE federated_table (
    id  INT(20) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(32) NOT NULL DEFAULT '', 
    other INT(20) NOT NULL DEFAULT '0', 
    PRIMARY KEY (id), 
    INDEX name (name), 
    INDEX other_key (other) 
) 
ENGINE=FEDERATED 
DEFAULT CHARSET=latin1 
CONNECTION='mysql://[email protected]_host:9306/federated/test_table'; 

(MySQLの5.0.13の前に、というよりもCONNECTION使用COMMENT。)

+0

これは「適切な」ソリューションですが、FEDERATEDテーブルは非常に遅いです(ほぼすべてが完全なテーブルスキャンに変換されます)。したがって、データがすべて大規模である場合はオプションではない可能性があります。 – Brilliand

+0

federateは元のテーブルからインデックスを処理します。ローカルでもそのインデックスを尊重する必要がありますが、悲しいことに大量の挿入時にはクエリキャッシュとパフォーマンスが低下します –