2012-07-27 37 views
5

我的項目有自己的數據庫。另外,我使用其他數據庫上的用戶表。兩個辦公室將數據放在同一臺服務器上,但第三臺辦公室在其他服務器上有自己的用戶表。我需要從其他數據庫連接表,有時還需要其他服務器

所以,在大量的查詢我需要加入表some_db.users或other_server.some_db.users

,你有什麼建議的解決方案對於這種情況?

我使用MySQL。

回答

13

有在MySQL Federated tables

聯合存儲引擎可讓您從遠程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; 

接下來,創建本地服務器上的聯合表格用於訪問遠程表:

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:[email protected]:3306/sakila/test_table'; 

樣品連接字符串:

CONNECTION='mysql://username:[email protected]:port/database/tablename' 
CONNECTION='mysql://[email protected]/database/tablename' 
CONNECTION='mysql://username:[email protected]/database/tablename' 

該表的基本結構應該與遠程表的基本結構匹配,除了ENGINE表選項應該是FEDERATED。

執行:

show variables like '%federated%'; 

檢查FEDERATED存儲引擎可在本地服務器上。

localhost中的表federated_table在遠程服務器上成爲虛擬表test_table

現在您可以在本地主機服務器的數據庫中的表之間使用JOIN。如果有一個在本地主機服務器名爲test表,並且要與前sakila.test_table這是在遠程服務器的加入,編寫如下所示的一個查詢:

SELECT * FROM `federated_table` JOIN `test`; 

中的federated_table查詢將實際引用遠程服務器中的test_table。


上啓用FEDERATED存儲引擎

聯合存儲引擎默認情況下未在運行的服務器啓用;要啓用FEDERATED,您必須使用--federated選項啓動MySQL服務器二進制文件。

注意:
可選存儲引擎需要權限,並且在指定--skip-grant-tables時將無法加載。

結果整個數據庫將無法加載,並會出現在日誌中出現以下錯誤:

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

這反過來又意味着,需要兩個步驟來完成從5.x升級,如果你有聯合表。一旦用--skip-grant-tables而沒有--federated,一次沒有--skip-grant-tables--federated

來源:The FEDERATED Storage Engine

+0

感謝,特別是快速教程。不幸的是我很難讓它工作。顯示'%federated%'等變量;返回空集。我發現 #默認禁用聯合默認 在my.ini中跳過聯合 ,我已經評論了跳過行和重新啓動的服務,我還在此文件中添加了聯合到[mysqld]部分並重新啓動服務。 – 2012-07-30 08:50:02

+0

您使用的是哪個MySQL版本? – Jacob 2012-07-30 08:55:03

+0

不,好吧..看起來它現在正在工作,即使空集返回。謝謝:) – 2012-07-30 08:55:32

0

在MySQL中,你可以加入使用完全合格的名稱來自不同數據庫的表像

​​

但我害怕,你不能加入從不同的服務器,因爲你需要有兩種不同的連接和表根據我的知識,在查詢中沒有完全限定的連接名稱。

或者,您可以在其中一臺服務器上創建本地臨時表並在其上運行查詢。但在這種情況下,您需要將數據從一臺服務器傳輸到另一臺服務器。您可以使用MySQL GUI工具(如SQLyog或MySQL管理員)將數據從一臺服務器傳輸到另一臺服務器,並同步兩臺服務器上的數據庫。

希望它可以幫助....

相關問題