web-dev-qa-db-ja.com

MySQLクロスサーバー選択クエリ

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

サーバーIPデータベース
--------- --------
1.2.3.4テスト
a.b.c.dテスト

1.2.3.4のテストデータベースのテーブルから行を選択し、テーブルの結果をa.b.c.dのテストデータベースに挿入するクエリを作成したい
サーバーが数マイル離れているため、2つを接続するためにSSHトンネルを開きます。

ポインタはありますか?

25
Anand Shah

mysqldumpは、すでに述べた解決策であるか、またはSELECT ... INTO OUTFILE その後 LOAD DATA INFILE ...コマンド。

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

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

8
James C

サーバーの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を使用してください。)

35
Peter Carrero

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

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

mysqldumpコマンドに--no-create-info--no-add-locksのようないくつかのオプションを含めたいと思うでしょう。出力が希望どおりになるまでテストします。

2
staticsan