如何使用MySQL的FEDERATED引擎(译自Oracle Blog,文末投票)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 很长一段时间,我从未遇到过任何使用FEDERATED表的系统。但最近,人们对FEDERATED表似乎更感兴趣。


很长一段时间,我从未遇到过任何使用FEDERATED表的系统。但最近,人们对FEDERATED表似乎更感兴趣。这与微服务的增长有关吗? 在微服务体系结构中,服务通常设计为小型、松散耦合且可独立部署。每个服务可能都有自己的数据库,这使访问和集成来自多个服务的数据变得困难。 FEDERATED引擎可以提供一种虚拟表,这种表可以从远程 MySQL 服务器访问数据。这允许您将来自不同服务的数据集成到单个数据库中,而无需复杂的复制方案或手工数据管理。 让我们来看看如何将FEDERATED存储引擎与MySQL 8.0一起使用。



01

架构


我们有 2 个 MySQL 服务器:

  • production
  • sales

production服务器有一个product表,其中包含所有产品的成本(购买价格)、销售的价格和库存数量,它还有一个保存供应商信息的supplier表。 sales服务器有order表,保存订单和客户的相关信息。 在production服务器中还有一个product_view视图,该视图仅允许访问我们要与销售人员共享的product表中的数据。 在sales服务器中还有一个product表,它是一个FEDERATED表,指向production服务器中的product_view视图:




02

Production中的表



这是production服务器中表的定义:

product表




