5

私のプロジェクトには独自のデータベースがあります。また、他のデータベースにあるユーザーのテーブルを使用しています。2つのオフィスは同じサーバー上にデータを持っていますが、3番目のオフィスは他のサーバー上に独自のユーザーテーブルを持っています。

したがって、多くのクエリでは、テーブルsome_db.usersまたはother_server.some_db.usersのいずれかに参加する必要があります。

このシナリオに対してどのような解決策をアドバイスしますか?

私はMySQLを使用しています。

4

4 に答える 4

16

MySQLにはフェデレーションテーブルがあります。

FEDERATEDストレージエンジンを使用すると、レプリケーションやクラスターテクノロジーを使用せずに、リモートのMySQLデータベースからデータにアクセスできます。ローカルのFEDERATEDテーブルをクエリすると、リモート(フェデレーション)テーブルからデータが自動的にプルされます。ローカルテーブルにはデータは保存されません。

まず、FEDERATEDテーブルを使用してアクセスするリモートサーバー上のテーブルが必要です。リモートテーブルがsakilaデータベースにあり、次のように定義されているとします。

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

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

CREATE TABLE federated_table (
    id     INT(20) NOT NULL AUTO_INCREMENT,
    name   VARCHAR(32) NOT NULL
    PRIMARY KEY  (id)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://fed_user:fed_user@197.186.1.199:3306/sakila/test_table';

サンプル接続文字列:

CONNECTION='mysql://username:password@hostname:port/database/tablename'
CONNECTION='mysql://username@hostname/database/tablename'
CONNECTION='mysql://username:password@hostname/database/tablename'

このテーブルの基本構造は、ENGINEテーブルオプションがFEDERATEDである必要があることを除いて、リモートテーブルの構造と一致する必要があります。

実行する:

show variables like '%federated%'; 

FEDERATEDストレージエンジンがローカルサーバーで使用可能かどうかを確認します。

federated_tablelocalhostのテーブルはtest_table、リモートサーバーの仮想テーブルになります。

これで、ローカルホストサーバーのDB内のテーブル間でJOINを使用できます。ローカルホストサーバーに呼び出さtestれたテーブルがあり、リモートサーバーにある以前のsakila.test_tableと結合する場合は、次のようなクエリを記述します。

SELECT * FROM `federated_table` JOIN `test`;

クエリ内のfederated_tableは、実際にはリモートサーバーのtest_tableを参照します。


FEDERATEDストレージエンジンの有効化について

FEDERATEDストレージエンジンは、実行中のサーバーではデフォルトで有効になっていません。FEDERATEDを有効にするには、オプションを使用してMySQLサーバーのバイナリを起動する必要があり--federatedます。

注:
オプションのストレージエンジンには特権が必要であり、--skip-grant-tablesが指定されている場合はロードに失敗します。

その結果、データベース全体のロードに失敗し、次のエラーがログに表示されます。

110318 21:37:23 [ERROR] /usr/local/libexec/mysqld: unknown option '--federated'

つまり、フェデレーションテーブルがある場合は、5.xからのアップグレードを2つのステップで実行する必要があります。一度あり--skip-grant-tablesとなし--federated、一度なし--skip-grant-tables とあり--federated

出典:FEDERATEDストレージエンジン

于 2012-07-27T10:51:54.120 に答える
0

データベースについても言及してください。SQLServerでは、リンクサーバーを使用できます。http://msdn.microsoft.com/en-us/library/ms188279.aspx

于 2012-07-27T09:42:21.683 に答える
0

MySQLでは、次のような完全修飾名を使用して、さまざまなデータベースのテーブルを結合できます。

`database_name1`. `table_name1` JOIN `database_name2`.`table_name2`

しかし、私は恐れています。異なるサーバーからテーブルを結合することはできません。そのためには、2つの異なる接続が必要であり、私の知る限り、クエリで使用される完全修飾接続名がないためです。

または、サーバーの1つにローカル一時テーブルを作成し、そこでクエリを実行することもできます。ただし、この場合、あるサーバーから別のサーバーにデータを転送する必要があります。SQLyogやMySQLadminなどのMySQLGUIツールを使用して、あるサーバーから別のサーバーにデータを転送したり、2つのサーバー上のデータベースを同期したりできます。

それが役に立てば幸い....

于 2012-07-27T09:59:08.223 に答える
0

フェデレーションテーブルは、他のサーバー上のテーブルのソリューションです。あなたがそれらに結合を実行する場合でも、それらは非常に遅いです。同じサーバー上の別のデータベースからデータを読み取りたいだけの場合は、ビューを使用できます。このようにして、すべてのテーブルが事実上1つのデータベースにあり、アプリケーションで1つの接続のみを開く必要があります。

CREATE
    VIEW `my_db`.`table_name` 
    AS
(SELECT * FROM `other_db`.`table_name`);
于 2020-07-06T15:55:35.673 に答える