MySQL 的 Federated 存储引擎允许在一个 MySQL 服务器上创建一个本地表,该表的数据实际存储在另一个远程 MySQL 服务器上。这使得可以在不同的 MySQL 实例之间建立连接,并在它们之间执行查询操作。
在数据库的实际使用中,通常会碰到跨库访问数据的需求。
针对这种情况,Oracle 数据库通过 DBlink 来解决这种问题,那么 MySQL 中有没有类似 DBlink 的功能呢?
答案是有!
MySQL 自带的 FEDERATED 引擎就可以实现跨库访问的功能,使得应用程序在不直接连接多个数据库的情况下,获取到多个库内的数据。
从 MySQL5.5 开始,默认会安装 FEDERATED 引擎,但是默认情况下该引擎不会启用,需要我们手动进行启用。
本篇只介绍 MySQL5.5 之后的版本,默认安装了 FEDERATED 引擎。
若安装的是 MySQL5.5 之前的版本,请自行百度将FEDERATED引擎安装上。
select version();
查询出的版本大于 MySQL5.5,应该是安装了 FEDERATED 引擎的,不过最好进一步确认下。
show engines;
FEDERATED 引擎已安装,只不是当前状态是 NO,并未启用。
在 MySQL 的安装文件中,找到 my.ini 配置文件,在 [mysqld] 下添加一行,并保存。
[mysqld]
federated
服务启动完成后,再次查询 FEDERATED 引擎的状态,发现已经启动成功
语法
CREATE TABLE (......)
ENGINE =FEDERATED CONNECTION='mysql://username:password@hostname:port/database/tablename'
情景
在 gushengbin 数据库中创建 FEDERATED 表。
create table stu(id int(11),name varchar(255))
engine = federated connection = 'mysql://lushencong:123456@192.168.64.141:3306/lushencong/stu';
执行 SQL 语句成功
select * from stu;
直接使用 CONNECTION 创建 FEDERATED 表有一个弊端,就是需要跨库访问多个表时,对于每个表都要指定一串长长的 CONNECTION。
所以为了简化这个过程,可以先创建 CREATE SERVER。
在 gushengbin 数据库中创建 CREATE SERVER(我试了下 gushengbin 的账号不行,应该是权限问题,使用了根账号 root 后就可以了)
--创建 CREATE SERVER
CREATE SERVER test_link
FOREIGN DATA WRAPPER mysql
OPTIONS (USER 'lushencong', PASSWORD '123456',HOST '192.168.64.141',PORT 3306,DATABASE 'lushencong');
--删除 CREATE SERVER
DROP SERVER test_link;
在 gushengbin 数据库中创建 FEDERATED 表
CREATE TABLE stu(id int(11),name varchar(255))
ENGINE = FEDERATED CONNECTION = 'test_link/stu';
执行 sql 语句成功
select * from stu;