28

MySQL クライアントを使用してクロス サーバー選択クエリを作成することは可能ですか。基本的には以下のような設定です。

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

1.2.3.4 のテスト データベースのテーブルから行を選択し、テーブルの結果を abcd のテスト データベースに挿入するクエリを作成したいと考えています。
私のサーバーは何マイルも離れた場所にあるので、接続するために SSH トンネルを開きます。二つ。

ポインタはありますか?

4

3 に答える 3

41

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

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://fed_user@remote_host:9306/federated/test_table';

(MySQL 5.0.13 より前では、CONNECTION ではなく COMMENT を使用してください。)

于 2009-10-09T22:20:00.130 に答える
11

mysqldumpすでに述べたように解決策になるか、SELECT ... INTO OUTFILEand thenLOAD DATA INFILE ...コマンドを使用してみてください。

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

3 番目の解決策は、アプリケーションで作業を行うことです。SELECTクエリの結果を 1 行ずつ読み込みINSERT、他のサーバーに 1 行ずつ読み込みます。ただし、データ型と null の処理で問題が発生する可能性があります。

于 2009-05-01T09:37:08.010 に答える
2

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

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

コマンドに--no-create-infoや などのいくつかのオプションを含めることをお勧めします。出力が希望どおりになるまでテストします。--no-add-locksmysqldump

于 2009-05-01T06:27:39.290 に答える