標籤:mysql federated dblink
隨著業務的複雜度不斷的增加、資料庫不斷的切分,在分布式系統中往往一台或幾台資料庫並不能滿足我們的需求,所以常常需要多台同時時用,而在平時需要通過其它伺服器的資料庫擷取資訊最為方便的就是資料連結,而比較常見的如Oracle中的DBlink一般,使用過Oracle的DBlink—資料庫的連結的人都知道可以跨伺服器資料庫的來進行資料查詢。而在MySQL5.0以後中通過使用FEDERATED引擎也可以實作類別似於Oracle中DBlink,在MySQL5.5開始預設安裝只是沒有啟用,同Oracle的DBlink一樣MySQL使用FEDERATED引擎實現外連結建議是在同一個區域網路內,這樣可以減小彼此間的延遲,但兩者之間還是有很大區別的,在MySQL下使用FEDERATED引擎實現的外連結需要在本機資料庫中建虛擬表用以串連遠端資料庫,在這裡就就簡單的說明一下MySQL的FEDERATED引擎實現的資料庫外連結。
首先,需要注意的有幾點:
1、建立外連結於區域網路內的環境實現最優;
2、使用FEDERATED引擎的外連結資料表,在本地是虛擬表,所以建表的示後不需要主鍵、索引、自增欄位這些。同理,對本地虛擬表的結構修改,並不會修改遠端資料表的結構;
3、TRUNCATE(截斷表)會清除遠端資料表資料,DROP只會刪除本地虛擬表;
4、在虛擬表上不支援ALTER
在資料庫中是否有FEDERATED引擎可以通過如下來查看:
mysql> SHOW ENGINES;+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| Engine | Support | Comment | Transactions | XA | Savepoints |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO || CSV | YES | CSV storage engine | NO | NO | NO || MyISAM | YES | MyISAM storage engine | NO | NO | NO || BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO || MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO || InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES || ARCHIVE | YES | Archive storage engine | NO | NO | NO || PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO || FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+9 rows in set (0.01 sec)
一般這種情況就是有FEDERATED引擎但是沒有啟用,啟用很簡單,在my.cnf或my.ini中的[mysqld]段中修改添加,如下:
[mysqld]……federated……
重啟MySQL,此時再看就啟用了FEDERATED引擎
此時再本機資料庫建虛擬表用來連結遠端資料庫,其表結構可以通過在遠端資料庫中通過SHOW CREATE TABLE來查看DDL,但是要注意去掉主鍵、索引、自增欄位,但是本地的虛擬表的表名可以不同,如遠端資料庫:192.168.2.25下的my_test庫下有一張book_price表,遠端資料庫上的DDL:
CREATE TABLE `book_price` ( `book_name` varchar(255) NOT NULL DEFAULT '', `book_price` decimal(11,3) NOT NULL DEFAULT '0.000') ENGINE=InnoDB DEFAULT CHARSET=utf8
在本機資料庫中的DDL如下:
CREATE TABLE `book_price_local` ( `book_name` varchar(255) NOT NULL DEFAULT '', `book_price` decimal(11,3) NOT NULL DEFAULT '0.000') ENGINE=FEDERATED DEFAULT CHARSET=utf8 CONNECTION='mysql://root:password#@192.168.2.25:3306/my_test/book_price'#源端表DDL ENGINE=federated CONNECTION= 'mysql://使用者:密碼@IP地址:連接埠/庫名稱/表名稱';
這裡需要注意的是CONNECTION後則是遠端資料庫的串連資訊,這裡要注意的是避免使用帶‘@’的密碼以免混淆,效果如下:
MySQL的FEDERATED引擎實作類別Oracle的DBlink