前言:
在实际工作中,我们可能会遇到需要操作其他数据库实例的部分表,但又不想系统连接多库。此时我们就需要用到数据表映射。如同Oracle中的DBlink一般,使用过Oracle DBlink数据库链接的人都知道可以跨实例来进行数据查询,同样的,Mysql自带的FEDERATED引擎完美的帮我们解决了该问题。本篇文章介绍FEDERATED引擎的开启和使用。
进入mysql命令行,没有看到Federated,说明没有安装
mysql>show engines;
安装Federated
mysql> install plugin federated soname 'ha_federated.so';
查看有了Federated,但是是NO,说明没有开启
vi etc/my.cnf,加入一行federated,保存并退出
重启mysql服务
service mysqld restart
再次查看,已经是yes了
使用FEDERATED建表语句如下:
CREATE TABLE (......) ENGINE =FEDERATED CONNECTION='mysql://[name]:[pass]@[location]:[port]/[db-name]/[table-name]'
name--mysql用户名
pass--mysql密码
location--ip
port:端口号
db-name:数据库名
table-name:表名
PS:创建的表名和远程访问的表名可以不同。
FEDERATED使用总结
基于MySQL5.7.25版本,我在源端及目标端实验了多种DDL及DML,现简单总结如下,有兴趣的同学可以试试看。
目标端建表结构可以与源端不一样 推荐与源端结构一致
源端DDL语句更改表结构 目标端不会变化
源端DML语句目标端查询会同步
源端drop表 目标端结构还在但无法查询
目标端不能执行DDL语句
目标端执行DML语句 源端数据也会变化
目标端truncate表 源端表数据也会被清空
目标端drop表对源端无影响
5.FEDERATED引擎最佳实践
目前FEDERATED引擎使用范围还不多,若确实有跨实例访问的需求,建议做好规范,个人总结最佳实践如下:
源端专门创建只读权限的用户来供目标端使用。
目标端建议用CREATE SERVER方式创建FEDERATED表。
FEDERATED表不宜太多,迁移时要特别注意。
目标端应该只做查询使用,禁止在目标端更改FEDERATED表。
建议目标端表名及结构和源端保持一致。
源端表结构变更后 目标端要及时删除重建。
本公众号长期关注于数据库技术以及性能优化,故障案例分析,K8S技术知识分享,工作心得等主题,欢迎扫码关注。