FEDERATED将不同的Mysql服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用。FEDERATED是其中一个专门针对远程数据库的实现。一般情况下在本地数据库中建表会在数据库目录中生成相应的表定义文件,并同时生成相应的数据文件。通过FEDERATED引擎创建的表只是在本地有表定义文件,数据文件则存在于远程数据库中(这一点很重要)
默认情况下面,mysql是不启用该存储引擎的,如下
mysql> show engines;
从上面可以看到FEDERATED的Support是NO,说明没有启用,如果没有的话说明没有编译进去,需要重新安装,要像启用的话使Support为YES,可以在/etc/my.cnf加federated(在mysqld加),然后重启就可以启用
注意:本地创建的表必须在远程服务器存在,创建的字段也必须是远程表中的字段,可以比远程表的字段少,但是不能多,本地存储引擎选择:ENGINE =FEDERATED,
CONNECTION选项中的连接字符串的一般形式如下:scheme://user_name[:password]@host_name[:port_num]/db_name/tbl_name
还有一些连接字符串的例子:
CONNECTION='mysql://username:password@hostname:port/database/tablename'
CONNECTION='mysql://username@hostname/database/tablename'
CONNECTION='mysql://username:password@hostname/database/tablename'
1、在本地数据库上做如下操作
CREATE TABLE `federated_game_broker`(
`ID` int(11) NOT NULL AUTO_INCREMENT,
`brokerid` varchar(10) NOT NULL COMMENT '券商id',
`broker_name` varchar(20) NOT NULL COMMENT '名称',
`father_id` int(11) NOT NULL COMMENT '父ID',
`path` varchar(20) NOT NULL COMMENT 'id路径',
`remark` varchar(100) COMMENT '备注',
PRIMARY KEY (`ID`)
)
ENGINE=FEDERATED CHARSET=utf8 CONNECTION='mysql://dasai_fed:dasai_fed@172.31.1.98:3306/test/imc_game_broker';
2、在远程表上做操作
CREATE TABLE `imc_game_broker` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`brokerid` varchar(10) NOT NULL COMMENT '券商id',
`broker_name` varchar(20) NOT NULL COMMENT '名称',
`father_id` int(11) NOT NULL COMMENT '父ID',
`path` varchar(20) NOT NULL COMMENT 'id路径',
`remark` varchar(100) COMMENT '备注',
PRIMARY KEY (`ID`)
) EENGINE=InnoDB DEFAULT CHARSET=utf8;
3、在远程表所在的mysql数据库上添加一个账号
grant select on test.imc_game_broker to dasai_fed@'172.31.1.106' identified by 'daisai_fed';
4.操作2中的表数据,创建完成之后,你会神奇的发现你当前创建的这个表中已经有远程表里面的所有数据了。
注意:
- 对本地进行更新操作,本地和远程的数据都被更改了。
- federated存储引擎不支持alter table 操作。
- 删除本地表对远程表无影响
- federated存在安全隐患,采用connection string连接配置都是明文
- federated查询映射表耗时是远程连接访问耗时的5-500倍!