最后呢要给大家介绍的存储引擎呢,是Federated这种存储引擎,常常有人会问MYSQL是否像SQL Server服务器或者
ORACLE网关的功能,从MYSQL服务器本身来说呢,他并没有提供连接服务器这样的功能,像Federation这种存储引擎呢,
是存储引擎给我们这样的一个功能,Federated这种存储引擎,主要是提供不使用复制的情况下,在本地访问远程服务器
表的功能,由于Federated只是在本地建立一个到远程服务器的一个连接,可以说呢我们要访问表的所有数据呢,还是放在
远程服务器上面,在本地并不存储任何数据,每次访问Federated上面表的时候呢,查询都会发送到远程服务器上来执行,
并从远程的服务器上获取相关的数据,所以Federated表的第二个特点是,本地并不存储数据,数据全部放到远程服务器上面,
那么Federated这个表的第三个特点呢,虽然他不会在本地存储所访问的数据,但是还是需要保存远程MYSQL数据库表的结构
信息的,也就是说,在本地的Federated存储引擎表呢,同样需要存在一个FRM文件的,这里面有远程表结构信息,以及如何连接
远程表的结构信息
那么Federated这种存储引擎呢,可以实现连接SQL Server连接服务器的功能,但是由于其本身的性能并不太好,
而且通常可以通过复制等方式来实现相同的目的,所以在当前的MYSQL版本中呢,Federated这种引擎默认是禁止的,
想要使用这种引擎呢,我需要在我们使用时指定,Federated这个参数,我们可以通过命令确认一下,当前的MYSQL
服务器中呢,是否支持federated这种存储引擎,而在create table这种语句中呢,使用下面的连接字符串呢,就可以
指定要查询远程的MYSQL服务器的相关信息,相关的数据库表的一些信息,我们来看一下连接代表的参数是什么意思,
首先username和password,是本地连接远程MYSQL数据库服务器的用户和密码,也就是要使用federated引擎,我们需要
在远程的MYSQL服务器上呢,建立的一种相关的用户权限,这个我们在下面演示中我们就会看到,而host_name和端口号呢,
远程MYSQL的ip和端口号,db_name就是我们所要在本地要映射的远程MYSQL数据库的名字,table_name很简单了,我们要在
本地映射远程MYSQL服务器表的名字,这样说起来大家可能不太理解,演示一下federated引擎的使用
所以我们要演示一下federated这种引擎的使用,首先我们说明的一点是,现在是在一台MYSQL服务器上来
模拟,本地和远程的服务器,来给大家演示一下,federated引擎的使用,为了模拟呢,首先我们来看看当前这个实例是否是
支持federated引擎的
show engines;
这里大家可以看到,现在是不支持NO的状态,我们必须要在我们的MYSQL启动文件中呢,进行一下修改
vi my.cnf
首先加入federated引擎的支持,让他等于1,开启federated引擎的支持
这个时候我们要重启一下我们的mysql服务器了
mysqladmin shutdown
我们把它放在后台中运行
bin/mysqlid_safe --defaults-file=./my.cnf --user=mysql &
启动了MYSQL服务器,大家看到federated引擎已经被支持了
show engines;
现在我就为大家来演示一下,这种存储引擎如何来使用,为了在同一个实例上来给大家来演示呢,
我们需要建立两个库,首先一个库称之为local库,另一个库被称之为remote库,首先我们在远程库中建立一个表,
称之为remote,随便加一些列,varchar它是10,同时id列作为我们的主键,我们可以使用innodb存储引擎
我们来看一看远程表的表结构是什么样的
create table remote_fed(id int auto_increment not null,c1 varchar(10) not null default '',c2 char(10)
not null default '',primary key(id))engine=innodb;
show create table remote_fed\G
大家可以看到,我们在远程数据库中,remote_fed这种远程表,他实际上是使用了innodb这种存储引擎,同时呢我们在
这种表中呢,还需要插入一些数据,演示本地如何获取远程数据库的信息,比如c1列,c2列,我们随便插入一些数据就好,
insert into remote_fed(c1,c2) values('aaa','bbb'),('ccc','ddd'),('ddd','fff');
大家可以来看一下
select * from remote_fed;
如果想要使用federated引擎,必须在 远程数据库中建立一个权限,我们要给他select,update,insert,delete的权限,
我们就把这个用户的名字称之为fred_link,它是我们用来演示,在这台机器上进行访问就可以了,密码设置为123456就好,
现在已经完成了远程数据库访问的工作
grant select,update,insert,delete on remote.remote_fed to 'fred_link@127.0.0.1' identified by '123456'
我们现在来到fed_link服务器,模拟本地如何读取远程服务器上的演示的服务器上,同样刚才我们说过了,
我们要在本地服务器上保存远程服务器上表的结构,我们可以把刚才建的表拷贝下来
use local
唯一不同的大家要注意了,存储引擎要指定为federated存储引擎了,刚才知道,在远程数据库当中是innodb的,
还要我们如何连接到远程服务器的连接信息,就是我们刚才说的连接字符串,需要的比如说,用户名我们刚才创建好了,
fed_link,密码是123456,数据库IP就是我们刚才的实例了,只不过我们是跨了一个库而已,数据库是remote,表呢,
remote_fed,现在我们就创建了federate表
create table remote_fed(
id int(11) not null auto_increment,
c1 varchar(10) not null default '',
c2 char(10) not null default '',
primary key(id)
)engine=federated connection='mysql://fred_link:123456@127.0.0.1:3306/remote/remote_fed';
我们重新命名一下这个表名
rename table remote_fed to local_fed;
大家可以看到,就是在local服务器下建立的local_fed这个表
show create table local_fed\G
他使用存储引擎是federated存储引擎,同时连接到远程字符串,我们在本地在对这个表进行查询,看能否查询到
远程的数据,大家可以看到,和我们刚才远程插入的数据是完全一样的
select * from local.local_fed;
删除数据是否可以反映到远程的数据库上,我们把id等于2的数据删除,我们来查询一下远程数据库的表
delete from local.local_fed where id = 2;
use remote;
select * from remote_fed;
大家可以看到,id为2的那一列也被删除了,这就验证了刚才所说的federated引擎的一个功能,可以在本地数据库中操作
远程数据库中的库和表,同时呢我们来看一看,在我们的本地数据库下,是否存储了federated表的数据,刚才我们在讲解
federated表的特性的时候呢,讲解过在本地库中,它是不应该存储数据的,那么我们就来看一看,大家可以看到,本地库中
他只存储了一个frm文件,存储了一个远程数据库表中的一个结构,以及如何连接服务器表的一个文件
这里我们就介绍了完了federated表的特性和使用方法,同样呢,我们来看一看他的适用场景,
前面提到了连接远程服务器表的功能,可以访问远程服务器上的表,这看起来很方便,但是由于其实现方式的原因呢,
对于关联查询的查询处理起来会比较的慢,有时还会影响远程服务器的性能,所以这种表不适合在生产环境中,但是如果
只是为了满足偶尔的查询和分析使用的话呢,或是由DBA手动查询的话,以检查业务逻辑是否符合,这种情况下还是可以
使用的,所以我们说federated存储引擎呢