MySQL中針對不同的功能需求提供了不同的存儲引擎。所謂的存儲引擎也就是MySQL下特定接口的具體實現。
FEDERATED是其中一個專門針對遠程數據庫的實現。一般情況下在本地數據庫中建表會在數據庫目錄中生成相應的表定義文件,並同時生成相應的數據文件。
但通過FEDERATED引擎創建的表只是在本地有表定義文件,數據文件則存在於遠程數據庫中(這一點很重要)。
通過這個引擎可以實現類似Oracle 下DBLINK的遠程數據訪問功能。
1、使用show engines 命令查看數據庫是否已支持FEDERATED引擎:
2、開啟federated引擎
vi /etc/my.cnf
在[mysqld]之后添加:
federated
3、先來安裝federated存儲引擎
install plugin federated soname 'ha_federated.so';
mysql> install plugin federated soname 'ha_federated.so';
ERROR 1125 (HY000): Function 'federated' already exists
已經安裝好了,只是沒有啟用
4、測試一下是否可以:
[root@rhel6Mysql02 ~]# mysqld_safe --federated &
[1] 2194
[root@rhel6Mysql02 ~]# 130620 18:12:28 mysqld_safe Logging to '/var/lib/mysql/rhel6Mysql02.err'.
130620 18:12:28 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
若提示mysqld_safe A mysqld process already exists,說明mysql的進程占用了log文件,將mysql服務停止即可:
root@iZ94j7vkg4wZ:~#mysqld_safe --federated &
root@iZ94j7vkg4wZ:~# 160726 20:00:07 mysqld_safe Can't log to error log and syslog at the same time. Remove all --log-error configuration options for --syslog to take effect.
160726 20:00:07 mysqld_safe Logging to '/var/log/mysql/error.log'.
160726 20:00:07 mysqld_safe A mysqld process already exists
將mysql服務停止,然后再次運行即可:root@iZ94j7vkg4wZ:~#service mysql status
5、重啟mysql服務后,用show engines 命令再次查看,已支持
6、使用FEDERATED建表語句如下:
CREATE TABLE (......) ENGINE =FEDERATED CONNECTION='mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]'
創建成功后就可直接在本地查詢相應的遠程表了。
需要注意的幾點:
1. 本地的表結構必須與遠程的完全一樣。
2.遠程數據庫目前僅限MySQL
3.不支持事務
4.不支持表結構修改
本地虛擬表名與遠程表名,可不相同。
經過測試,這個引擎的一些額外特點:
1. 本地虛擬表與遠程實體表之間是 TCP 長連接,並且是多個客戶端利用的。所以不用擔心因頻繁建立連接帶來的網絡開銷。
2. 本虛擬表表與遠程實體表之間的網絡連接斷開后,當對虛擬表發起查詢時,它會嘗試重新連接遠程實體表,所以我們不用擔心網絡連接斷開造成的永久中斷問題。
3. 如果無時間未對本地虛擬表作任何操作,虛擬表與實體表之間的連接將在遠程主機的 wait_timeout 秒后自動斷開,當對虛擬表發起查詢時,連接又會重新建立。
一些注意事項:
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 在實際環境中的應用。