CREATE TABLE `product` (  `id` int unsigned NOT NULL AUTO_INCREMENT,  `name` varchar(20) DEFAULT NULL,  `supplier_id` int unsigned DEFAULT NULL,  `purchase_cost` decimal(8,2) DEFAULT NULL,  `price` decimal(8,2) DEFAULT NULL,  `quantity` int NOT NULL DEFAULT '0',  PRIMARY KEY (`id`),  KEY `supplier_id` (`supplier_id`),  CONSTRAINT `product_ibfk_1` FOREIGN KEY (`supplier_id`) REFERENCES `supplier` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

supplier表



CREATE TABLE `supplier` (  `id` int unsigned NOT NULL AUTO_INCREMENT,  `name` varchar(30) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

product_view视图

这不是一张表,这是一个视图





CREATE ALGORITHM=UNDEFINED DEFINER=`msandbox`@`localhost`       SQL SECURITY DEFINER VIEW `product_view` ASselect `product`.`id` AS `id`,`product`.`name` AS `name`,       `product`.`price` AS `price`,       if((`product`.`quantity` > 0),'yes','no') AS `stock`from `product`

下面是视图中的字段类型:





desc product_view;+-------+--------------+------+-----+---------+-------+| Field | Type         | Null | Key | Default | Extra |+-------+--------------+------+-----+---------+-------+| id    | int unsigned | NO   |     | 0       |       || name  | varchar(20)  | YES  |     | NULL    |       || price | decimal(8,2) | YES  |     | NULL    |       || stock | varchar(3)   | NO   |     |         |       |+-------+--------------+------+-----+---------+-------+4 rows in set (0.00 sec)

这意味着从production服务器中,我们只想共享字段id, name, price和是否有存货,这是我们将使用FEDERATED表提供的信息。因此,FEDERATED表可以指向远程表,也可以指向视图。




03

Sales中的表


customer表



CREATE TABLE `customer` (  `id` int unsigned NOT NULL AUTO_INCREMENT,  `name` varchar(20) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

orders表


CREATE TABLE `orders` (  `id` int unsigned NOT NULL AUTO_INCREMENT,  `customer_id` int unsigned DEFAULT NULL,  `date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,  `status` enum('pending','confirmed','shipped','delivered','paid') DEFAULT NULL,  PRIMARY KEY (`id`),  KEY `customer_id` (`customer_id`),  CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

order_lines表




CREATE TABLE `order_lines` (  `id` int unsigned NOT NULL AUTO_INCREMENT,  `order_id` int unsigned NOT NULL,  `product_id` int unsigned NOT NULL,  `price` decimal(8,2) NOT NULL,  `quantity` int NOT NULL,  PRIMARY KEY (`id`),  KEY `order_id` (`order_id`),  CONSTRAINT `order_lines_ibfk_1` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`)) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

product表




CREATE TABLE `product` (  `id` int unsigned NOT NULL AUTO_INCREMENT,  `name` varchar(20) DEFAULT NULL,  `price` decimal(8,2) DEFAULT NULL,  `stock` varchar(3) DEFAULT NULL,  PRIMARY KEY (`id`)) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci   CONNECTION='remote/product_view'

上面的product表使用FEDERATED作为存储引擎,这里的字段类型和product_view的定义一致。 我们接着要创建创建远程服务器。



04

远程访问


从sales服务器访问production服务器上的product_view视图,我们首先需要在production服务器上创建一个专用用户:



create user remote_user identified by 'remoteme';grant select on production.product_view to remote_user;

这意味着用户 remote_user 将能够使用密码 remoteme 连接到production服务器,并且对product_view视图只有SELECT权限。 在sales服务器上,我们需要创建一个用于FEDERATED表的SERVER。我们已经在FEDERATED表的CONNECTION参数中订阅这个SERVER为remote。




create server 'remote' foreign data wrapper mysql options(user 'remote_user',         host '192.168.1.56', port 3306, password 'remoteme',         database 'production');


05

测试


现在,让我们在production服务器上造一些数据,然后查看product和product_view中的记录:



select * from product;+----+------------------+-------------+---------------+-------+----------+| id | name             | supplier_id | purchase_cost | price | quantity |+----+------------------+-------------+---------------+-------+----------+|  1 | dolphin keychain |           1 |          0.50 |  1.50 |       50 ||  2 | dolphin sickers  |           1 |          0.20 |  1.00 |       10 ||  3 | dolphin pens     |           2 |          1.00 |  2.00 |       10 |+----+------------------+-------------+---------------+-------+----------+3 rows in set (0.00 sec)
select * from product_view;+----+------------------+-------+-------+| id | name             | price | stock |+----+------------------+-------+-------+|  1 | dolphin keychain |  1.50 | yes   ||  2 | dolphin sickers  |  1.00 | yes   ||  3 | dolphin pens     |  2.00 | yes   |+----+------------------+-------+-------+3 rows in set (0.00 sec)

现在我们也可以尝试在sales服务器中查看product FEDERATED表中的记录:





select * from product;+----+------------------+-------+-------+| id | name             | price | stock |+----+------------------+-------+-------+|  1 | dolphin keychain |  1.50 | yes   ||  2 | dolphin sickers  |  1.00 | yes   ||  3 | dolphin pens     |  2.00 | yes   |+----+------------------+-------+-------+

如您所见,我们可以访问production服务器中product_view视图中的数据。例如,我们可以创建这样的订单:







start transaction;Query OK, 0 rows affected (0.00 sec)
insert into orders(customer_id, status) values (1,'pending');Query OK, 1 row affected (0.00 sec)
select * from orders;+----+-------------+---------------------+---------+| id | customer_id | date                | status  |+----+-------------+---------------------+---------+|  1 |           1 | 2023-03-07 13:04:05 | pending |+----+-------------+---------------------+---------+1 row in set (0.00 sec)
select last_insert_id() into @order_id;Query OK, 1 row affected (0.00 sec)
insert into order_lines (order_id, product_id, price, quantity) values (@order_id,1,(select price from product where id=1),2);Query OK, 1 row affected (0.00 sec)
insert into order_lines (order_id, product_id, price, quantity) values (@order_id,2,(select price from product where id=2),5);Query OK, 1 row affected (0.01 sec)
commit;Query OK, 0 rows affected (0.02 sec)
select * from order_lines;+----+----------+------------+-------+----------+| id | order_id | product_id | price | quantity |+----+----------+------------+-------+----------+|  1 |        1 |          1 |  1.50 |        2 ||  2 |        1 |          2 |  1.00 |        5 |+----+----------+------------+-------+----------+2 rows in set (0.00 sec)
select o.id, c.name as 'customer name', date, status, sum(price*quantity) tot  from orders o  join order_lines on order_lines.order_id=o.id  join customer c on c.id=customer_id group by o.id;+----+---------------+---------------------+---------+------+| id | customer name | date                | status  | tot  |+----+---------------+---------------------+---------+------+|  1 | Lenka corp    | 2023-03-07 13:04:05 | pending | 8.00 |+----+---------------+---------------------+---------+------+


06

结论


如您所见,使用FEDERATED引擎在MySQL服务器之间创建链接非常容易,当您需要从另一台服务器访问有限数量的数据并且不希望使用基于复制的解决方案时,这尤其有用。 我看到了FEDERATED引擎在微服务架构中的新机遇。MySQL的官方手册中有一整节专门介绍FEDERATED引擎:dev.mysql.com/doc/refman/8.0/en/federated-storage-engine.html

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
18天前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
49 9
|
2月前
|
存储 关系型数据库 MySQL
mysql 引擎概述
MySQL存储引擎是处理不同类型表操作的组件,InnoDB是最常用的默认引擎,支持事务、行级锁定和外键。MySQL采用插件式存储引擎架构,支持多种引擎,如MyISAM、Memory、CSV等,每种引擎适用于不同的应用场景。通过`SHOW ENGINES`命令可查看当前MySQL实例支持的存储引擎及其状态。选择合适的存储引擎需根据具体业务需求和引擎特性来决定。
|
3月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
690 18
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
3月前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
617 2
|
2月前
|
存储 关系型数据库 MySQL
mysql 8.0 的 建表 和八种 建表引擎实例
mysql 8.0 的 建表 和八种 建表引擎实例
31 0
|
2月前
|
Oracle 关系型数据库 MySQL
shell获取多个oracle库mysql库所有的表
请注意,此脚本假设你有足够的权限访问所有提到的数据库。在实际部署前,请确保对脚本中的数据库凭据、主机名和端口进行适当的修改和验证。此外,处理数据库操作时,务必谨慎操作,避免因错误的脚本执行造成数据损坏或服务中断。
43 0
|
4月前
|
Oracle 关系型数据库 MySQL
Mysql和Oracle数据库死锁查看以及解决
【8月更文挑战第11天】本文介绍了解决MySQL与Oracle数据库死锁的方法。MySQL可通过`SHOW ENGINE INNODB STATUS`查看死锁详情,并自动回滚一个事务解除死锁;也可手动KILL事务。Oracle则通过查询V$LOCK与V$SESSION视图定位死锁,并用`ALTER SYSTEM KILL SESSION`命令终止相关会话。预防措施包括遵循ACID原则、优化索引及拆分大型事务。
225 3
|
5月前
|
存储 SQL 关系型数据库
(十三)MySQL引擎篇:半道出家的InnoDB为何能替换官方的MyISAM?
MySQL是一款支持拔插式引擎的数据库,在开发过程中你可以根据业务特性,从支持的诸多引擎中选择一款适合的,例如MyISAM、InnoDB、Merge、Memory(HEAP)、BDB(BerkeleyDB)、Example、Federated、Archive、CSV、Blackhole.....
|
2月前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
192 64
|
12天前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
50 11

推荐镜像

更多
下一篇
DataWorks