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


本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149177.htm






