---- 官網上的信息
使用MySQL FEDERATED存儲引擎,沒有對表的本地數據文件(比如,沒有.MYD文件)。取而代之地,一個遠程數據庫存儲那些正常地應該在表中的數據。這使得MySQL客戶端API來讀,刪除,更新和插入數據的使用成為必要。數據取回被通過SELECT * FROM tbl_name SQL語句來初始化。要讀這個結果,通過使用mysql_fetch_row() C API函數,行被一次取一個,然后從SELECT結果包中的列轉換成FEDERATED處理器期望的格式。
基本流程如下:
1. SQL調用被本地發布
2. MySQL處理器API (數據以處理器格式)
3. MySQL客戶端API (數據被轉換成SQL調用)
4. 遠程數據庫-> MySQL客戶端API
5. 轉換結果包(如果有的話)到處理器格式
6. 處理器 API -> 結果行或受行影響的對本地的計數
使用FEDERATED表的步驟是非常簡單的。通常,你運行兩個服務器,要么在同一個主機上,要么在不同主機上。(一個FEDERATED表使用其它被同一服務器管理的表也是可能的。雖然只有極少的點要這么做)。
首先,你必須在你想要用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),
KEY name (name),
KEY other_key (other)
)
ENGINE=MyISAM
DEFAULT CHARSET=latin1;
ENGINE表選項可能命名任何存儲引擎,該表需要不是一個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),
KEY name (name),
KEY other_key (other)
)
ENGINE=FEDERATED
DEFAULT CHARSET=latin1
CONNECTION='mysql://root@remote_host:9306/federated/test_table';
(注意: CONNECTION 替代 用在先前版本的MySQL里的COMMENT)。
除了ENGINE表選項應該是FEDERATED,並且CONNECTION表選項是給FEDERATED指明如何連接到遠程服務器上的連接字符串之外,這個表的結構必須完全與遠程表的結構相同。
FEDERATED引擎僅創建在已聯盟數據庫中的test_table.frm文件。
遠程主機信息指明本地服務器要連接到的遠程服務器,數據庫和表信息指明哪一個遠程表要被作為數據文件來用。在這個例子中。遠程服務器被指定來作為遠程主機在9306端口上運行,所以你要啟動服務器,讓它監聽9306端口。
在CONNECTION選項中的連接字符串的一般形式如下:
scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name
只有mysql在這一點被支持為scheme,密碼和端口號時可選的。
這里有一些連接字符串的例子:
CONNECTION='mysql://username:password@hostname:port/database/tablename'
CONNECTION='mysql://username@hostname/database/tablename'
CONNECTION='mysql://username:password@hostname/database/tablename'
為指定連接字符串使用CONNECTION是非可選,並且在將來可能會改變。當你使用FEDERATED表的時候,要記得這個,因為這意味着當將來發生那種改變之時,可能被要求。
因為任何被用的密碼作為純文本被存在連接字符串中,它可以被任何使對FEDERATED表使用SHOW CREATE TABLE或SHOW TABLE STATUS的用戶,或者在INFORMATION_SCHEMA數據庫中查詢TABLES表的用戶看見。
FEDERATED支持及不支持的如下:
· 在第一個版本中,遠程服務器必須是一個MySQL服務器。FEDERATED對其它數據庫引擎的支持可能會在將來被添加。
· FEDERATED表指向的遠程表在你通過FEDERATED表訪問它之前必須存在。
· 一個FEDERATED表指向另一個FEDERATED表是可能的,但是你必須小心不要創建一個循環。
· 沒有對事務的支持。
· 如果遠程表已經改變,對FEDERATED引擎而言是沒有辦法知道的。這個的原因是因為這個表必須象數據文件一樣工作,除了數據庫其它任何都不會被寫入。如果有任何對遠程數據庫的改變,本地表中數據的完整性可能會被破壞。
· FEDERATED存儲引擎支持SELECT, INSERT, UPDATE, DELETE和索引。它不支持ALTER TABLE, DROP TABLE或任何其它的數據定義語言語句。當前的實現不使用預先准備好的語句。
· 執行使用SELECT, INSERT, UPDATE和DELETE,但不用HANDLER。
· FEDERATED表不能對查詢緩存不起作用。
這些限制中的一些在FEDERATED處理機的將來版本可能被消除