随着业务的复杂度不断的增加、数据库不断的切分,在分布式系统中往往一台或几台数据库并不能满足我们的需求,所以常常需要多台同时时用,而在平时需要通过其它服务器的数据库获取信息最为方便的就是数据链接,而比较常见的如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后则是远程数据库的连接信息,这里要注意的是避免使用带‘@’的密码以免混淆,效果如下: