我的項目有自己的數據庫。另外,我使用其他數據庫上的用戶表。兩個辦公室將數據放在同一臺服務器上,但第三臺辦公室在其他服務器上有自己的用戶表。我需要從其他數據庫連接表,有時還需要其他服務器
所以,在大量的查詢我需要加入表some_db.users或other_server.some_db.users
,你有什麼建議的解決方案對於這種情況?
我使用MySQL。
我的項目有自己的數據庫。另外,我使用其他數據庫上的用戶表。兩個辦公室將數據放在同一臺服務器上,但第三臺辦公室在其他服務器上有自己的用戶表。我需要從其他數據庫連接表,有時還需要其他服務器
所以,在大量的查詢我需要加入表some_db.users或other_server.some_db.users
,你有什麼建議的解決方案對於這種情況?
我使用MySQL。
有在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
。
請提及數據庫也。 在SQLServer中,您可以使用鏈接服務器。 http://msdn.microsoft.com/en-us/library/ms188279.aspx
我需要針對MySQL的解決方案。 – 2012-07-27 09:50:50
在MySQL中,你可以加入使用完全合格的名稱來自不同數據庫的表像
但我害怕,你不能加入從不同的服務器,因爲你需要有兩種不同的連接和表根據我的知識,在查詢中沒有完全限定的連接名稱。
或者,您可以在其中一臺服務器上創建本地臨時表並在其上運行查詢。但在這種情況下,您需要將數據從一臺服務器傳輸到另一臺服務器。您可以使用MySQL GUI工具(如SQLyog或MySQL管理員)將數據從一臺服務器傳輸到另一臺服務器,並同步兩臺服務器上的數據庫。
希望它可以幫助....
感謝,特別是快速教程。不幸的是我很難讓它工作。顯示'%federated%'等變量;返回空集。我發現 #默認禁用聯合默認 在my.ini中跳過聯合 ,我已經評論了跳過行和重新啓動的服務,我還在此文件中添加了聯合到[mysqld]部分並重新啓動服務。 – 2012-07-30 08:50:02
您使用的是哪個MySQL版本? – Jacob 2012-07-30 08:55:03
不,好吧..看起來它現在正在工作,即使空集返回。謝謝:) – 2012-07-30 08:55:32