文章目录
一、FEDERATED存储引擎
01、从5.1.26开始,默认MySQL不启用federated存储引擎,所以需要在my.cnf中加入federated选项
02、或是在命令行用–federated选项启动mysqld。
1.1、说明:
- mysql 提供了一个
类似Oracle中的数据库链接(DBLINK)功能
的存储引擎–FEDERATED
- 当我们创建一个以FEDERATED为存储引擎的表时,服务器在数据库目录只创建一个表定义文件。文件由表的名字开始,并有一个frm扩展名。无其它文件被创建,因为实际的数据在一个远程数据库上。这不同于为本地表工作的存储引擎的方式。
1.2、局限性
远程服务器必须是一个MySQL服务器
。- FEDERATED对其它数据库引擎的支持可能会在将来被添加,目前不支持其他数据库,跨服务器远程其他类型数据库可以采用创建远程连接服务器的方式
- FEDERATED表指向的远程表在你通过FEDERATED表
访问它之前必须存在
。 - 一个FEDERATED表指向另一个FEDERATED表是可能的,但是你必须小心
不要创建一个循环。
- 没有对事务的支持。
如果远程表已经改变,对FEDERATED引擎而言是没有办法知道的
。
a、这个的原因是因为这个表必须象数据文件一样工作,除了数据库其它任何都不会被写入。
b、如果有任何对远程数据库的改变,本地表中数据的完整性可能会被破坏。- FEDERATED存储引擎
支持
SELECT, INSERT, UPDATE, DELETE和索引。 - 它
不支持
ALTER TABLE, DROP TABLE或任何其它的数据定义语言语句。当前的实现不使用预先准备好的语句。 - 执行使用SELECT, INSERT, UPDATE和DELETE,但不用HANDLER。
FEDERATED表不能对查询缓存不起作用。
目前的局限性是这些。
这些限制中的一些在FEDERATED处理机的将来版本可能被消除。
1.3、跨服务的方式
- mysql的FEDERATED存储引擎
- oracle的dblink
- 创建远程连接服务器
- 大数据的presto,接管数据源,然后聚合分析
- fink cdc也是一种方案
二、开启FEDERATED存储引擎
1.1、查看存储引擎
- 存在的FEDERATED存储引擎就配置文件开启
- 不存在就安装
查看
show engines;
Support 的值有以下几个:
- YES 支持并开启
- DEFAULT 支持并开启, 并且为默认引擎
- NO 不支持
- DISABLED 支持,但未开启
如图:
1.1.1、不存在存储引擎-安装
federated是支持动态安装的
install plugin federated soname 'ha_federated.so';
注明:如果不行话,就重新编码安装mysql吧
1.2、开启存储引擎
在mysql的配置文件中加入federated,然后重启mysql
注意:要放在mysqld的模块下,放在其他模块下无法识别变量
如图:
可以登入,表示变量识别成功
查看存储引擎
yes表示开启成功
1.3、拓展mysql存储引擎对比
三、跨服务连接示例
FEDERATED存储引擎开启成功了
1.1、 目标:
本地mysql去链接云服务器的mysql
1.2、创建关系
注意:如果远程表已经改变,对FEDERATED引擎而言是没有办法知道的
要了解FEDERATED存储引擎的局限性,看本文1.2的说明
如果有任何对远程数据库的改变,本地表中数据的完整性可能会被破坏
建议:表名要见名知意,知道他是远程连接的表,就像下面的示例:link_xx_xx表
创建
-- 创建出结构一样的表,表名可以不一样
CREATE TABLE `link_yun_sys_user` (
`id` int(50) NOT NULL,
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
`update_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE = FEDERATED CONNECTION='mysql://root:root@81.1x.2xx.10:3306/testLink/sys_user'
-- 指定引擎为 FEDERATED
-- 指定用户名、密码、ip、端口、数据库、表
如图:
1.2.1、权限说明
如果数据库有做权限限制,比如用户权限,增删改查权限,要进行授权,才能进行操作
1.3、成功效果
1.4、增删改查
本地新增1条数据
INSERT INTO link_yun_sys_user(id,username,`password`,update_time) VALUES('2','lisi','8888',NOW());
云服务器查看
SELECT * FROM sys_user