MySQL常用存储引擎之Federated

最后呢要给大家介绍的存储引擎呢,是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存储引擎呢

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值