mysql跨节点join——federated引擎
?
一、 什么是federated引擎
mysql中的federated類似于oracle中的dblink。
federated是一個專門針對遠程數(shù)據(jù)庫的實現(xiàn),一般情況下在本地數(shù)據(jù)庫中建表會在數(shù)據(jù)庫目錄中生成相對應的表定義文件,并同時生成相對應的數(shù)據(jù)文件。
[圖]
但是通過federated引擎創(chuàng)建的表只是在本地有表定義文件,數(shù)據(jù)文件則在遠程數(shù)據(jù)庫中。
[圖]
針對federated存儲引擎表的查詢會被發(fā)送到遠程數(shù)據(jù)庫的表上執(zhí)行,本地是不存儲任何數(shù)據(jù)的。
1. 本地的表結構必須與遠程的完全一致。本地可以比遠端數(shù)據(jù)庫的字段少,但是不能多。因為多的話字段就沒有地方存儲了,還記得么,federated只在本地存儲了表結構。
2. 遠程的數(shù)據(jù)庫必須是mysql。
3. 不支持事務。
4. 不支持表結構修改,遠端表結構變了本地不知道(并不會主動通知本地,不理解,搞個監(jiān)聽器很難嗎),一旦遠端修改了表結構就gg了。
5. 創(chuàng)建時遠程數(shù)據(jù)服務器必須已經(jīng)存在此表。
6. 一個federated表指向另一個federated表是有可能的,但是要避免死循環(huán)。
7. 不使用查詢緩存。
8. 遠程服務器gg,federated表gg。
?
二、 如何使用
1. 開啟federated引擎
mysql默認是沒有打開federated存儲引擎的。
如果報這種錯誤,就可能是沒有打開federated存儲引擎:
使用 show engines 命令查看當前的引擎支持狀況:
在mysql的配置文件中 :
這個只是一個引用,去在圈中的文件中:
在[mysqld]節(jié)點下添加一行 federated:
重啟mysql即可:
再連接到myql, show engines
?
2. 創(chuàng)建federated表
先在A服務器創(chuàng)建一張表:
-- A服務器 drop database if exists foo_db ; create database foo_db default charset utf8 ; use foo_db; drop table if exists t_foo_table ; create table t_foo_table(id int primary key auto_increment ,username varchar(20) not null ,passwd varchar(20) not null )charset=utf8;然后在B服務器創(chuàng)建另一張表,結構和之前創(chuàng)建的一模一樣,不同的只是多了指定engine和connection:
-- B服務器 drop database if exists foo_db ; create database foo_db default charset utf8 ; use foo_db; drop table if exists t_foo_table ; create table t_foo_table(id int primary key auto_increment ,username varchar(20) not null ,passwd varchar(20) not null )charset=utf8 engine=federated connection="mysql://root:@10.26.200.134/foo_db/t_foo_table";connection的格式:
mysql://username:passwd@hostname/db_name/table_name在A服務器往表中插入一條數(shù)據(jù):
insert into t_foo_table (username, passwd) values ("foo", "bar");在B服務器查詢:
同理在B服務器插入,在A服務器也能查得到,實際上是發(fā)送到A服務器執(zhí)行,數(shù)據(jù)也是存儲在A服務器上的。
?
3. 借助于federated表跨節(jié)點join
在B數(shù)據(jù)庫再創(chuàng)建一個表:
-- 要連接的表 drop table if exists t_bar ; create table t_bar(id int primary key auto_increment ,barbar varchar(20) not null default "" )charset utf8;插入數(shù)據(jù):
insert into t_bar (id,barbar) values (1, "barbar"); insert into t_bar (id,barbar) values (2, "barbarbar"); insert into t_bar (id,barbar) values (3, "barbarbarbar"); insert into t_foo_table (username, passwd) values ("foofoooofoo", "barbaaaaarbar"); insert into t_foo_table (username, passwd) values ("foofooooofoo", "barbaaaarbar"); insert into t_foo_table (username, passwd) values ("foofooooofoo", "barbaaaarbar");連表查詢:
select * from t_bar as t1 join t_foo_table as t2 on t1.id=t2.id ;查詢結果:
OK,查詢結果是從兩臺服務器的兩個節(jié)點中取出來的。
?
三、 總結
使用federated有很大的局限性,而且總感覺很不靠譜的樣子,講道理的話應該使用中間件來實現(xiàn)的。
?
?
?
.
轉載于:https://www.cnblogs.com/cc11001100/p/6675409.html
總結
以上是生活随笔為你收集整理的mysql跨节点join——federated引擎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 备孕梦到小青蛇是胎梦吗
- 下一篇: 梦到小老虎是什么意思周公解梦