私のプロジェクトには独自のデータベースがあります。また、他のデータベースにあるユーザーのテーブルを使用しています。2つのオフィスは同じサーバー上にデータを持っていますが、3番目のオフィスは他のサーバー上に独自のユーザーテーブルを持っています。
したがって、多くのクエリでは、テーブルsome_db.usersまたはother_server.some_db.usersのいずれかに参加する必要があります。
このシナリオに対してどのような解決策をアドバイスしますか?
私はMySQLを使用しています。
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。
データベースについても言及してください。SQLServerでは、リンクサーバーを使用できます。http://msdn.microsoft.com/en-us/library/ms188279.aspx
MySQLでは、次のような完全修飾名を使用して、さまざまなデータベースのテーブルを結合できます。
`database_name1`. `table_name1` JOIN `database_name2`.`table_name2`
しかし、私は恐れています。異なるサーバーからテーブルを結合することはできません。そのためには、2つの異なる接続が必要であり、私の知る限り、クエリで使用される完全修飾接続名がないためです。
または、サーバーの1つにローカル一時テーブルを作成し、そこでクエリを実行することもできます。ただし、この場合、あるサーバーから別のサーバーにデータを転送する必要があります。SQLyogやMySQLadminなどのMySQLGUIツールを使用して、あるサーバーから別のサーバーにデータを転送したり、2つのサーバー上のデータベースを同期したりできます。
それが役に立てば幸い....
フェデレーションテーブルは、他のサーバー上のテーブルのソリューションです。あなたがそれらに結合を実行する場合でも、それらは非常に遅いです。同じサーバー上の別のデータベースからデータを読み取りたいだけの場合は、ビューを使用できます。このようにして、すべてのテーブルが事実上1つのデータベースにあり、アプリケーションで1つの接続のみを開く必要があります。
CREATE
VIEW `my_db`.`table_name`
AS
(SELECT * FROM `other_db`.`table_name`);