概要:FEDERATED存儲引擎訪問在遠程數據庫的表中的數據,而不是本地的表。這個特性給某些開發應用帶來了便利,你可以直接在本地構建一個federated表來連接遠程數據表,配置好了之后本地表的數據可以直接跟遠程數據表同步。實際上這個引擎里面是不真實存放數據的,所需要的數據都是連接到其他MySQL服務器上。
一、步驟:
1、首先修正mysql的my.ini文件,開啟FEDERATED引擎(my.ini文件存放在mysql安裝路勁下)。
2、步驟1之后基本上是完成了,之后就是操作數據了。第二步創建一張表,一張和你要同步的表一模一張,你可以直接復制創建語句。但是要在創建語句后面加上 ENGINE=Federated 和 CONNECTION='mysql://[username]:[password]@192.168.84.73:3306/kmsong/km_tbl_companycffsong';
操作其上步驟,新建出來的表就是鏈接到了192.168.84.73:3306/kmsong/b_owner這個表,本身只是一個空殼,只能進行數據的增刪改查操作,不能改變鏈接到的表的表結構,如果改變自身的表結構會出現意想不到的錯誤。
二、注意事項
1. 對本地虛擬表的結構修改,并不會修改遠程表的結構?
2.truncate?命令,會清除遠程表數據?
3.??drop命令只會刪除虛擬表,并不會刪除遠程表
4.??不支持?alter?table?命令?
目前使用federated?最大的缺點:?
1.?select?count(*),?select?*?from?limit?M,?N?等語句執行效率非常低,數據量較大時存在很嚴重的問題,但是按主鍵或索引列查詢,則很快,如以下查詢就非常慢(假設?id?為主索引)?
select?id?from?db.tablea?where?id?>100?limit?10?;
而以下查詢就很快:?
select?id?from?db.tablea?where?id?>100?and?id<150
2.??如果虛擬虛擬表中字段未建立索引,而實體表中為此字段建立了索引,此種情況下,性能也相當差。但是當給虛擬表建立索引后,性能恢復正常。
3.?類似?where?name?like?"str%"?limit?1?的查詢,即使在?name?列上創建了索引,也會導致查詢過慢,是因為
federated引擎會將所有滿足條件的記錄讀取到本,再進行?limit?處理。
這幾個問題已經嚴重影響了federated?在實際環境中的應用,所以這個引擎很冷門,不過在一些特定環境還是能用用的。
三、MySql密碼有@符號如何同步
解決:使用create server創建FEDERATED表
CREATE SERVER ExhibitionServer
FOREIGN DATA WRAPPER mysql
OPTIONS (USER '用戶名', HOST 'IP地址', DATABASE '數據庫名稱',?
PORT 端口號,PASSWORD '密碼');
PS:只有端口號沒有單引號,其余的都有單引號。你也可以自己嘗試加上單引號看能否成功。
CREATE TABLE b_owner?(
.............................................
.............................................
) ENGINE=INNODB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
?ENGINE =FEDERATED CONNECTION='ExhibitionServer/b_owner'
?